MyBatis的Mapper代理笔记

MaBatis--Mapper代理

目前使用SqlSession进行增删改查的缺点:

  1. 没有办法实现多参传值
  2. 书写的时候没有接口,后期的维护低

使用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")即可。

其他的类型可以自行百度。

posted @ 2021-04-29 21:08  CN_DADA  阅读(67)  评论(0编辑  收藏  举报