Java框架學習_Mybatis(六)Mybatis的動態代理模式
阿新 • • 發佈:2019-01-10
之前我們為了實現資料庫操作的封裝和業務的分離,使用Dao模式,現在Mybatis提供了更加簡潔的動態代理模式,只要有介面不需要實現,就能進行資料庫操作
動態代理模式必須遵循的規範:
- 與表相對應的mapper配置的namespace必須是介面的全路徑名
- 介面的方法名必須與sql語句的id一致
- sql的parametertype必須與介面的形參一致
- sql的resultype必須與介面的返回值一致
這裡再新建一個UserMapper.xml檔案(要修改的地方就是namesapce,需要是介面的全路徑名):
<?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.nupt.mybatis.mapper.UserMapper">
<!-- 跟新使用者,設定id,設定引數型別(因為有很多的引數,所以就用pojo型別了) -->
<update id="updateUser" parameterType="cn.nupt.pojo.User" >
UPDATE
`mybatis`.`user`
SET
`username` = #{username},
`address` = #{address}
WHERE `id` = #{id} ;
</update>
<!-- 刪除使用者 -->
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<select id="getUserById" parameterType="int" resultType="cn.nupt.pojo.User">
<!-- select * from user where id = #{id2} -->
<!-- 或者: --> select * from user where id = ${value}
</select>
<select id="getUserByName" parameterType="string" resultType="cn.nupt.pojo.User">
<!-- select * from user where name like '%張%' -->
<!-- 和下面的一樣都可以,只不過輸入完整的:“%張%”
select * from user where username like #{id2} -->
select * from user where username like '%${value}%'
</select>
</mapper>
然後將這個mapper對映檔案放到核心配置檔案裡:
<mappers>
<mapper resource="mybatis/user.xml"/>
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
這裡寫一個增刪查改的介面:
package cn.nupt.mybatis.mapper;
import java.util.List;
import cn.nupt.pojo.User;
public interface UserMapper {
void updateUser(User user);
void deleteUser(Integer id);
User getUserById(Integer id);
List<User> getUserByName(String name);
}
然後直接用動態代理就可以實現了:
package cn.nupt.mybatis.mapper;
import static org.junit.Assert.*;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import cn.nupt.mybatis.utils.SqlSessionFactoryUtils;
import cn.nupt.pojo.User;
public class UserMapperTest {
@Test
public void testUpdateUser() {
SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
// 獲取介面的代理人實現類
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = new User();
user.setUsername("周杰倫");
user.setAddress("臺灣");
user.setId(1);
userMapper.updateUser(user);
}
@Test
public void testDeleteUser() {
fail("Not yet implemented");
}
@Test
public void testGetUserById() {
SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
// 獲取介面的代理人實現類
UserMapper userMapper = session.getMapper(UserMapper.class);
User userById = userMapper.getUserById(24);
System.out.println(userById);
}
@Test
public void testGetUserByName() {
SqlSession session = SqlSessionFactoryUtils.getSqlSessionFactory().openSession(true);
// 獲取介面的代理人實現類
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> list = userMapper.getUserByName("%張%");
for (User user : list) {
System.out.println(user);
}
}
}