mybatis之入门到开发(四)之 Mapper动态代理方式

一:原始Dao开发方式
【分析】原始Dao开发方法需要程序员编写Dao接口和Dao实现类。
Dao接口实现类如下

public class UserDaoImpl implements UserDao {
    private SqlSessionFactory sqlSessionFactory;
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
        super();
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public User queryUserById(int id) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 执行查询逻辑
        User user = sqlSession.selectOne("queryUserById", id);
        // 释放资源
        sqlSession.close();

        return user;
    }

    @Override
    public List<User> queryUserByUsername(String username) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 执行查询逻辑
        List<User> list = sqlSession.selectList("queryUserByUsername", username);
        // 释放资源
        sqlSession.close();
        return list;
    }

    @Override
    public void saveUser(User user) {
        // 创建SqlSession
        SqlSession sqlSession = this.sqlSessionFactory.openSession();
        // 执行保存逻辑
        sqlSession.insert("saveUser", user);
        // 提交事务
        sqlSession.commit();
        // 释放资源
        sqlSession.close();
    }
}

原始Dao开发中存在以下问题:
       Dao方法体存在重复代码:从上面的代码来看的话,只有sqlSession调用特定的方法不同,那么其他的都是累赘。无论是,创建SqlSessionFactoryBuilder,加载SqlMapConfig.xml配置文件,创建SqlsessionFactory
都是比较累赘的。

       再者说了,针对一个User,存在一个UserPodo,UserController,UserMapper.xml,UserService,UserDao。比以前多了一个文件,使得项目管理更加的复杂起来。所以这里推荐Mapper动态代理方式

二:Mapper动态代理方式 :它其实不是一个技术,而是一种开发规范
2.1 遵循以下这四个规范
      接口方法名 = User.xml中的id名
      返回值的类型与mapper.xml文件中的返回值类型要一致
      方法的入参类型要与mapper.xml的入参数类型要一致
      命名空间 绑定此接口
2.2 这里以User为例子

    //创建一个User.java的接口
    public interface UserMapper{
    //遵循四个原则
    //接口方法名 = User.xml中的id名
    //返回值的类型与mapper.xml文件中的返回值类型要一致
    //方法的入参类型要与mapper.xml的入参数类型要一致
    //命名空间 绑定此接口

    /*这里的传入参数,跟返回参数,方法名都是跟UserMapper.xml定义的一样*/
    public User selectUserById(Integer id);
    public void save(User user);
    public List<User> selectUserByLikeName(String username);
    public List<User> selectUserByLikeNameTwo(String username);
    public List<User> selectUserByQueryVo(QueryVo queryVo);

}
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="dgut.xiaozheng.mapper.UserMapper">
    <!-- 保存用户信息 -->
    <insert id="save" parameterType="user" useGeneratedKeys="true">
        insert into tb_user(username,sex,age) values (#{username},#{sex},#{age})
    </insert>
    <!-- 通过id查找用户信息 -->
    <select id="selectUserById" parameterType="Integer" resultType="user">
        select * from tb_user where id = #{id}
    </select>
    <!-- 模糊名查询用户信息 -->
    <select id="selectUserByLikeName" parameterType="string" resultType="user">
        select * from tb_user where username like #{like}
    </select>
    <!-- 第二种方法,模糊查询用户信息 -->
    <select id="selectUserByLikeNameTwo" parameterType="string" resultType="user">
        select * from tb_user where username like '%${value}%'
    </select>

    <!-- two days -->
    <select id="selectUserByQueryVo" parameterType="queryVo" resultType="user">
        select * from tb_user where username like "%"#{user.username}"%"

    </select>
</mapper>
//4、修改命名空间。命名空间直接映射的是UserMapper
<mapper namespace="dgut.xiaozheng.mapper.UserMapper">

2.3 写测试案例

    @Test
    public void testSelectUserByQueryVo(){
        SqlSessionFactory sqlSessionFactory = MybatisUtilsForMe.getSqlSessionFactory();
        SqlSession session = sqlSessionFactory.openSession();
        //核心代码,getMapper()
        UserMapper userMapper = session.getMapper(UserMapper.class);
        QueryVo queryVo = new QueryVo();
        User user = new User();
        user.setUsername("欣");
        queryVo.setUser(user);

        List<User> userList = userMapper.selectUserByQueryVo(queryVo);
        for (User user2 : userList) {
            System.out.println(user2);
        }
    }

//它这里可以通过getMapper方法获取Mapper对象,然后直接就可以调用接口中的方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值