Mybatis笔记 - 原始Dao开发方法
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法。原始Dao的开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员需要 编写 Dao接口 和 Dao实现类,但对 SQL映射文件、pojo类、sqlMapConfig.xml等 配置文件 并不做改变。
一、映射文件
1、Emp.xml文件
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 }
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="SqlMap/Emp.xml"/> 25 </mappers> 26 </configuration>
二、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 }
2、DaoImp类
实现步骤:① 构造方法:在dao实现类的构造方法中注入SqlSessionFactory
② 方法体:在方法体内通过SqlSessionFactory创建SqlSession
1 package Dao; 2 //导入相关类 3 public class EmpDaoImp implements EmpDao { 4 5 private SqlSessionFactory sqlSessionFactory ; 6 // 在dao实现类的构造方法中注入注入SqlSessionFactory 7 public EmpDaoImp(SqlSessionFactory sqlSessionFactory) { 8 this.sqlSessionFactory = sqlSessionFactory; 9 } 10 11 @Override 12 public Emp findEmpById(int empno) { 13 //在方法体内通过SqlSessionFactory创建SqlSession 14 SqlSession sqlSession = sqlSessionFactory.openSession(); 15 Emp emp = null; 16 //使用finally语句,保证释放资源操作必须执行 17 try { 18 emp = sqlSession.selectOne("test.findEmpById",empno); 19 }finally { 20 sqlSession.close(); 21 } 22 return emp; 23 } 24 25 @Override 26 public List<Emp> findEmpByEmpname(String ename) { 27 SqlSession sqlSession = sqlSessionFactory.openSession(); 28 List<Emp> emp = null; 29 try { 30 emp = sqlSession.selectList("test.findEmpByEmpname",ename); 31 }finally { 32 sqlSession.close(); 33 } 34 return emp; 35 } 36 37 @Override 38 public int insertEmp(Emp emp) { 39 SqlSession sqlSession = sqlSessionFactory.openSession(); 40 int flag = 0; 41 try { 42 flag = sqlSession.insert("test.insertEmp",emp); 43 }finally{ 44 //必须提交,更新数据 45 sqlSession.commit(); 46 sqlSession.close(); 47 } 48 return flag; 49 } 50 51 @Override 52 public int deleteEmpById(int empno) { 53 SqlSession sqlSession = sqlSessionFactory.openSession(); 54 int flag = 0; 55 try { 56 flag = sqlSession.delete("test.deleteEmpById",empno); 57 }finally{ 58 //必须提交,更新数据 59 sqlSession.commit(); 60 sqlSession.close(); 61 } 62 return flag; 63 } 64 65 @Override 66 public int updateEmp(Emp emp) { 67 SqlSession sqlSession = sqlSessionFactory.openSession(); 68 int flag = 0; 69 try { 70 flag = sqlSession.update("test.updateEmp",emp); 71 }finally{ 72 //必须提交,更新数据 73 sqlSession.commit(); 74 sqlSession.close(); 75 } 76 return flag; 77 } 78 } 79
三、测试程序
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删除员工信息