MyBatis_Study_004(动态代理)
源码:https://github.com/carryLess/mbtsstd-004
0.readme
基于前几篇:dao的实现类基本煤气到什么作用
仅仅是通过SQLSession的相应API定位到mapper映射文件中指定id的sql语句,
所以此刻,我们将实现类去掉,直接定位到映射文件的sql语句,
这种对Dao的实现方式称为动态代理 此方式下需要注意:
1.映射文件mapper标签中的namespace属性为Dao的全限定类名
2.Dao接口中的方法名称要与mapper映射文件中sql标签的id一致
3.dao对象的获取通过SqlSession.getMapper(dao.class);
4.sqlSession.commit();注意添加
5.动态代理下系统只会调用selectOne()或者selectList()方法,不支持返回Map的方法
1.主配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- (以上)文件头在解压的文件夹中mybatis-3.4.4.pdf文件中搜索mybatis-3-config.dtd即可得到 -->
<configuration> <!-- 指定属性配置文件 -->
<properties resource="jdbc.properties" />
<!--
配置类的别名,我建议使用package这种写法
这样写会将该包中所有类的简单类名配置为别名,简单方便
,还有别的写法,自行google
-->
<typeAliases>
<package name="model" />
</typeAliases>
<!-- 配置MyBatis运行环境 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理 -->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="dao/mapper.xml"/>
<!--
实际开发中可能有多个映射文件,而其中sql标签的id相同时候,执行过程就会报错
我们可以根据mapper映射文件中的namespace属性来区分,调用时候用如下方式
namespace.id
-->
<!--
<mapper resource="dao/mapper2.xml"/>
-->
</mappers> </configuration>
2.映射文件
<?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="dao.IStudentDao">
<insert id="insertStudentByList">
insert into SStudent(sname,sage,score) values
<!-- 这里面的collection必须写成list -->
<foreach collection="list" separator="," item="stu">
(#{stu.name},#{stu.age},#{stu.score})
</foreach>
</insert> <!-- 使用别名 -->
<select id="selectById1" resultType="SStudent">
select sid id,sname name,sage age,score from sstudent where sid = #{xxx}
</select> <!-- 使用resultMap -->
<select id="selectById2" resultMap="sStudentMapper">
select sid,sname,sage,score from sstudent where sid = #{xxx}
</select> <!--
type:要映射的实体类
id:resultMap标签的id,用于select标签中resultMap属性
-->
<resultMap id="sStudentMapper" type="SStudent">
<id column="sid" property="id" />
<result column="sname" property="name" />
<result column="sage" property="age" />
</resultMap> <!-- 通过map接收多个参数 -->
<select id="selectByMap" resultMap="sStudentMapper">
select * from sstudent where sname like '%' #{nameCon} '%' and sage > #{ageCon}
</select> <select id="selectByCons" resultMap="sStudentMapper">
select * from sstudent where sname like '%' #{name} '%' and sage > #{age}
</select> </mapper>
3.dao接口
package dao; import model.SStudent;
import org.apache.ibatis.annotations.Param; import java.util.List;
import java.util.Map; /**
* Created by carryLess on 2017/11/29.
*/
public interface IStudentDao { /**
* 插入集合
* @param studentList
*/
void insertStudentByList(List<SStudent> studentList); /**
* 根据id查询1
* @param id
* @return
*/
SStudent selectById1(int id); /**
* 根据id查询2
* @param id
* @return
*/
SStudent selectById2(int id); /**
* 根据map查询 map中key为:nameCon和ageCon
* @param conMap
* @return
*/
List<SStudent> selectByMap(Map<String,Object> conMap); /**
* 多参数查询,其中@Param中的value是字段名称
* @param name
* @param age
* @return
*/
List<SStudent> selectByCons(@Param("name") String name, @Param("age") int age);
}
4.test
package test; import dao.IStudentDao;
import model.SStudent;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import utils.MyBatisUtils; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* Created by carryLess on 2017/11/29.
*/
public class MyTest {
private SqlSession sqlSession;
private IStudentDao dao; @Before
public void initDao(){
sqlSession = MyBatisUtils.getSqlSession();
dao = sqlSession.getMapper(IStudentDao.class);
} @After
public void over(){
if(sqlSession != null){
sqlSession.close();
}
} @Test
public void testInsertList(){
List<SStudent> sStudentList = new ArrayList<SStudent>();
for(int i = 20;i<22;i++){
SStudent sStudent = new SStudent();
sStudent.setSname("ls-"+i);
sStudent.setSage(25+i);
sStudent.setScore(90);
sStudentList.add(sStudent);
}
dao.insertStudentByList(sStudentList);
sqlSession.commit();
} @Test
public void testSelectById(){
SStudent sStudent = dao.selectById2(18);
System.out.println(sStudent);
} @Test
public void testSelectByMap(){
Map<String,Object> conMap = new HashMap<String,Object>();
conMap.put("nameCon","s");
conMap.put("ageCon",44);
List<SStudent> sStudentList = dao.selectByMap(conMap);
System.out.println(sStudentList);
} @Test
public void testSelectByCons(){
List<SStudent> sStudentList = dao.selectByCons("s", 44);
System.out.println(sStudentList);
} }
MyBatis_Study_004(动态代理)的更多相关文章
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- java动态代理的2种实现方式
java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...
- JDK动态代理实现原理
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:htt ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- Java动态代理
代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- 静态代理&动态代理
原文地址:http://blog.csdn.net/partner4java/article/details/7048879 静态AOP和动态AOP. 静态代理: 代理对象与被代理对象必须实现同一个接 ...
随机推荐
- 利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件
1. mybatis-generator-core-1.3.5.jar 下载地址:https://github.com/mybatis/generator/releases 2. msyql-conn ...
- Java的初始化与清理
大家都知道,Java是站在巨人的肩上成功的,它是在C&C++的基础上进一步的开发,投入面向对象开发的怀抱.Java吸取了很多以前的教训,加入自己很多独创的方式.在程序语言发展初期,许多C程序员 ...
- ubuntu 16.04+Anaconda+theano+keras安装【转】
本文转载自:https://blog.csdn.net/u013786021/article/details/78370138 安装软件部分浪费了好长时间才装好.之前一直各种问题,后来卸卸了radin ...
- POJ - 3254 Corn Fields(状压DP)题解
思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...
- 云主机搭建Kubernetes 1.10集群
一.基础环境 云主机 下载软件包 将所有软件下载至/data目录 # 链接:https://pan.baidu.com/s/13DlR1akNBCjib5VFaIjGTQ 密码:1l69 # 链接:h ...
- noip 2018 D1T3 赛道修建
noip 2018 D1T3 赛道修建 首先考虑二分答案,这时需要的就是对于一个长度求出能在树中选出来的最多的路径条数.考虑到一条路径是由一条向上的路径与一条向下的路径构成,或者仅仅是向上或向下的路径 ...
- js的原型继承
<script> //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 function Animal(name){ thi ...
- Redis之Sorted Set 有序集合
Redis Sorted Set 有序集合 Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分 ...
- [kata]数值内3和5的倍数的总和求解
这个题是这样的,方法参数接受一个数值,以3,5为基数,返回小于这个参数的3,5的倍数,加上3,5本身总和. 朋友段帅说头疼,估计是天气原因吧,好起来吧,还得战斗呢.
- php多站点配置以及Forbidden You don't have permission to access / on this server问题解决
php多站点配置以及Forbidden You don't have permission to access / on this server问题解决 一.总结 一句话总结:我的问题是php的版本问 ...