user.java
package cn.itcast.mybatis.po;import java.util.Date;public class User {private int id;private String username;// 用戶姓名private String sex;// 性別private Date birthday;// 生日private String address;// 地址public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex+ ", birthday=" + birthday + ", address=" + address + "]";}}
uese.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空間,為了分類管理sql語句,對sql語句進行隔離,方便管理 ,在后面采用mapper開發dao這種方式時使用namespace有特殊作用... mapper代理開發時將namespace指定為mapper接口的全限定名--> <mapper namespace="test"> <!-- 在mapper.xml文件中配置很多的sql語句,每個sql語句封裝為一個MappedStatement對象 mapper.xml(就是這里的User.xml)--><!-- 根據id查詢用戶信息 --><!-- id:唯一標識 一個statement#{}:表示 一個占位符(?也表示一個占位符),如果#{}中傳入簡單類型的參數,#{}中的名稱隨意parameterType:輸入 參數的類型,通過#{}接收parameterType輸入 的參數resultType:輸出結果 類型,不管返回是多條還是單條,指定單條的pojo類型--><select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">SELECT * FROM USER WHERE id= #{id}</select><!-- 根據用戶名稱查詢用戶信息,可能返回多條,模糊查詢,${}:表示sql的拼接,通過${}接收參數,將參數的內容不加任何修飾拼接在sql中。--><select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">select * from user where username like '%${value}%'</select><!-- 添加用戶parameterType:輸入 參數的類型,User對象 包括 username,birthday,sex,address#{}是占位符可以把字符串的日期類型自動轉換為Date類型#{}接收pojo數據,可以使用OGNL解析出pojo的屬性值(OGNL對象導航語言,struts2可以使用OGNL,如果username是一個對象,則可以用#{username.name})#{username}表示從parameterType中獲取pojo的屬性值需求:user對象插入到數據庫后,新記錄的主鍵要通過user對象返回,這樣就可以通過user獲取主鍵值。解決思路:通過LAST_INSERT_ID()函數獲取剛插入記錄的自增主鍵值,selectKey:用于進行主鍵返回,里面定義了獲取主鍵值的sql,在insert語句執行后,執行select LAST_INSERT_ID()就可以獲取自增主鍵。order:設置selectKey中sql執行的順序,相對于insert語句來說,AFTER就是在insert語句執行后執行select LAST_INSERT_ID()keyProperty:將主鍵值設置到User對象的哪個屬性,resultType:select LAST_INSERT_ID()的結果 類型,就是要插入User對象的id屬性的類型,如果User對象的id屬性是string則這里就是String。--><insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"><selectKey keyProperty="id" order="AFTER" resultType="int">select LAST_INSERT_ID() <!-- 這條語句可以直接在sqldevelop運行 --></selectKey>INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})</insert><!-- mysql的uuid生成主鍵 --><!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"><selectKey keyProperty="id" order="BEFORE" resultType="string">select uuid() <!-- 這條語句可以直接在sqldevelop運行</selectKey>INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})</insert> --><!-- oracle在執行insert之前執行select 序列.nextval() from dual取出序列最大值((select 序列.nextval()得到oracle的序列值),將值設置到user對象 的id屬性--><!-- <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"><selectKey keyProperty="id" order="BEFORE" resultType="int">select 序列.nextval() from dual <!-- 這條語句可以直接在sqldevelop運行 --></selectKey>INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})</insert> --><!-- 用戶刪除 --><delete id="deleteUser" parameterType="int">delete from user where id=#{id}</delete><!-- 用戶更新 要求:傳入的user對象中包括 id屬性值--><update id="updateUser" parameterType="cn.itcast.mybatis.po.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}</update></mapper>
SqlMapConfig.xml
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 屬性定義加載一個properties文件在 properties標簽 中配置屬性值--><properties resource="db.properties"><!-- <property name="" value=""/> --></properties><!-- 定義 別名 --><typeAliases><!--單個別名的定義alias:別名,type:別名映射的類型 --><!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> --><!-- 批量別名定義指定包路徑,自動掃描包下邊的pojo,定義別名,別名默認為類名(首字母小寫或大寫)--><package name="cn.itcast.mybatis.po"/></typeAliases><!-- 和spring整合后 environments配置將廢除--><environments default="development"><environment id="development"><!-- 使用jdbc事務管理--><transactionManager type="JDBC" /><!-- 數據庫連接池--><dataSource type="POOLED"><!-- 數據庫連接參數 --><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加載mapper映射如果將和spring整合后,可以使用整合包中提供的mapper掃描器,此處的mappers不用配置了。--><mappers><!-- resource是classpath,通過resource加載mapper的映射文件 --><mapper resource="sqlmap/User.xml" /><!-- <mapper resource="mapper/UserMapper.xml" /> --><!-- 通過class引用mapper接口 class:配置mapper接口全限定名要求:需要mapper.xml和mapper.java同名并且在一個目錄 中--><!-- <mapper class="cn.itcast.mybatis.mapper.UserMapper"/> --><!-- 批量mapper配置 通過package進行自動掃描包下邊的mapper接口,要求:需要mapper.xml和mapper.java同名并且在一個目錄 中--><package name="cn.itcast.mybatis.mapper"/></mappers></configuration>
Test.java
package cn.itcast.mybatis.first;import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List;import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test;import cn.itcast.mybatis.po.User;public class MybatisFirst {// 會話工廠private SqlSessionFactory sqlSessionFactory;// 創建工廠@Before //before注解public void init() throws IOException {// 配置文件(SqlMapConfig.xml)String resource = "SqlMapConfig.xml";// 加載配置文件到輸入 流InputStream inputStream = Resources.getResourceAsStream(resource);// 創建會話工廠sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}// 測試根據id查詢用戶(得到單條記錄) @Testpublic void testFindUserById() {// 通過sqlSessionFactory創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();// 通過sqlSession操作數據庫// 第一個參數:statement的位置,等于namespace+statement的id// 第二個參數:傳入的參數//返回userUser user = null;try {user = sqlSession.selectOne("test.findUserById", 2);} catch (Exception e) {e.printStackTrace();} finally {// 關閉sqlSession sqlSession.close();}System.out.println(user);}// 測試根據id查詢用戶(得到單條記錄) @Testpublic void testFindUserByName() {// 通過sqlSessionFactory創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();// 通過sqlSession操作數據庫// 第一個參數:statement的位置,等于namespace+statement的id// 第二個參數:傳入的參數List<User> list = null;try {list = sqlSession.selectList("test.findUserByName", "小明");} catch (Exception e) {e.printStackTrace();} finally {// 關閉sqlSession sqlSession.close();}System.out.println(list.get(0).getUsername());}// 測試根據id查詢用戶(得到單條記錄) @Testpublic void testInsertUser() {// 通過sqlSessionFactory創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();// 通過sqlSession操作數據庫// 創建插入數據對象User user = new User();user.setUsername("浪子燕青");user.setAddress("河南鄭州");user.setBirthday(new Date());user.setSex("1");try {sqlSession.insert("test.insertUser", user);// 因為沒有設置成自動提交,所以需要提交事務,以后與spring 自動整合之后通過spring管理這些類就自動提交了。//調試的時候把myeclips編譯好的控制臺打印的sql語句放入sqlserver軟件中進行手動調試 sqlSession.commit();} catch (Exception e) {e.printStackTrace();} finally {// 關閉sqlSession sqlSession.close();}//打印主鍵,比如2個表關聯,把副表插入數據庫之后把外鍵插入主表中//不用<selectKey/>就沒有主鍵id返回(此時id為null),//需求:user對象插入到數據庫后,新記錄的主鍵要通過user對象返回,這樣就可以通過user獲取主鍵值。System.out.println("用戶的id=" + user.getId());}// 測試根據id刪除用戶(得到單條記錄) @Testpublic void testDeleteUser() {// 通過sqlSessionFactory創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();// 通過sqlSession操作數據庫try {sqlSession.delete("test.deleteUser", 35);// 需要提交事務 sqlSession.commit();} catch (Exception e) {e.printStackTrace();} finally {// 關閉sqlSession sqlSession.close();}}// 測試根據id更新用戶(得到單條記錄) @Testpublic void testUpdateUser() {// 通過sqlSessionFactory創建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession();// 通過sqlSession操作數據庫// 創建更新數據對象,要求必須包括 idUser user = new User();user.setId(35);user.setUsername("燕青");user.setAddress("河南鄭州"); // user.setBirthday(new Date());user.setSex("1");try {sqlSession.update("test.updateUser", user);// 需要提交事務 sqlSession.commit();} catch (Exception e) {e.printStackTrace();} finally {// 關閉sqlSession sqlSession.close();}System.out.println("用戶的id=" + user.getId());}}
?