源码: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(动态代理)的更多相关文章

  1. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  2. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  3. java动态代理的2种实现方式

    java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...

  4. JDK动态代理实现原理

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:htt ...

  5. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  6. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  7. Java动态代理

    代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  8. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  9. 静态代理&动态代理

    原文地址:http://blog.csdn.net/partner4java/article/details/7048879 静态AOP和动态AOP. 静态代理: 代理对象与被代理对象必须实现同一个接 ...

随机推荐

  1. (2)Mac环境搭建

    创建HelloWorld项目 将刚才下载的压缩包解压到你指定的文件夹里. 进入到目录cocos2d-x-3.2alpha0/tools/cocos2d-console/bin/cocos.py 打开终 ...

  2. Eclipse自动提示

    在java的自动激活触发器里输入:abcdefghijklmnopqrstuvwxyz.

  3. c++第二十天

    p111~p114: 与旧代码的接口 1.C++程序中的C风格字符串:任何出现字符串字面值的地方都可以以空字符结束的字符数组来替代. const char str[] = {"Hello, ...

  4. 微信小程序:JS 交互逻辑

    微信小程序:JS 交互逻辑 一.JS 交互逻辑 一个服务仅仅只有界面展示是不够的,还需要和用户做交互:响应用户的点击.获取用户的位置等等.在小程序里边,我们就通过编写 JS 脚本文件来处理用户的操作. ...

  5. 清理tomcat日志大的文件

    先看一个命令: [root@weblogic logs]# catalina.--.log icatalina.--:-.out icatalina.--:-.out localhost_access ...

  6. linux下如何使用split

    答: 切割文件hello,以每个文件最大10MiB来切割,切割好的文件名前缀为hello.,后缀为二位的数字,切割之后的名字为hello.01,hello.02等等    split -b 10M - ...

  7. Linux环境下如何配置IP地址、MAC地址

    Linux环境下如何配置IP地址.MAC地址 1.配置IP地址 进入配置IP地址路径,进行修改即可 cd /etc/network vim interface 加入以下内容: iface eth0 i ...

  8. [SpringBoot] - 配置文件的多种形式及优先级

              学习两个注解: @PropertySource   @ImportResource  ↓   @ConfigurationProperties  与 @Bean 结合为属性赋值 与 ...

  9. 读书笔记:提高C++性能的编程技术

    Efficient C++ Performance Programming Techniques 第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到 ...

  10. 农历03__ZC

    代码,改自 农历01(http://www.cnblogs.com/cppskill/p/5930558.html) 1.main.cpp #include "Lunar_ZC.h" ...