zoukankan      html  css  js  c++  java
  • MyBatis动态代理

    ------------------------siwuxie095

       

       

       

       

       

       

       

       

       

       

    MyBatis 动态代理

       

       

    1、MyBatis 动态代理 是指 MyBatis 通过 JDK 动态代理机制动态生成代理类

    和代理对象

       

    「代理对象 代理类的对象」

       

       

     

       

    2、当使用 MyBatis 动态代理时,并不需要写映射器接口(Mapper 接口)

    的实现类,代理类 相当于实现类

       

       

       

     

    3、MyBatis 动态生成代理对象作为映射器实例

       

       

       

    // 加载 MyBatis 核心配置文件

    String resource="mybatis-config.xml";

    InputStream inputStream=Resources.getResourceAsStream(resource);

     

    // 构建 SqlSessionFactory

    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

     

    // SqlSessionFactory 中获取 SqlSession

    SqlSession sqlSession=sqlSessionFactory.openSession();

     

    // 使用 MyBatis 动态代理,动态生成代理对象

    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

     

    // do work ...

       

       

       

       

    4、具体实现

       

    1)先创建数据库 mybatis_db, 再创建表 t_user,并插入

    若干数据,其中:uid 为主键,且为自动增长

       

       

       

       

    2)创建实体类

       

    User.java:

       

    package com.siwuxie095.entity;

       

    // 实体类

    public class User {

     

    private Integer uid;

    private String username;

    private String password;

    private String address;

     

    public Integer getUid() {

    return uid;

    }

    public void setUid(Integer uid) {

    this.uid = uid;

    }

     

    public String getUsername() {

    return username;

    }

    public void setUsername(String username) {

    this.username = username;

    }

     

    public String getPassword() {

    return password;

    }

    public void setPassword(String password) {

    this.password = password;

    }

     

    public String getAddress() {

    return address;

    }

    public void setAddress(String address) {

    this.address = address;

    }

     

    @Override

    public String toString() {

    return "User [uid=" + uid + ", username=" + username +

    ", password=" + password + ", address=" + address + "]";

    }

     

    }

       

       

       

    3)创建映射器接口

       

    UserMapper.java:

       

    package com.siwuxie095.mapper;

       

    import java.util.List;

       

    import com.siwuxie095.entity.User;

       

    /**

    * 映射器接口

    */

    public interface UserMapper {

     

    public User getUser(int uid);

     

    public List<User> listUser();

     

    public void saveUser(User user);

     

    public void updateUser(User user);

     

    public void removeUser(int uid);

     

    }

       

       

       

    4)创建 MyBatis 映射配置文件

       

    UserMapper.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 属性:命名空间,由于这里使用了 MyBatis

    的动态代理,所以要遵循一定的规范,即 填写对应映射

    器接口的完全限定名

    -->

    <mapper namespace="com.siwuxie095.mapper.UserMapper">

       

    <!--

    select 标签:配置映射查询语句

    id 属性:在当前命名空间中的唯一标识符

    parameterType 属性:指定参数的 Java 类型,进行参数映射

    resultType 属性:指定返回结果的 Java 类型,进行结果映射

     

    注:parameterType 属性是可选的,即 可以不写,将自动进行参数映射

     

    另:由于这里使用了 MyBatis 的动态代理,所以映射语句的 id 要和映射

    器接口中定义的方法名相对应

    -->

    <select id="getUser" parameterType="java.lang.Integer" resultType="com.siwuxie095.entity.User">

    <!--

    具体的 SQL 语句,其中:通过 #{} 占位符 获取传入的参数

     

    注意:因为这里只有一个参数,所以大括号中可任意,建议

    和实体类属性对应(不是和数据库表字段对应,这里相同只

    是巧合)

    -->

    select * from t_user where uid = #{uid}

    </select>

     

     

    <!--

    注意:

     

    1、返回结果是 List<> 时,resultType 指定为 List<> 中包含的对象类型

     

    2parameterType 本来就是可选的

    -->

    <select id="listUser" resultType="com.siwuxie095.entity.User">

    select * from t_user

    </select>

     

     

    <!--

    insert 标签:配置映射插入语句

     

    注意:由于这里在数据库中已经将 uid 设为自增,所以 uid 处传入 null

    -->

    <insert id="saveUser" parameterType="com.siwuxie095.entity.User">

    <!-- 注意:实际上这里依然是只有一个参数,那就是 User 对象 -->

    insert into t_user (uid, username, password, address) values (null, #{username}, #{password}, #{address})

    </insert>

     

     

    <!--

    update 标签:配置映射更新语句

     

    注意:由于这里在数据库中已经将 uid 设为自增,所以 uid 不用更新

    -->

    <update id="updateUser" parameterType="com.siwuxie095.entity.User">

    update t_user set username=#{username}, password=#{password}, address=#{address} where uid=#{uid}

    </update>

     

       

    <!--

    delete 标签:配置映射删除语句

    -->

    <delete id="removeUser" parameterType="java.lang.Integer">

    delete * from t_user where uid=#{uid}

    </delete>

     

    </mapper>

       

       

       

    5)创建 MyBatis 核心配置文件

       

    mybatis-config.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 根标签 -->

    <configuration>

     

     

    <!--

    第一部分:配置环境

     

    配置环境(environments):包括事务管理和连接池

     

    environments 标签其中可以添加多个 environment 标签,

    多个环境

     

    default 属性表示默认环境(从配置的多个环境选一个)

    -->

    <environments default="development">

    <environment id="development">

     

    <!-- 配置事务管理器 -->

    <transactionManager type="JDBC" />

     

    <!-- 配置数据源:这里使用 MyBatis 内置连接池 -->

    <dataSource type="POOLED">

    <property name="driver" value="com.mysql.jdbc.Driver" />

    <!--

    jdbc:mysql://localhost:3306/mybatis_db 可省略为 jdbc:mysql:///mybatis_db

    -->

    <property name="url" value="jdbc:mysql:///mybatis_db" />

    <property name="username" value="root" />

    <property name="password" value="8888" />

    </dataSource>

     

    </environment>

    </environments>

     

     

    <!--

    第二部分:其它配置

     

    由于这个例子很简单,没什么好配置的 ... 所以就不配置

    -->

     

     

    <!--

    第三部分:引入映射配置文件

     

    当使用了 MyBatis 动态代理时,映射配置文件建议放在映射器接口所在包下

    -->

    <mappers>

     

    <mapper resource="com/siwuxie095/mapper/UserMapper.xml" />

     

    </mappers>

     

     

    <!--

    注意:

     

    这三部分的配置顺序并不是这里的 第一部分、第二部分、第三部分 的顺序

     

    关于 MyBatis 核心配置文件中的配置顺序,可参照如下链接中从上至下的

    标签顺序

     

    http://www.mybatis.org/mybatis-3/zh/configuration.html

    -->

     

    </configuration>

       

       

       

    6)创建单元测试类

       

    MyBatisTest.java:

       

    package com.siwuxie095.test;

       

    import java.io.IOException;

    import java.io.InputStream;

    import java.util.List;

       

    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 org.junit.Test;

       

    import com.siwuxie095.entity.User;

    import com.siwuxie095.mapper.UserMapper;

       

    public class MyBatisTest {

     

     

    /**

    * 单个查询操作

    *

    * 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 jar 包)

    *

    * 选中方法名,右键->Run As->JUint Test

    */

    @Test

    public void testGet() throws IOException {

     

    /*

    * 第一步:加载 MyBatis 核心配置文件

    *

    * 直接到 src 下查找 mybatis-config.xml 文件

    */

    String resource="mybatis-config.xml";

    InputStream inputStream=Resources.getResourceAsStream(resource);

     

     

    /*

    * 第二步:创建 SqlSessionFactory 对象

    *

    * 通过 SqlSessionFactoryBuilder 匿名对象调用 build() 方法进行创建

    */

    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

     

     

    /*

    * 第三步:使用 SqlSessionFactory 创建 SqlSession 对象

    *

    * 调用 sqlSessionFactory openSession() 方法进行创建

    */

    SqlSession sqlSession=sqlSessionFactory.openSession();

     

     

    /*

    * 第四步:编写具体的逻辑:CRUD 操作

    *

    * 调用 userMapper getUser() 方法实现单个查询

    */

    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

    User user=userMapper.getUser(1);

    System.out.println(user);

     

     

    /*

    * 第五步:提交事务

    *

    * 注意:这里是 查,所以跳过 提交事务 这一步

    */

     

     

    /*

    * 第六步:关闭资源

    *

    * 关闭 SqlSession 会话

    */

    sqlSession.close();

    }

     

     

    /**

    * 批量查询操作

    */

    @Test

    public void testList() throws IOException {

     

    /*

    * 第一步:加载 MyBatis 核心配置文件

    *

    * 直接到 src 下查找 mybatis-config.xml 文件

    */

    String resource="mybatis-config.xml";

    InputStream inputStream=Resources.getResourceAsStream(resource);

     

     

    /*

    * 第二步:创建 SqlSessionFactory 对象

    *

    * 通过 SqlSessionFactoryBuilder 匿名对象调用 build() 方法进行创建

    */

    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

     

     

    /*

    * 第三步:使用 SqlSessionFactory 创建 SqlSession 对象

    *

    * 调用 sqlSessionFactory openSession() 方法进行创建

    */

    SqlSession sqlSession=sqlSessionFactory.openSession();

     

     

    /*

    * 第四步:编写具体的逻辑:CRUD 操作

    *

    * 调用 userMapper listUser() 方法实现批量查询

    */

    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

    List<User> list=userMapper.listUser();

    for (User user : list) {

    System.out.println(user);

    }

     

     

    /*

    * 第五步:提交事务

    *

    * 注意:这里是 查,所以跳过 提交事务 这一步

    */

     

     

    /*

    * 第六步:关闭资源

    *

    * 关闭 SqlSession 会话

    */

    sqlSession.close();

    }

     

     

    /**

    * 添加操作

    */

    @Test

    public void testSave() throws IOException {

     

    /*

    * 第一步:加载 MyBatis 核心配置文件

    *

    * 直接到 src 下查找 mybatis-config.xml 文件

    */

    String resource="mybatis-config.xml";

    InputStream inputStream=Resources.getResourceAsStream(resource);

     

     

    /*

    * 第二步:创建 SqlSessionFactory 对象

    *

    * 通过 SqlSessionFactoryBuilder 匿名对象调用 build() 方法进行创建

    */

    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

     

     

    /*

    * 第三步:使用 SqlSessionFactory 创建 SqlSession 对象

    *

    * 调用 sqlSessionFactory openSession() 方法进行创建

    */

    SqlSession sqlSession=sqlSessionFactory.openSession();

     

     

    /*

    * 第四步:编写具体的逻辑:CRUD 操作

    *

    * 调用 userMapper saveUser() 方法实现添加

    */

    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

    User user=new User();

    user.setUsername("小强");

    user.setPassword("4444");

    user.setAddress("美国");

    userMapper.saveUser(user);

     

     

    /*

    * 第五步:提交事务

    */

    sqlSession.commit();

     

     

    /*

    * 第六步:关闭资源

    *

    * 关闭 SqlSession 会话

    */

    sqlSession.close();

    }

     

     

    /**

    * 修改操作

    */

    @Test

    public void testUpdate() throws IOException {

     

    /*

    * 第一步:加载 MyBatis 核心配置文件

    *

    * 直接到 src 下查找 mybatis-config.xml 文件

    */

    String resource="mybatis-config.xml";

    InputStream inputStream=Resources.getResourceAsStream(resource);

     

     

    /*

    * 第二步:创建 SqlSessionFactory 对象

    *

    * 通过 SqlSessionFactoryBuilder 匿名对象调用 build() 方法进行创建

    */

    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

     

     

    /*

    * 第三步:使用 SqlSessionFactory 创建 SqlSession 对象

    *

    * 调用 sqlSessionFactory openSession() 方法进行创建

    */

    SqlSession sqlSession=sqlSessionFactory.openSession();

     

     

    /*

    * 第四步:编写具体的逻辑:CRUD 操作

    *

    * 调用 userMapper updateUser() 方法实现修改

    */

    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

    User user=userMapper.getUser(1);

    user.setPassword("1111");

    userMapper.updateUser(user);

     

     

    /*

    * 第五步:提交事务

    */

    sqlSession.commit();

     

     

    /*

    * 第六步:关闭资源

    *

    * 关闭 SqlSession 会话

    */

    sqlSession.close();

    }

     

     

    /**

    * 删除操作

    */

    @Test

    public void testRemove() throws IOException {

     

    /*

    * 第一步:加载 MyBatis 核心配置文件

    *

    * 直接到 src 下查找 mybatis-config.xml 文件

    */

    String resource="mybatis-config.xml";

    InputStream inputStream=Resources.getResourceAsStream(resource);

     

     

    /*

    * 第二步:创建 SqlSessionFactory 对象

    *

    * 通过 SqlSessionFactoryBuilder 匿名对象调用 build() 方法进行创建

    */

    SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

     

     

    /*

    * 第三步:使用 SqlSessionFactory 创建 SqlSession 对象

    *

    * 调用 sqlSessionFactory openSession() 方法进行创建

    */

    SqlSession sqlSession=sqlSessionFactory.openSession();

     

     

    /*

    * 第四步:编写具体的逻辑:CRUD 操作

    *

    * 调用 userMapper removeUser() 方法实现删除

    */

    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

    userMapper.removeUser(1);

     

     

    /*

    * 第五步:提交事务

    */

    sqlSession.commit();

     

     

    /*

    * 第六步:关闭资源

    *

    * 关闭 SqlSession 会话

    */

    sqlSession.close();

    }

     

    }

       

       

       

       

       

    5、MyBatis 动态代理总结

       

    1)映射配置文件的命名空间 namespace 必须和映射器接口的完全限定名一致

       

    2)映射语句的 id 必须和映射器接口中定义的方法名一致

       

    3)映射语句的 parameterType 必须和映射器接口中方法的输入参数类型一致

       

    4)映射语句的 resultType 必须和映射器接口中方法的输出结果类型一致

       

       

    其对应关系如下表

       

    映射配置文件

    映射器接口

    根标签 mapper 中定义的命名空间 namespace

    映射器接口的完全限定名

    映射语句的 id

    映射器接口中定义的方法名

    映射语句的 parameterType

    方法的参数类型

    映射语句的 resultType

    方法的返回类型

       

       

       

       

    6、关于 parameterType 和 resultType

       

    属性

    作用

    是否必须

    parameterType 

    参数映射

    可选,即 可以省略不写

    resultType

    结果映射

    必须,即 必须进行配置

       

       

    1)参数映射是可选的,使用 parameterType

       

    2)结果映射是必须的,使用 resultType 或 resultMap

       

    「一条映射语句中不能同时使用 resultType 和 resultMap」

       

       

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    C语言集锦(一) C代码生成图片:BMP、PNG和JPEG
    Win32 OpenGL标准例子
    Tcc学习笔记(一) 开篇
    C语言集锦(二) 图像显示 Windows和Linux
    矢量图和Word:EPS,PDF,EMF和SVG
    firefox浏览器无法显示bootstrap图标问题总结
    现代字体栈
    jquery 插件大全
    meta 详解,html5 meta 标签日常设置
    工厂方法模式Factory Method(Java实现)
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/8159401.html
Copyright © 2011-2022 走看看