mybatis框架之mybatis中dao层开发的两种方法

 更新时间:2023年07月11日 08:46:45   作者:盡盡  
这篇文章主要介绍了mybatis框架之mybatis中dao层开发的两种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、原始dao的开发方式

即开发dao接口和dao实现类。

首先添加Dao接口

public interface UserDao {
    // 1、 根据用户ID查询用户信息
    public User findUserById(int id) throws Exception;
​
    // 2、 根据用户名称模糊查询用户列表
    public List<User> findUsersByName(String name) throws Exception;
​
    // 3、 添加用户
    public void insertUser(User user) throws Exception;
}

然后实现其接口即可

public class UserDaoImpl implements UserDao {
    // 依赖注入,将工程在外面创建
    private SqlSessionFactory sqlSessionFactory;
    public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {//将外面创建的工厂传递进来(以后spring)
        this.sqlSessionFactory = sqlSessionFactory;
    }
​
    @Override
    public User findUserById(int id) throws Exception {
        // 创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 调用SqlSession的增删改查方法
        // 第一个参数:表示statement的唯一标示
        User user = sqlSession.selectOne("test.findUserById", id);
        System.out.println(user);
        // 关闭资源
        sqlSession.close();
        return user;
    }
​
    @Override
    public List<User> findUsersByName(String name) {
        // 创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
​
        // 调用SqlSession的增删改查方法
        // 第一个参数:表示statement的唯一标示
        List<User> list = sqlSession.selectOne("test.findUsersByName", name);
        System.out.println(list);
        // 关闭资源
        sqlSession.close();
        return list;
    }
​
    @Override
    public void insertUser(User user) {
        // 创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
​
        // 调用SqlSession的增删改查方法
        // 第一个参数:表示statement的唯一标示
        sqlSession.insert("test.insertUser", user);
​
        System.out.println(user.getId());
        // 提交事务
        sqlSession.commit();
        // 关闭资源
        sqlSession.close();
    }
}

那么在测试类中

public class UserDaoTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception {
        // 读取配置文件
        // 全局配置文件的路径
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testFindUserById() throws Exception {
        // 创建UserDao
        UserDao dao = new UserDaoImpl(sqlSessionFactory);
        User user = dao.findUserById(1);
        System.out.println(user);
    }
}

二、Mapper代理的开发方式

分析上面的代码会发现有大量的重复的模板代码,并且存在硬编码【如sqlSession.insert("test.insertUser", user);】,

为了解决以上问题,故采用开发mapper接口(相当于dao接口)来进行dao的开发,即通过开发mapper接口,将自动生成其代理类来进行操作。

其中Mapper代理使用的是jdk的代理策略。

如果采用Mapper代理的方式开发需要满足如下开发规范

  • mapper接口的全限定名要和mapper映射文件的namespace值一致。
  • mapper接口的方法名称要和mapper映射文件的statement的id一致。
  • mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
  • mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。

首先开发mapper接口

public interface UserMapper {
    // 1、 根据用户ID查询用户信息
    public User findUserById(int id) throws Exception;
    // 2、 添加用户
    public void insertUser(User user) throws Exception;
}

之后创建User的映射文件,在config下创建mapper目录然后创建UserMapper.xml(这是mybatis的命名规范,当然,也不是必须是这个名称)。

由其规范可以确定其映射文件如下

(接口在包com.itheima.mybatis.mapper.UserMapper下面):

<mapper namespace="com.itheima.mybatis.mapper.UserMapper">
    <!-- 根据用户ID查询用户信息 -->
    <select id="findUserById" parameterType="int" resultType="User">
        SELECT
        * FROM USER WHERE id =#{id}
    </select>
​
    <!-- 添加用户 -->
    <insert id="insertUser" parameterType="com.itheima.mybatis.po.User">
        <selectKey keyProperty="id" resultType="int" order="AFTER">
            SELECT
            LAST_INSERT_ID()
        </selectKey>
​
        INSERT INTO USER
        (username,birthday,sex,address)
        VALUES(#{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

之后将映射文件加到全局配置文件即可。

然后便可以进行测试

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;
    @Before
    public void setUp() throws Exception {
        // 读取配置文件
        // 全局配置文件的路径
        String resource = "SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
​
    @Test
    public void testFindUserById() throws Exception {
        // 创建UserMapper对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
​
        // 由mybatis通过sqlsession来创建代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findUserById(1);
        System.out.println(user);
        sqlSession.close();
    }
    @Test
    public void testInsertUser() throws Exception {
        // 创建UserMapper对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 由mybatis通过sqlsession来创建代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User();
        user.setUsername("东哥hm19");
        user.setAddress("宝盛西里24号楼");
        mapper.insertUser(user);
        System.out.println(user.getId());
        sqlSession.commit();
        sqlSession.close();
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中FileWriter类的常用方法说明

    Java中FileWriter类的常用方法说明

    这篇文章主要介绍了Java中FileWriter类的常用方法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 深入了解java8的foreach循环

    深入了解java8的foreach循环

    虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8。下面给大家分享java8中的foreach循环,感兴趣的朋友一起看看吧
    2017-05-05
  • Java Integer如何获取第一位和最后一位,并截取

    Java Integer如何获取第一位和最后一位,并截取

    这篇文章主要介绍了Java Integer如何获取第一位和最后一位并截取,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • MyBatis自定义TypeHandler如何解决字段映射问题

    MyBatis自定义TypeHandler如何解决字段映射问题

    这篇文章主要介绍了MyBatis自定义TypeHandler如何解决字段映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 解决SpringBoot启动警告:OpenJDK 64-Bit Server VM warning

    解决SpringBoot启动警告:OpenJDK 64-Bit Server VM warning

    这篇文章主要介绍了解决SpringBoot启动警告:OpenJDK 64-Bit Server VM warning的相关资料,文中通过代码介绍的非常详细,对同样遇到这个问题的朋友具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-11-11
  • javaweb实现文件上传与下载功能

    javaweb实现文件上传与下载功能

    这篇文章主要为大家详细介绍了javaweb实现文件上传与下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Java AQS中ReentrantReadWriteLock读写锁的使用

    Java AQS中ReentrantReadWriteLock读写锁的使用

    ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁。这篇文章主要讲解一下ReentrantReadWriteLock的使用和应用场景,感兴趣的可以了解一下
    2023-02-02
  • SpringBoot3配置Logback日志滚动文件的方法

    SpringBoot3配置Logback日志滚动文件的方法

    本文介绍了在SpringBoot3中配置Logback日志滚动文件的方法,因为SpringBoot3内置的logback版本是1.4.14,之前使用SpringBoot2.1.5的logback配置发现有些东西不能生效了,需要的朋友可以参考下
    2024-08-08
  • SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码

    SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码

    这篇文章主要介绍了SpringBoot使用自定义注解+AOP+Redis实现接口限流,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • java反转链表的多种解决方法举例详解

    java反转链表的多种解决方法举例详解

    这篇文章主要介绍了java反转链表的多种解决方法,分别是使用栈、双指针和递归,每种方法都有其实现原理和代码示例,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04

最新评论