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-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM