mybatis动态代理实现数据库的增改删查功能和pojo包装类映射
工程结构搭建
- 在工程src包下创建两个空包,cn.mybatis.xhchen.entity和cn.mybatis.xhchen.mapper
- 工程中创建创建文件集config与src同级
- 在config下创建一个空包mapper、数据源文件db.properties、日志文件log4j.properties和mybatise的核心配置文件SqlMapConfig.xml
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
在核心配置文件SqlMapConfig.xml下配置数据源信息
引入dtd约束文件
<!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"></properties>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
</configuration>
工程环境搭建
Jar包
编写实现代码
在cn.mybatis.xhchen.entity包下创建user实体类
package cn.mybatis.xhchen.entity;
/**
*
* ClassName: User
*
* @Description: 数据库user实体类
* @author XHChen
* @date 2018年10月8日 上午11:32:16
*/
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + "]";
}
}
在config/mapper包下创建mapper.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="cn.mybatis.xhchen.mapper.UserMapper">
<!-- 声明 sql片段 -->
<sql id="query_where_sql">
<if test="encapsulationUser != null">
<if
test="encapsulationUser.username != null and encapsulationUser.username!=''">
and user.username like '%${encapsulationUser.username}%'
</if>
<if
test="encapsulationUser.password != null and encapsulationUser.password != ''">
and user.password like '%${encapsulationUser.password}%'
</if>
</if>
</sql>
<!-- 添加数据 -->
<insert id="insertUser" parameterType="cn.mybatis.xhchen.entity.User">
<!-- id自动增长 -->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT
LAST_INSERT_ID()
</selectKey>
<!-- 插入sql语句 -->
insert into user(username,password) values(#{username},#{password})
</insert>
<!-- 修改数据 -->
<update id="updateUser" parameterType="cn.mybatis.xhchen.entity.User">
<!-- 插入修改sql语句 -->
update user set username=#{username}, password=#{password} where
id=#{id}
</update>
<!-- 删除数据 -->
<delete id="deleteUser" parameterType="cn.mybatis.xhchen.entity.User">
<!-- 插入删除语句 -->
delete from user where id=#{id}
</delete>
<!-- 通过id查询 -->
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.mybatis.xhchen.entity.User">
<!-- 插入查询语句 -->
select * from user where id=#{id}
</select>
<!-- 用户名模糊查询 -->
<select id="findUserByLike" parameterType="java.lang.String"
resultType="cn.mybatis.xhchen.entity.User">
<!-- 插入查询语句 -->
select * from user where username like '%${value}%'
</select>
<!-- pojo用户条件查询 -->
<select id="findUserByList" parameterType="cn.mybatis.xhchen.entity.UserQueryVo"
resultType="cn.mybatis.xhchen.entity.EncapsulationUser">
<!-- 插入查询语句 -->
select * from user
<where>
<!-- <if test="encapsulationUser != null">
<if
test="encapsulationUser.username != null and encapsulationUser.username!=''">
and user.username like '%${encapsulationUser.username}%'
</if>
<if
test="encapsulationUser.password != null and encapsulationUser.password != ''">
and user.password like '%${encapsulationUser.password}%'
</if>
</if> -->
<!-- 通过引用sql片段 -->
<include refid="query_where_sql"></include>
</where>
</select>
<!-- pojo用户条件查询总数 -->
<select id="findUserByCount" parameterType="cn.mybatis.xhchen.entity.UserQueryVo"
resultType="java.lang.Integer">
<!-- 插入查询语句 -->
select count(*) from user
<where>
<!-- <if test="encapsulationUser != null">
<if
test="encapsulationUser.username != null and encapsulationUser.username!=''">
and user.username like '%${encapsulationUser.username}%'
</if>
<if
test="encapsulationUser.password != null and encapsulationUser.password != ''">
and user.password like '%${encapsulationUser.password}%'
</if>
</if> -->
<!-- 引用sql片段 -->
<include refid="query_where_sql"></include>
</where>
</select>
</mapper>
在cn.mybatis.xhchen.mapper包下创建UserMapper.java接口
mapper动态代理接口编写遵循开发规范:
1、在mapper.xml中namespace等于mapper接口地址
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致
注意: 不管输出的pojo是单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。 在mapper.java指定的方法返回值不一样:
- 输入单个pojo对象,方法返回是单个对象
- 输入pojo对象是list,方法返回是List
package cn.mybatis.xhchen.mapper;
import java.util.List;
import cn.mybatis.xhchen.entity.EncapsulationUser;
import cn.mybatis.xhchen.entity.User;
import cn.mybatis.xhchen.entity.UserQueryVo;
/**
*
* ClassName: UserMapper
*
* @Description: User接口
* @author XHChen
* @date 2018年10月8日 上午11:41:50
*/
public interface UserMapper {
// 插入数据
public void insertUser(User user) throws Exception;
// 修改数据
public void updateUser(User user) throws Exception;
// 删除数据
public void deleteUser(int id) throws Exception;
// 通过id查询
public User findUserById(int id) throws Exception;
// 通过用户名模糊查询
public List<User> findUserByLike(String name) throws Exception;
}
核心配置文件SqlMapConfig.xml引入mapper.xml映射
<!-- 加载映射文件 -->
<mappers>
<!-- 动态代理数据库操作配置文件 -->
<mapper resource="mapper/mapper.xml"/>
</mappers>
测试程序
创建UserMapper.java接口的Junit Test Case测试类
package cn.mybatis.xhchen.mapper;
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.Before;
import org.junit.Test;
import cn.mybatis.xhchen.entity.EncapsulationUser;
import cn.mybatis.xhchen.entity.User;
import cn.mybatis.xhchen.entity.UserQueryVo;
/**
*
* ClassName: UserMapperTest
*
* @Description: pojo测试
* @author XHChen
* @date 2018年10月8日 上午11:55:20
*/
public class UserMapperTest {
// 创建会话工厂
private SqlSessionFactory sqlSessionFactory;
@Before
/**
*
* @Description: 加载配置文件
* @param
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 上午11:56:04
*/
public void setUp() throws IOException {
// 定义核心配置文件
String resource = "SqlMapConfig.xml";
// 获得核心配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 创建会话工厂,加载配置文件流
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
/**
*
* @Description: 插入数据
* @param
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 下午12:06:01
*/
public void testInsertUser() throws Exception {
// 开启SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建动态代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 创建对象
User user = new User();
// 插入数据
user.setUsername("XHChen");
user.setPassword("ID9527");
// 调用动态代理方法
userMapper.insertUser(user);
// 提交事务
sqlSession.commit();
// 关闭事务
sqlSession.close();
}
@Test
/**
*
* @Description: 更新数据
* @param @throws Exception
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 下午4:14:12
*/
public void testupdateUser() throws Exception {
// 开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 更新操作
User user = new User();
user.setId(16);
user.setUsername("XHChen_05");
user.setPassword("ID9531");
// 调用动态代理放法
userMapper.updateUser(user);
// 提交事务
sqlSession.commit();
// 关闭事务
sqlSession.close();
}
@Test
/**
*
* @Description: 删除数据
* @param @throws Exception
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 下午4:14:29
*/
public void testdeleteUser() throws Exception {
// 开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 删除操作
// 调用代理方法
userMapper.deleteUser(17);
// 提交事务
sqlSession.commit();
// 关闭资源
sqlSession.close();
}
@Test
/**
*
* @Description: 通过id查询
* @param
* @return void
* @throws Exception
* @throws
* @author XHChen
* @date 2018年10月8日 下午4:29:06
*/
public void testfindUserById() throws Exception {
// 开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询操作
User user = userMapper.findUserById(16);
System.out.println(user);
// 提交事务
sqlSession.commit();
// 关闭事务
sqlSession.close();
}
@Test
/**
*
* @Description: 通过用户名模糊查询
* @param
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 下午4:33:11
*/
public void testfindUserByLike() throws Exception {
// 开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询操作
List<User> list = userMapper.findUserByLike("XH");
System.out.println(list);
// 提交事务
sqlSession.commit();
// 关闭事务
sqlSession.close();
}
}
针对复杂查询的条件,建议使用自定义的包装类型的pojo 在包装类型的pojo中讲复杂的查询条件包装进去
在cn.mybatis.xhchen.entity包下创建EncapsulationUser.java和UserQueryVo.java对user进行pojo封装
EncapsulationUser.java
package cn.mybatis.xhchen.entity;
/**
*
* ClassName: EncapsulationUser
*
* @Description: 封装User实体类,用于POJO
* @author XHChen
* @date 2018年10月8日 上午11:37:30
*/
public class EncapsulationUser {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Override
public String toString() {
return "EncapsulationUser [id=" + id + ", username=" + username
+ ", password=" + password + "]";
}
}
UserQueryVo.java
package cn.mybatis.xhchen.entity;
/**
*
* ClassName: UserQueryVo
*
* @Description: User POJO
* @author XHChen
* @date 2018年10月8日 上午11:38:53
*/
public class UserQueryVo {
private EncapsulationUser encapsulationUser;
public EncapsulationUser getEncapsulationUser() {
return encapsulationUser;
}
public void setEncapsulationUser(EncapsulationUser encapsulationUser) {
this.encapsulationUser = encapsulationUser;
}
}
在mapper接口中添加了两个复杂查询方法
// pojo用户条件查询
public List<EncapsulationUser> findUserByList(UserQueryVo userQueryVo) throws Exception;
// pojo用户条件查询总数
public int findUserByCount(UserQueryVo userQueryVo) throws Exception;
在测试类进行测试
@Test
/**
*
* @Description: pojo用户条件查询
* @param
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 下午4:46:10
*/
public void testfindUserByList() throws Exception {
// 开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询操作
// 创建UserQueryVo对象
UserQueryVo userQueryVo = new UserQueryVo();
// 创建EncapsulationUser对象
EncapsulationUser encapsulationUser = new EncapsulationUser();
// 设置查询条件
encapsulationUser.setPassword("ID952");
encapsulationUser.setUsername("XHChen");
// pojo封装userCustom
userQueryVo.setEncapsulationUser(encapsulationUser);
// 调用动态代理方法
List<EncapsulationUser> list = userMapper.findUserByList(userQueryVo);
System.out.println(list);
// 提交事务
sqlSession.commit();
// 关闭事务
sqlSession.close();
}
@Test
/**
*
* @Description: pojo用户条件查询总数
* @param
* @return void
* @throws
* @author XHChen
* @date 2018年10月8日 下午4:58:13
*/
public void testfindUserByCount() throws Exception {
// 开启sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 开启代理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查询操作
// 创建pojo UserQueryVo对象
UserQueryVo userQueryVo = new UserQueryVo();
// 创建EncapsulationUser封装对象
EncapsulationUser encapsulationUser = new EncapsulationUser();
// 设置查询条件
encapsulationUser.setPassword("ID953");
encapsulationUser.setUsername("XHChen");
// 调用UserQueryVo里的方法
userQueryVo.setEncapsulationUser(encapsulationUser);
// 调用代理方法
int count = userMapper.findUserByCount(userQueryVo);
System.out.println(count);
// 提交事务
sqlSession.commit();
// 关闭事务
sqlSession.close();
}