MyBatis的Mapper代理笔记
MaBatis--Mapper代理
目前使用
SqlSession
进行增删改查的缺点:
- 没有办法实现多参传值
- 书写的时候没有接口,后期的维护低
使用Mapper的动态代理方式来解决问题
具体实现
首先我们需要编写Dao层相关的数据库接口--AccountMapper
:
public interface AccountMapper {
/**
* 查询account表中的所有数据
* @return 返回结果集
*/
List<Account> selectAll();
/**
*
* @param account 需要插入的JavaBean对象
* @return 影响行
*/
int insert(Account account);
}
接下来编写SQL映射文件--AccountMapper.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">
<!-- namespace = "接口的全路径" -->
<mapper namespace="com.lyl.dao.AccountMapper">
<!-- id接口的方法名 -->
<select id="selectAll" resultType="account">
select * from account
</select>
<insert id="insert">
insert into Account values(DEFAULT ,#{username},#{balance})
</insert>
</mapper>
再编写测试类--Test4
:
public class Test4 {
public static void main(String[] args) throws Exception {
// 1.解析mybatis.xml文件配置
String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2.得到SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3.得到一个SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 4.SQL操作
AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class); // 通过动态代理得到接口对象
List<Account> list = accountMapper.selectAll();
Account account = new Account();
account.setUsername("lyl");
account.setBalance(9999);
int a = accountMapper.insert(account);
System.out.println(list);
System.out.println(a);
// 5.关闭资源
sqlSession.close();
}
}
控制台结果:
[Account{id=1, username='张三', balance=1000.0}, Account{id=3, username='王五', balance=2000.0}, Account{id=4, username='赵六', balance=4000.0}, Account{id=5, username='丈八', balance=3000.0}]
1
主要看AccountMapper.xml
,和Test4
,那么通过上面的代码和注释可以看到我们不再通过SqlSession
对象直接操作数据库,而是通过accountMapper
接口对象来调用接口的方法操作数据库,这样我们就可以通过编写接口的方法来自定义传参类型以及个数,更加灵活规范的书写我们的SQL操作。那接口和SQL映射文件是怎么绑定在一起的呢?
两者绑定在一起并起作用都是依靠动态代理(动态代理我现在也没学所以不做解释),我们能看到最直观的线索就是AccountMapper.xml
中<mapper>
标签中的namespace
属性的值刚好就是我们AccountMapper
接口在项目中的路径,这并不是巧合,就是依靠namespace
来桥接接口和SQL映射文件。
既然可以传多参,那么参数的类型也是可以自定义,常见的对象,List,Map...都是可以传入,但是在SQL映射文件中取出实参却每个都不太一样。
取出对象:直接写对象的属性即可,MyBatis会自动帮我们取出
取出多个参数:用#{param1},#{param2}...
即可一次对照形参的顺序即可,也可以用MaBatis的注解起别名@Param("xx")
即可。
其他的类型可以自行百度。