MyBatis动态代理

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

   

   

   

   

   

   

   

   

   

   

MyBatis 动态代理

   

   

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

和代理对象

   

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

   

   

 

   

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

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

   

   

   

 

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

   

MyBatis动态代理_第1张图片

   

   

// 加载 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 为主键,且为自动增长

   

MyBatis动态代理_第2张图片

   

   

   

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 listUser();

 

public void saveUser(User user);

 

public void updateUser(User user);

 

public void removeUser(int uid);

 

}

   

   

   

4)创建 MyBatis 映射配置文件

   

UserMapper.xml:

   

version="1.0" encoding="UTF-8" ?>

mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

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

   

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

select * from t_user where uid = #{uid}

 

 

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

select * from t_user

 

 

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

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

 

 

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

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

 

   

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

delete * from t_user where uid=#{uid}

 

   

   

   

5)创建 MyBatis 核心配置文件

   

mybatis-config.xml:

   

version="1.0" encoding="UTF-8" ?>

configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

   

 

 

default="development">

id="development">

 

type="JDBC" />

 

type="POOLED">

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

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

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

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

 

 

 

 

 

 

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

 

 

 

 

   

   

   

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 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

你可能感兴趣的:(MyBatis动态代理)