使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。原始Dao的开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员需要 编写 Dao接口 和 Dao实现类,但对 SQL映射文件、pojo类、sqlMapConfig.xml等 配置文件 并不做改变。
一、映射文件
1、SQL映射
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="test"> 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 }
二、Dao层
1、Dao类
1 package Dao; 2 //导入相关类 3 public interface EmpDao { 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 package Dao; 2 //导入相关类 3 public class EmpDaoImp implements EmpDao { 4 private SqlSessionFactory sqlSessionFactory ; 5 6 // 在dao实现类的构造方法中注入注入SqlSessionFactory 7 public EmpDaoImp(SqlSessionFactory sqlSessionFactory) { 8 this.sqlSessionFactory = sqlSessionFactory; 9 } 10 11 @Override 12 public Emp findEmpById(int empno) { 13 SqlSession sqlSession = sqlSessionFactory.openSession(); 14 Emp emp = null; 15 //使用finally语句,保证释放资源操作必须执行 16 try { 17 emp = sqlSession.selectOne("test.findEmpById",empno); 18 }finally { 19 sqlSession.close(); 20 } 21 return emp; 22 } 23 24 @Override 25 public List<Emp> findEmpByEmpname(String ename) { 26 SqlSession sqlSession = sqlSessionFactory.openSession(); 27 List<Emp> emp = null; 28 try { 29 emp = sqlSession.selectList("test.findEmpByEmpname",ename); 30 }finally { 31 sqlSession.close(); 32 } 33 return emp; 34 } 35 36 @Override 37 public int insertEmp(Emp emp) { 38 SqlSession sqlSession = sqlSessionFactory.openSession(); 39 int flag = 0; 40 try { 41 flag = sqlSession.insert("test.insertEmp",emp); 42 }finally{ 43 //必须提交,更新数据 44 sqlSession.commit(); 45 sqlSession.close(); 46 } 47 return flag; 48 } 49 50 @Override 51 public int deleteEmpById(int empno) { 52 SqlSession sqlSession = sqlSessionFactory.openSession(); 53 int flag = 0; 54 try { 55 flag = sqlSession.delete("test.deleteEmpById",empno); 56 }finally{ 57 //必须提交,更新数据 58 sqlSession.commit(); 59 sqlSession.close(); 60 } 61 return flag; 62 } 63 64 @Override 65 public int updateEmp(Emp emp) { 66 SqlSession sqlSession = sqlSessionFactory.openSession(); 67 int flag = 0; 68 try { 69 flag = sqlSession.update("test.updateEmp",emp); 70 }finally{ 71 //必须提交,更新数据 72 sqlSession.commit(); 73 sqlSession.close(); 74 } 75 return flag; 76 } 77 }
三、测试程序
1、Junit单元测试
1 package Test; 2 //导入相关类 3 public class Mybatis_Dao { 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 EmpDaoImp empDaoImp = new EmpDaoImp(sqlSessionFactory); 21 Emp emp = empDaoImp.findEmpById(7369); 22 System.out.println(emp); 23 } 24 25 // 根据员工姓名模糊查询员工信息 26 @Test 27 public void testFindEmpByEmpname() { 28 EmpDaoImp empDaoImp = new EmpDaoImp(sqlSessionFactory); 29 List<Emp> emp = empDaoImp.findEmpByEmpname("th"); 30 for(Emp e:emp) { 31 System.out.println(e); 32 } 33 } 34 35 // 添加员工信息 36 @Test 37 public void testInsert() { 38 EmpDaoImp empDaoImp = new EmpDaoImp(sqlSessionFactory); 39 Emp emp = new Emp(); 40 emp.setEname("test"); 41 emp.setJob("test"); 42 int flag = empDaoImp.insertEmp(emp); 43 System.out.println("自增主键值:"+emp.getEmpno()); 44 } 45 46 // 更新员工信息 47 @Test 48 public void testUpdate() { 49 EmpDaoImp empDaoImp = new EmpDaoImp(sqlSessionFactory); 50 Emp emp = new Emp(); 51 emp.setEmpno(7946); 52 emp.setEname("test7946"); 53 emp.setJob("test7946"); 54 int flag = empDaoImp.updateEmp(emp); 55 if(flag == 1) 56 System.out.println("更新成功!"); 57 } 58 59 // 根据id删除员工信息 60 @Test 61 public void testDelete() { 62 EmpDaoImp empDaoImp = new EmpDaoImp(sqlSessionFactory); 63 int flag = empDaoImp.deleteEmpById(7946); 64 if(flag == 1) 65 System.out.println("删除成功!"); 66 } 67 }
2、测试结果、
(1)根据 id查询部门信息
(2)根据员工姓名模糊查询员工信息
(3)添加员工信息
(4)更新员工信息
(5)根据id删除员工信息