Mybatis 之动态代理

使用Mybatis 开发Web 工程时,通过Mapper 动态代理机制,可以只编写接口以及方法的定义。

如下:

定义db.properties

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger

定义SqlMapConfig.xml

<?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">
<configuration>
    <!--引入外部 db.properties-->
    <properties resource="db.properties"/>

    <!--配置Oracle 数据库信息-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/mapper/UserInfo.xml"/>
        <mapper resource="com/mapper/BatchCustomerOneToOne.xml"/>
        <mapper resource="com/mapper/BatchCustomerOneToMany.xml"/>
        <mapper resource="com/mapper/BatchCustomerManyToMany.xml"/>
        <mapper resource="com/mapper/DelayedLoading.xml"/>
        <mapper resource="com/service/impl/BatchCustomerMapper.xml"/>
    </mappers>
</configuration>

定义一个Mapper 接口:

package com.service.impl;

import com.entity.onetoonebyresultMap.Customer;

/**
 * @author 王立朝
 * @version 1.0
 * @description Mapper 动态代理类
 * * @date 2019/1/24
 **/
public interface BatchCustomerMapper {
    Customer findOneCustomerById(Integer integer);
}

定义Customer 实体类

package com.entity.onetoonebyresultMap;

/**
 * @author 王立朝
 * @version 1.0
 * @description com.entity.onetoonebyresultMap
 * @date 2019/1/19
 **/
public class Customer {
    //用户id
    private Integer cusId;
    //用户名
    private String username ;
    //卡号
    private String acno ;
    //性别
    private String gender ;
    //联系方式
    private String phone ;

    @Override
    public String toString() {
        return "Customer{" +
                "cusId=" + cusId +
                ", username=‘" + username + ‘\‘‘ +
                ", acno=‘" + acno + ‘\‘‘ +
                ", gender=‘" + gender + ‘\‘‘ +
                ", phone=‘" + phone + ‘\‘‘ +
                ‘}‘;
    }

    public Customer() {
    }

    public Integer getCusId() {

        return cusId;
    }

    public void setCusId(Integer cusId) {
        this.cusId = cusId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAcno() {
        return acno;
    }

    public void setAcno(String acno) {
        this.acno = acno;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Customer(Integer cusId, String username, String acno, String gender, String phone) {

        this.cusId = cusId;
        this.username = username;
        this.acno = acno;
        this.gender = gender;
        this.phone = phone;
    }
}

定义BatchCustomerMapper.xml

<?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.service.impl.BatchCustomerMapper">

    <select id="findOneCustomerById" parameterType="java.lang.Integer"
            resultType="com.entity.onetoonebyresultMap.Customer">
       select * from customer where cus_id = 4
    </select>

</mapper>

编写获取SqlSession 会话的工具类  DataConnection.java

package com.util;

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;

/**
 * @author 王立朝
 * @version 1.0
 * @description 获取 SqlSession 会话对象
 * @date 2019/1/13
 **/
public class DataConnection {

    //mybatis 配置文件
    private String resources = "SqlMapConfig.xml";
    private SqlSessionFactory sqlSessionFactory;
    private SqlSession sqlSession;

    public SqlSession getSqlSession() {
        try {
            InputStream inputStream = Resources.getResourceAsStream(resources);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession();
            System.out.println("获得连接");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }

    public static void main(String[] args) {
        DataConnection dataConnection = new DataConnection();
        dataConnection.getSqlSession();
    }
}

编写单元测试 testBatchCustomerMapper.java

import com.entity.onetoonebyresultMap.Customer;
import com.service.impl.BatchCustomerMapper;
import com.util.DataConnection;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

/**
 * @author 王立朝
 * @version 1.0
 * @description PACKAGE_NAME
 * @date 2019/1/24
 **/
public class testBatchCustomerMapper {

    private static DataConnection dataConnection = new DataConnection();

    //测试Mapper 动态代理
    @Test
    public void testMapper(){

        SqlSession sqlSession = dataConnection.getSqlSession();

        BatchCustomerMapper batchCustomerMapper = sqlSession.getMapper(BatchCustomerMapper.class);
        Customer customer = batchCustomerMapper.findOneCustomerById(4);
        System.out.println("用户信息为:"+ customer.getUsername()
                +" 性别为:"+ customer.getGender());
    }

}

测试结果为:

原文地址:https://www.cnblogs.com/wanglichaoya/p/10314909.html

时间: 2024-08-28 19:02:28

Mybatis 之动态代理的相关文章

Mybatis的动态代理模式

mybatis的动态代理需要遵循4个规则: 1.xml文件中的namespace的值为接口类的全限命名 2.statement的id要跟接口的方法名相同. 3.statement的parameterType要跟接口的方法的参数的类型相同. 4.statement的resultType要跟接口方法的返回值类型相同. 接口: public Student selectStuById(int id); xml文件: <select id="selectStuById" resultTy

(十二)mybatis之动态代理

mybatis之动态代理的应用 在前文(https://www.cnblogs.com/NYfor2018/p/9093472.html)我们知道了,Mybatis的使用需要用到Mapper映射文件,一个是映射接口,另一个是映射XML文件(此处不详谈映射文件XML),在应用中我们可以感觉到,映射接口似乎对接着XML文件中的实现命令,可是我们在运行程序是时候调用的往往是Mapper接口,而不是一个包含逻辑的实现类.很显然Mapper产生了代理类. 首先,什么是代理模式?代理模式的定义:为其他对象提

由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把mybatis的拦截器源码大致的看了一遍,为了温故而知新,在此就按照自己的理解由浅入深的理解一下它的设计. 和大家分享一下,不足和谬误之处欢迎交流.直接入正题. 首先,先不管mybatis的源码是怎么设计的,先假设一下自己要做一个拦截器应该怎么做.拦截器的实现都是基于代理的设计模式设计的,简单的说就是要创造一个目标类的代理类,在代理类中执行目标类的方法并拦截执行拦截器代码. 那么我们就用JDK的动态代理设计一个简单的拦截器

spring如何管理mybatis(一) ----- 动态代理接口

问题来源 最近在集成spring和mybatis时遇到了很多问题,从网上查了也解决了,但是就是心里有点别扭,想看看到底怎么回事,所以跟了下源码,终于发现了其中的奥妙. 问题分析 首先我们来看看基本的配置. spring的配置: <!-- 数据库配置 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="

Mybatis Mapper动态代理方式

目录结构及配置文件与原始dao方法相比更简便 只需一个UserMapper的接口,放在一起的配置文件,配置文件中namespace的地址确定jdk动态代理的对象 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybati

MyBatis - Mapper动态代理开发

采用Mapper动态代理方法只需要编写相应的Mapper接口(相当于Dao接口),那么Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法. - Mapper接口开发需要遵循以下规范: ① Mapper.xml文件中的namespace与mapper接口的全类名相同. ② Mapper接口方法名和Mapper.xml中定义的statement的id相同. ③ Mapper接口方法的输入参数类型和mapper.xml中定义的statement的paramet

MyBatis使用动态代理报 invalid bound statement (not found) 错

这个问题网上大部分都说xml文件中的路径不对 或者是resources之类的问题,如果那些文章的解决方案解决不了你的问题的话,可以看一下我遇到的这种情况: Mapper Interface和 Mapper xml 的路径一致  但是Mapper xml所在的文件夹应为一个package而不是普通的文件夹,如果你创建的时候是创建的普通文件夹,把这个文件夹改为package即可解决. 原文地址:https://www.cnblogs.com/Alex-zqzy/p/9286371.html

mybatis基础_动态代理开发

1.使用原始dao开发需要编写mapper的接口和实现类 1.编写接口 public interface UserDao { User getUserById(int userId); } 2.编写实现类 public class UserDaoImpl implements UserDao { private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory)

java动态代理框架

java动态代理是一个挺有意思的东西,他有时候可以被使用的很灵活.像rpc的调用,调用方只是定义的一个接口,动态代理让他匹配上对应的不同接口:mybatis内部的实现,编码时,只是实现了mapper层的接口和sql的xml的配置,动态代理把他们连起来.记得之前在一家公司,他们使用thrift做rpc的解决方案,每个项目都得管理thrift的连接和关闭,代码考来考去,在spring下还得不断new对象.后来参照mybatis的实现方式,使用动态代理,做成spring注入的方式,方便很多,程序员只需