MyBatis动态代理
一、项目结构

二、代码实现
import java.util.List;
import java.util.Map; import com.jmu.bean.Student; public interface IStudentDao {
void insertStudent(Student student);
void insertStudentCacheId(Student student);// 插入后获取
void deleteStudentById(int id);
void updateStudent(Student student);
List<Student> selectAllStudents();// 查询所有
/* Map<String,Object> selectAllStudentsMap(); */
Student selectStudentById(int id); // 根据id查询
List<Student> selectStudentsByName(String name);// 模糊查询
}
com.jmu.dao.IStudentDao
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.BasicConfigurator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import com.jmu.bean.Student;
import com.jmu.dao.IStudentDao;
import com.jmu.utils.MybatisUtils; public class MyTest {
private IStudentDao dao;
private SqlSession sqlSession; @Before
public void Before() {
sqlSession = MybatisUtils.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
BasicConfigurator.configure();
}
@After
public void after(){
if (sqlSession!=null) {
sqlSession.commit(); } }
@Test
public void test01() {
Student student = new Student("明明", 19, 87.9);
System.out.println("插入前:student=" + student);
dao.insertStudent(student);
System.out.println("插入后:student=" + student);
sqlSession.commit();
} // 插入后获取
@Test
public void test02() {
Student student = new Student("明明", 23, 99.5);
System.out.println("插入前:student=" + student);
dao.insertStudentCacheId(student);
System.out.println("插入后:student=" + student);
sqlSession.commit();
} @Test
public void test03() {
dao.deleteStudentById(25);
sqlSession.commit();
} @Test
public void test04() {
Student student = new Student("红酒", 23, 93.5);
student.setId(28);
dao.updateStudent(student);
sqlSession.commit();
} @Test
public void test05() {
List<Student> students = dao.selectAllStudents();
for (Student student : students) {
System.out.println(student);
}
} /*@Test
public void test06() {
Map<String, Object> map = dao.selectAllStudentsMap();
System.out.println(map.get("王维"));
}*/ @Test
public void test07() {
Student student = dao.selectStudentById(154);
System.out.println(student);
} @Test
public void test08() {
List<Student> students = dao.selectStudentsByName("明");
for (Student student : students) {
System.out.println(student);
} } }
com.jmu.test.MyTest
### Global logging configuration
log4j.logger.test=debug,console
##log4j.Logger.com.jmu.dao.IStudentDao=trace,console
### Uncomment for MyBatis logging
log4j.logger.org.apache.ibatis=ERROR log4j.logger.org.apache.ibatis.session.AutoMappingUnknownColumnBehavior=WARN ### Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n log4j.appender.lastEventSavedAppender=org.apache.ibatis.session.AutoMappingUnknownColumnBehaviorTest$LastEventSavedAppender
log4j.properties
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jmu.dao.IStudentDao">
<insert id="insertStudent" parameterType="Student">
insert into
student(name,age,score) values(#{name},#{age},#{score})
</insert> <insert id="insertStudentCacheId">
insert into student(name,age,score) values(#{name},#{age},#{score})
<selectKey resultType="int" keyProperty="id" order="AFTER">
select
@@identity
</selectKey>
</insert>
<delete id="deleteStudentById">
delete from student where id=#{XXX}<!--这里的#{} 仅仅是个占位符,里边放什么都行 -->
</delete>
<update id="updateStudent">
update student set
name=#{name},age=#{age},score=#{score} where id=#{id}
</update>
<select id="selectAllStudents" resultType="Student">
select
id,name,age,score from student
</select>
<select id="selectStudentById" resultType="Student">
select
id,name,age,score from student where id=#{JJJ}
</select>
<select id="selectStudentsByName" resultType="Student">
<!-- select id,name,age,score from student where name like CONCAT('%',#{XXX},'%') -->
<!-- select id,name,age,score from student where name like '%王二%' -->
<!-- select id,name,age,score from student where name like '%${value}%' --><!-- 不存在sql注入 风险,但是效率低 -->
select id,name,age,score from student where name like '%' #{XXX} '%'<!--常用 -->
</select>
</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动态代理生成Mapper代理类,讲解Mybatis核心原理
本文将通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis原理 1.平常我们是如何使用Mapper的 先写一个简单的UserMapper,它包含一个全表查询的方法,代码如下 pub ...
- MyBatis 动态代理开发
MyBatis 动态代理开发 § Mapper.xml文件中的namespace与mapper接口的类路径相同. § Mapper接口方法名和Mapper.xml中定义的每个statement的i ...
- Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法
为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...
- MyBatis动态代理执行原理
前言 大家使用MyBatis都知道,不管是单独使用还是和Spring集成,我们都是使用接口定义的方式声明数据库的增删改查方法.那么我们只声明一个接口,MyBatis是如何帮我们来实现SQL呢,对吗,我 ...
- Mybatis动态代理实现函数调用
如果我们要使用MyBatis进行数据库操作的话,大致要做两件事情: 1. 定义DAO接口 在DAO接口中定义需要进行的数据库操作. 2. 创建映射文件 当有了DAO接口后,还需要为该接口创建映射文件. ...
- Spring系列之Mybatis动态代理实现全过程?回答正确率不到1%
面试中,可能会问到Spring怎么绑定Mapper接口和SQL语句的.一般的答案是Spring会为Mapper生成一个代理类,调用的时候实际调用的是代理类的实现.但是如果被追问代理类实现的细节,很多同 ...
- MyBatis动态代理查询出错
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache. ...
- MyBatis总结三:使用动态代理实现dao接口
由于我们上一篇实现MyBatis的增删改查的接口实现类的方法都是通过sqlsession调用方法,参数也都类似,所以我们使用动态代理的方式来完善这一点 MyBatis动态代理生成dao的步骤: 编写数 ...
- Mybatis mapper动态代理的原理详解
在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出my ...
随机推荐
- StackExchange.Redis的使用 Redis五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...
- rpm打包过程
[需求] 接触那么久的Linux,还没有试验过怎么打rpm包 [过程] 1.rpm打包准备工作 系统默认的rpmbuild的相关路径
- [转]DBCC (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms188796.aspx Transact-SQL 编程语言提供 DBCC 语句以作为 SQL Server 的数据库 ...
- HTTPS 传输优化详解之动态 TLS Record Size
笔者在过去分析了诸多可以减少 HTTPS 传输延迟的方法,如分布式 Session 的复用: 启用 HSTS,客户端默认开启 HTTPS 跳转:采用 HTTP/2 传输协议:使用 ChaCha20-P ...
- java.lang.Collections
java.lang.Collections 此类完全由在collection上进行操作或返回 collection 的静态方法组成.也就是说Collections提供了对Collection集合操作的 ...
- 关于node的前端项目编译时内存溢出问题
最近在做一个基于vue 的多页面项目 , 页面n++多,编译时发生node内存溢出问题,继而百度之,得到解答,故记录之. '如图' 只需在 package.json 里面 加上 --max ...
- SQL---存储过程---存储过程编写案例
存储过程的创建和调用演示 1.不带参数的存储过程的创建 create procedure PRO_With_No_Param as Begin --begin可省略 select * from sc ...
- 用sort()按小到大排序的方法:
例子:function compare(value1,value2){ if(value1<value2){ return -1; }else if(value1==value2){ retur ...
- sublime3配置php环境
最后的演示效果: 1. 按照sublime3开始前的准备工作 Ctrl+Shift+P,再输入install ,最后再输入想要安装的软件 (输入install会有几十秒的延迟,请不要重复操作) 配置p ...
- SSH批量管理 expect自动交互
SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...