MyBatis动态代理

Posted hoje

tags:

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

一、项目结构

 

二、代码实现

 1 import java.util.List;
 2 import java.util.Map;
 3 
 4 import com.jmu.bean.Student;
 5 
 6 public interface IStudentDao {
 7     void insertStudent(Student student);
 8     void insertStudentCacheId(Student student);// 插入后获取
 9     void deleteStudentById(int id);
10     void updateStudent(Student student);
11     List<Student> selectAllStudents();// 查询所有
12     /* Map<String,Object> selectAllStudentsMap(); */
13     Student selectStudentById(int id); // 根据id查询
14     List<Student> selectStudentsByName(String name);// 模糊查询
15 }
com.jmu.dao.IStudentDao
 1 import java.util.List;
 2 import org.apache.ibatis.session.SqlSession;
 3 import org.apache.log4j.BasicConfigurator;
 4 import org.junit.After;
 5 import org.junit.Before;
 6 import org.junit.Test;
 7 
 8 import com.jmu.bean.Student;
 9 import com.jmu.dao.IStudentDao;
10 import com.jmu.utils.MybatisUtils;
11 
12 public class MyTest {
13     private IStudentDao dao;
14     private SqlSession sqlSession;
15 
16     @Before
17     public void Before() {
18         sqlSession = MybatisUtils.getSqlSession();
19         dao = sqlSession.getMapper(IStudentDao.class);
20         BasicConfigurator.configure();
21     }
22   @After
23   public void after(){
24       if (sqlSession!=null) {
25           sqlSession.commit();
26         
27     }
28       
29   }
30     @Test
31     public void test01() {
32         Student student = new Student("明明", 19, 87.9);
33         System.out.println("插入前:student=" + student);
34         dao.insertStudent(student);
35         System.out.println("插入后:student=" + student);
36         sqlSession.commit();
37     }
38 
39     // 插入后获取
40     @Test
41     public void test02() {
42         Student student = new Student("明明", 23, 99.5);
43         System.out.println("插入前:student=" + student);
44         dao.insertStudentCacheId(student);
45         System.out.println("插入后:student=" + student);
46         sqlSession.commit();
47     }
48 
49     @Test
50     public void test03() {
51         dao.deleteStudentById(25);
52         sqlSession.commit();
53     }
54 
55     @Test
56     public void test04() {
57         Student student = new Student("红酒", 23, 93.5);
58         student.setId(28);
59         dao.updateStudent(student);
60         sqlSession.commit();
61     }
62 
63     @Test
64     public void test05() {
65         List<Student> students = dao.selectAllStudents();
66         for (Student student : students) {
67             System.out.println(student);
68         }
69     }
70 
71     /*@Test
72     public void test06() {
73         Map<String, Object> map = dao.selectAllStudentsMap();
74         System.out.println(map.get("王维"));
75     }*/
76 
77     @Test
78     public void test07() {
79         Student student = dao.selectStudentById(154);
80         System.out.println(student);
81     }
82 
83     @Test
84     public void test08() {
85         List<Student> students = dao.selectStudentsByName("明");
86         for (Student student : students) {
87             System.out.println(student);
88         }
89 
90     }
91 
92 }
com.jmu.test.MyTest
 1 ### Global logging configuration
 2 log4j.logger.test=debug,console
 3 ##log4j.Logger.com.jmu.dao.IStudentDao=trace,console
 4 ### Uncomment for MyBatis logging
 5 log4j.logger.org.apache.ibatis=ERROR
 6 
 7 log4j.logger.org.apache.ibatis.session.AutoMappingUnknownColumnBehavior=WARN
 8 
 9 ### Console output...
10 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
11 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
12 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
13 
14 log4j.appender.lastEventSavedAppender=org.apache.ibatis.session.AutoMappingUnknownColumnBehaviorTest$LastEventSavedAppender
log4j.properties
 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="com.jmu.dao.IStudentDao">
 6     <insert id="insertStudent" parameterType="Student">
 7         insert into
 8         student(name,age,score) values(#{name},#{age},#{score})
 9     </insert>
10 
11     <insert id="insertStudentCacheId">
12         insert into student(name,age,score) values(#{name},#{age},#{score})
13         <selectKey resultType="int" keyProperty="id" order="AFTER">
14             select
15             @@identity
16         </selectKey>
17     </insert>
18     <delete id="deleteStudentById">
19         delete from student where id=#{XXX}<!--这里的#{} 仅仅是个占位符,里边放什么都行 -->
20     </delete>
21     <update id="updateStudent">
22         update student set
23         name=#{name},age=#{age},score=#{score} where id=#{id}
24     </update>
25     <select id="selectAllStudents" resultType="Student">
26         select
27         id,name,age,score from student
28     </select>
29     <select id="selectStudentById" resultType="Student">
30         select
31         id,name,age,score from student where id=#{JJJ}
32     </select>
33     <select id="selectStudentsByName" resultType="Student">
34         <!-- select id,name,age,score from student where name like CONCAT(\'%\',#{XXX},\'%\') -->
35         <!-- select id,name,age,score from student where name like \'%王二%\' -->
36         <!-- select id,name,age,score from student where name like \'%${value}%\'  --><!-- 不存在sql注入 风险,但是效率低 -->
37         select id,name,age,score from student where name like \'%\' #{XXX} \'%\'<!--常用 -->
38     </select>
39 </mapper>
/mybatis4-mapperDynamicProxy/src/com/jmu/dao/mapper.xml

 

输出:

插入前:student=Student [id=null, name=明明, score=87.9, age=19]
0 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent  - ==>  Preparing: insert into student(name,age,score) values(?,?,?) 
56 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent  - ==> Parameters: 明明(String), 19(Integer), 87.9(Double)
57 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent  - <==    Updates: 1
插入后:student=Student [id=null, name=明明, score=87.9, age=19]
插入前:student=Student [id=null, name=明明, score=99.5, age=23]
82 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId  - ==>  Preparing: insert into student(name,age,score) values(?,?,?) 
82 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId  - ==>  Preparing: insert into student(name,age,score) values(?,?,?) 
83 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId  - ==> Parameters: 明明(String), 23(Integer), 99.5(Double)
83 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId  - ==> Parameters: 明明(String), 23(Integer), 99.5(Double)
85 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId  - <==    Updates: 1
85 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId  - <==    Updates: 1
88 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId!selectKey  - ==>  Preparing: select @@identity 
88 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId!selectKey  - ==>  Preparing: select @@identity 
88 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId!selectKey  - ==> Parameters: 
88 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId!selectKey  - ==> Parameters: 
126 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId!selectKey  - <==      Total: 1
126 [main] DEBUG com.jmu.dao.IStudentDao.insertStudentCacheId!selectKey  - <==      Total: 1
插入后:student=Student [id=165, name=明明, score=99.5, age=23]
145 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - ==>  Preparing: delete from student where id=? 
145 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - ==>  Preparing: delete from student where id=? 
145 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - ==>  Preparing: delete from student where id=? 
145 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - ==> Parameters: 25(Integer)
145 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - ==> Parameters: 25(Integer)
145 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - ==> Parameters: 25(Integer)
146 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - <==    Updates: 0
146 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - <==    Updates: 0
146 [main] DEBUG com.jmu.dao.IStudentDao.deleteStudentById  - <==    Updates: 0
162 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==>  Preparing: update student set name=?,age=?,score=? where id=? 
162 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==>  Preparing: update student set name=?,age=?,score=? where id=? 
162 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==>  Preparing: update student set name=?,age=?,score=? where id=? 
162 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==>  Preparing: update student set name=?,age=?,score=? where id=? 
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==> Parameters: 红酒(String), 23(Integer), 93.5(Double), 28(Integer)
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==> Parameters: 红酒(String), 23(Integer), 93.5(Double), 28(Integer)
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==> Parameters: 红酒(String), 23(Integer), 93.5(Double), 28(Integer)
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - ==> Parameters: 红酒(String), 23(Integer), 93.5(Double), 28(Integer)
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - <==    Updates: 0
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - <==    Updates: 0
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - <==    Updates: 0
163 [main] DEBUG com.jmu.dao.IStudentDao.updateStudent  - <==    Updates: 0
181 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==>  Preparing: select id,name,age,score from student 
181 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==>  Preparing: select id,name,age,score from student 
181 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==>  Preparing: select id,name,age,score from student 
181 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==>  Preparing: select id,name,age,score from student 
181 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==>  Preparing: select id,name,age,score from student 
182 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==> Parameters: 
182 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==> Parameters: 
182 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==> Parameters: 
182 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==> Parameters: 
182 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - ==> Parameters: 
188 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - <==      Total: 8
188 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - <==      Total: 8
188 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - <==      Total: 8
188 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - <==      Total: 8
188 [main] DEBUG com.jmu.dao.IStudentDao.selectAllStudents  - <==      Total: 8
Student [id=157, name=明明, score=87.9, age=19]
Student [id=158, name=明明, score=87.9, age=19]
Student [id=159, name=明明, score=87.9, age=19]
Student [id=160, name=明明, score=87.9, age=19]
Student [id=162, name=明明, score=87.9, age=19]
Student [id=163, name=明明, score=99.5, age=23]
Student [id=164, name=明明, score=87.9, age=19]
Student [id=165, name=明明, score=99.5, age=23]
206 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
206 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
206 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
206 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
206 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
206 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==>  Preparing: select id,name,age,score from student where id=? 
207 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 157(Integer)
207 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 157(Integer)
207 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 157(Integer)
207 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 157(Integer)
207 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 157(Integer)
207 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - ==> Parameters: 157(Integer)
211 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
211 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
211 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
211 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
211 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
211 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById  - <==      Total: 1
Student [id=157, name=明明, score=87.9, age=19]
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
247 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==>  Preparing: select id,name,age,score from student where name like \'%\' ? \'%\' 
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
253 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - ==> Parameters: 明(String)
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
262 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentsByName  - <==      Total: 8
Student [id=157, name=明明, score=87.9, age=19]
Student [id=158, name=明明, score=87.9, age=19]
Student [id=159, name=明明, score=87.9, age=19]
Student [id=160, name=明明, score=87.9, age=19]
Student [id=162, name=明明, score=87.9, age=19]
Student [id=163, name=明明, score=99.5, age=23]
Student [id=164, name=明明, score=87.9, age=19]
Student [id=165, name=明明, score=99.5, age=23]
output

 

以上是关于MyBatis动态代理的主要内容,如果未能解决你的问题,请参考以下文章

mybatis学习(39):动态sql片段

MyBatis动态SQL标签用法

Mybatis——Dao层实现映射文件深入核心配置文件深入

MyBatis之Mapper动态代理

mybatis源码分析之04Mapper接口的动态代理

mybatis动态sql片段与分页,排序,传参的使用