使用Mybatis開發Dao,通常有兩個方法,即原始Dao開發方法和Mapper接口開發方法。 Mapper接口開發方式是基於入門程序的基礎上,對 控制程序 進行分層開發,程序員只需要 編寫mapper接口 和 Mappe.xml 配置文件即可,程序員編寫mapper接口需要遵循一些開發規范,mybatis可以自動生成mapper接口實現類代理對象。
一、SQL配置文件
1、EmpMapper.xml
使用Mapper動態代理的方式開發時, 映射文件的namespace 必須為 Mapper接口文件 的全名。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="Mapper.EmpMapper"> 6 <!-- 根據id獲取員工信息 --> 7 <select id="findEmpById" parameterType="int" resultType="po.Emp"> 8 select * from emp where empno = #{empno} 9 </select> 10 11 <!-- 自定義條件查詢員工列表 --> 12 <select id="findEmpByEmpname" parameterType="java.lang.String" resultType="po.Emp"> 13 select * from emp where ename like '%${value}%' 14 </select> 15 16 <!-- 添加員工信息 --> 17 <insert id="insertEmp" parameterType="po.Emp"> 18 <selectKey keyProperty="empno" order="AFTER" resultType="java.lang.Integer"> 19 select LAST_INSERT_ID() 20 </selectKey> 21 insert into emp(ename,job) values(#{ename},#{job}) 22 </insert> 23 24 <!-- 刪除員工信息 --> 25 <delete id="deleteEmpById" parameterType="int"> 26 delete from emp where empno=#{empno} 27 </delete> 28 29 <!-- 更新員工信息 --> 30 <update id="updateEmp" parameterType="po.Emp"> 31 update emp set ename=#{ename},job=#{job} 32 where empno=#{empno} 33 </update> 34 </mapper>
2、pojo類
1 package po; 2 //導入相關類 3 public class Emp { 4 private int empno; 5 private String ename; 6 private String job; 7 private int mgr; 8 private Date hiredate; 9 private double sal; 10 private double comm; 11 private int deptno; 12 13 @Override 14 public String toString() { 15 return "編號:"+empno+" 姓名:"+ename+" 工作:"+job+"\n"; 16 } 17 set()/get()方法 ... 18 }
3、SqlMapConfig.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 和spring整合后 environments配置將廢除--> 7 <environments default="development"> 8 <environment id="development"> 9 <!-- 使用jdbc事務管理--> 10 <transactionManager type="JDBC" /> 11 <!-- 數據庫連接池--> 12 <dataSource type="POOLED"> 13 <property name="driver" value="com.mysql.jdbc.Driver" /> 14 <property name="url" value="jdbc:mysql://localhost:3306/ 15 scott?characterEncoding=utf-8" /> 16 <property name="username" value="root" /> 17 <property name="password" value="su486213" /> 18 </dataSource> 19 </environment> 20 </environments> 21 22 <!-- 加載映射文件 --> 23 <mappers> 24 <mapper resource="Mapper/EmpMapper.xml"/> 25 </mappers> 26 </configuration>
二、Dao層
1、開發規范
程序員編寫mapper接口需要遵循一些開發規范,mybatis可以自動生成mapper接口實現類代理對象。相關的開發規范如下:
① 在mapper.xml中namespace等於mapper接口地址
② 接口中的方法名和mapper.xml中statement的id一致
③ 接口中的方法輸入參數類型和mapper.xml中statement的parameterType指定的類型一致
④ 接口中的方法返回值類型和mapper.xml中statement的resultType指定的類型一致
總結:以上開發規范主要是對下邊的代碼進行統一生成:
1 //在方法體內通過SqlSessionFactory創建SqlSession 2 SqlSession sqlSession = sqlSessionFactory.openSession(); 3 //業務操作語句 4 Emp emp = sqlSession.selectOne("test.findEmpById",empno);
2、Mapper接口
1 package Mapper; 2 //導入相關類 3 public interface EmpMapper { 4 public Emp findEmpById(int empno); 5 public List<Emp> findEmpByEmpname(String tname); 6 public int insertEmp(Emp emp); 7 public int deleteEmpById(int empno); 8 public int updateEmp(Emp emp); 9 }
三、測試程序
1、Junit單元測試
1 package Test; 2 //導入相關類 3 public class Mybatis_Mapper { 4 5 //使用 單例模式 管理會話工廠 6 private SqlSessionFactory sqlSessionFactory; 7 @Before 8 public void createSqlSessionFactory() throws IOException { 9 // Mybatis配置文件 10 String resource = "SqlMapConfig.xml"; 11 // 得到配置文件流 12 InputStream inputStream = Resources.getResourceAsStream(resource); 13 // 創建會化工廠,傳入Mybatis配置文件信息 14 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 15 } 16 17 // 根據 id查詢部門信息 18 @Test 19 public void testFindEmpById() { 20 SqlSession sqlSession = sqlSessionFactory.openSession(); 21 //創建EmpMapper對象,mybatis自動生成mapper代理對象 22 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); 23 Emp emp = null; 24 25 try { 26 //調用empMapper的方法 27 emp = empMapper.findEmpById(7900); 28 }finally { 29 sqlSession.close(); 30 } 31 32 System.out.println(emp); 33 } 34 35 // 根據員工姓名模糊查詢員工信息 36 @Test 37 public void testFindEmpByEmpname() { 38 SqlSession sqlSession = sqlSessionFactory.openSession(); 39 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); 40 List<Emp> emp = null; 41 42 try { 43 //調用empMapper的方法 44 emp = empMapper.findEmpByEmpname("th"); 45 } 46 finally { 47 sqlSession.close(); 48 } 49 50 for(Emp e:emp) { 51 System.out.println(e); 52 } 53 } 54 55 // 添加員工信息 56 @Test 57 public void testInsert() { 58 SqlSession sqlSession = sqlSessionFactory.openSession(); 59 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); 60 Emp emp = new Emp(); 61 emp.setEname("admin"); 62 emp.setJob("admin"); 63 64 int flag = 0; 65 try { 66 flag = empMapper.insertEmp(emp); 67 }finally { 68 sqlSession.commit(); 69 sqlSession.close(); 70 } 71 72 if(flag == 1) { 73 System.out.println("自增主鍵值:"+emp.getEmpno()); 74 } 75 } 76 77 // 更新員工信息 78 @Test 79 public void testUpdate() { 80 SqlSession sqlSession = sqlSessionFactory.openSession(); 81 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); 82 Emp emp = new Emp(); 83 emp.setEmpno(7950); 84 emp.setEname("test7950"); 85 emp.setJob("test7950"); 86 87 int flag = 0; 88 try { 89 flag = empMapper.updateEmp(emp); 90 }finally { 91 sqlSession.commit(); 92 sqlSession.close(); 93 } 94 95 if(flag == 1) { 96 System.out.println("更新成功!"); 97 } 98 } 99 100 // 根據id刪除員工信息 101 @Test 102 public void testDelete() { 103 SqlSession sqlSession = sqlSessionFactory.openSession(); 104 EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class); 105 106 int flag = 0; 107 try { 108 flag = empMapper.deleteEmpById(7950); 109 }finally { 110 sqlSession.commit(); 111 sqlSession.close(); 112 } 113 114 if(flag == 1) { 115 System.out.println("刪除成功!"); 116 } 117 } 118 }
2、測試結果
(1)根據 id查詢部門信息
(2)根據員工姓名模糊查詢員工信息
(3)添加員工信息
(4)更新員工信息
(5)根據id刪除員工信息