Mybatis動態代理介面實現資料庫操作
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();
}