一、动态代理:

mybaits给咱们提供一套动态代理,我们只需要按他的要求写接口即可,mybatis帮做动态代理,相当于咱们写的接口的实现类。底层通过反射实例化代理对象,通过代理对象调用相应的方法,

执行相应的数据库语句。

接口:

 package jd.com.proxydao;

 import jd.com.mybaitstest.account;

 import java.io.IOException;
import java.util.List; public interface AccMapper {
List<account> selectDemo(String name) throws IOException;
void updateDemo(account ac) throws IOException;
}

mapper文件:

 <?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="jd.com.proxydao.AccMapper" >
<select id="selectDemo" resultType="jd.com.mybaitstest.account" parameterType="java.lang.String" > SELECT * FROM t_account WHERE NAME LIKE '%${value}%';
</select>
<insert id="updateDemo" parameterType="jd.com.mybaitstest.account"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID();
</selectKey>
INSERT INTO t_account(NAME ,money) VALUES(#{name},#{money});
</insert>
</mapper>

注意:

mapper文件和接口的对应的关系:

1)mapper文件的namespace的值和接口的相对路径一致。

2)mapper文件的id值和接口的方法的名字一致。

3)mapper的resultType的返回类型和对应的方法的返回值类型一致,没有resultType的话,那方法的返回值为void。

4)mapper文件的parameterType的参数类型和方法的参数类型一致。

5)mapper文件和接口需要在同一目录下。

需要注意:mapper文件和接口在同一个目录中!

测试代码:

 package jd.com.proxydao;

 import jd.com.mybaitstest.account;
import jd.com.Utils.session;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test; import java.io.IOException;
import java.util.List; public class TestDemo {
@Test
public void testdemo1() throws IOException {
SqlSession sqlSession=session.getSession();
AccMapper ac=sqlSession.getMapper(AccMapper.class);
List<account> acc1=ac.selectDemo("ok");
account acz=new account();
acz.setId();
acz.setMoney();
ac.updateDemo(acz);
sqlSession.commit();
sqlSession.close();
System.out.println("acc1 = " + acc1);
}
}

工具类:

 package jd.com.Utils;

 import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; public class session {
private static SqlSessionFactory sqlSessionFactory; public static SqlSession getSession(){
String resource="SqlMapConfig.xml";
try {
InputStream inp= Resources.getResourceAsStream(resource);
sqlSessionFactory= new SqlSessionFactoryBuilder().build(inp);
SqlSession sqlSession=sqlSessionFactory.openSession();
return sqlSession;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

问题汇总:

如果你使用的maven进行开发的时候,因为maven的资源目录:resources目录下。这是会抛出:

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): jd.com.proxydao.AccMapper.selectDemo 错误。

我们看下maven编译完打包的target目录:

没有我们写的AccMapper.xml,编译的时候没有把我们mapper文件编译进去。需要在pom.xml添加如下配置:

  <resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>

在次运行的时候我们看下:

我们mapper文件编译到相应的目录下面。

总结:

1)动态代理对象在调用sqlsession.selectone()和 sqlsession.seleclist(),是根据sql执行的返回值决定,如果返回值是list就用selectlist反之selectone。

2)mybaits官方推荐使用mapper代理方法来开发mapper接口,程序不用开发接口实现类。使用mapper接口,可以使用pojo对象来传入参数。

JAVA框架 Mybaits 动态代理的更多相关文章

  1. JAVA框架 Mybaits 动态sql

    动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ...

  2. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  3. 杨晓峰-Java核心技术-6 动态代理 反射 MD

    目录 第6讲 | 动态代理是基于什么原理? 典型回答 考点分析 知识扩展 反射机制及其演进 动态代理 精选留言 Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAnd ...

  4. 深度剖析java中JDK动态代理机制

    https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...

  5. JavaWeb_(Mybatis框架)Mapper动态代理开发_三

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  6. 一文读懂Java中的动态代理

    从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...

  7. 使用Java中的动态代理实现数据库连接池

    2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...

  8. java 笔记(3) —— 动态代理,静态代理,cglib代理

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

  9. java中的动态代理机制

    java中的动态代理机制 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现 ...

随机推荐

  1. 安装php扩展包

    sudo apt-get install php5-gd curl libcurl3 libcurl3-dev php5-curl 重启Apache sudo service apache2 rest ...

  2. Jquery 清除空白字符

    $.grep(“jQuery数组”, function(n) { return $.trim(n).length > 0; }); /*仅过滤空数组,不过滤相同数组*/

  3. cmd--命令短集

    查看ip地址:ipconfig 查看ip地址:ipconfig/all 进入c盘program files目录下:cd %Program Files%,”x:“, 进入x盘根目录.cd “ ”进入某文 ...

  4. 数据表自增Id获取时IDENTITY的正确使用方式

    在SQLServer中很多表主键会设置为自增列,有的业务需求需要知道新插入的自增Id是多少,一般我们会用SELECT @@IDENTITY来获取,可由于@@IDENTITY是个全局变量作用据较大,所以 ...

  5. webpack中mainifest.js vendor.js app.js 三者的区别

    场景: 大家在利用构建工具进行应用最后的打包过程中,我们希望做到的是将业务代码和第三方引用模块代码分开打包. 因为第三方引用模块代码通常很大,而且在不引入新的模块之前基本上是不会变动的.所以我们需要将 ...

  6. iftop 命令

    在Linux中有一个可以实施监控网络流量的一个工具那就是我们这次要说的iftop命令,这个命令不是系统自带的内置命令,在使用之前是需要先进行安装的 安装方式:yum -y install iftop就 ...

  7. 单表(SSM、SpringBoot、SpringCloud、Freemaker、BootStrap等)

    山门也有门门道道, 开发.测试.安卓...... 小子被纳入MIS小山峰,虽不及BOP势力庞大,高手如云, 仅寥寥七人, 却也于入小山峰之事乐趣至极. 前几日峰主布下一道新手任务, 制作一张单表并运行 ...

  8. 解决webview调用 goBack() 返回上一页自动刷新闪白的情况

    问题是:重写了onKeyDown()方法使其goBack(),但是遇到的问题是,每次进入webview再次返回原始页面的时候,中间会有一个闪白的出现. 试了好多网上的方法,发现都是扯淡. 后来意识到, ...

  9. windows10局域网实现文件共享

    1.共享文件夹设置: 磁盘文件夹,鼠标右键 选择高级共享 如图,自定义选项: 控制面板中添加新用户,一定给设置一个密码(远程登录时候用) 用户: * windows键+R * \\IP地址\目录 * ...

  10. Linux基础知识与基础命令

    Linux基础知识与基础命令 系统目录 Linux只有一个根目录,没有盘符的概念,文件目录是一个倒立的树形结构. 常用的目录功能 bin 与程序相关的文件 boot 与系统启动相关 cdrom 与Li ...