Mybatis笔记 - Mapper动态代理开发方式

Posted 苏贺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis笔记 - Mapper动态代理开发方式相关的知识,希望对你有一定的参考价值。

       使用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查询部门信息

    image

(2)根据员工姓名模糊查询员工信息

    image

(3)添加员工信息

    image

(4)更新员工信息

    image

(5)根据id删除员工信息

    image-

以上是关于Mybatis笔记 - Mapper动态代理开发方式的主要内容,如果未能解决你的问题,请参考以下文章

02.MyBatis在DAO层开发使用的Mapper动态代理方式

Mybatis 笔记——动态代理增删改查

Mybatis框架中Mapper动态代理方式

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

MyBatis开发Dao层的两种方式(Mapper动态代理方式)

Mybatis实现Mapper动态代理方式