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】

转载于:https://www.cnblogs.com/siwuxie095/p/8159401.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值