Mybatis入门(六)SpringBoot整合Mybatis_2

导读:本篇文章讲解 Mybatis入门(六)SpringBoot整合Mybatis_2,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


一、SpringBoot整合Mybatis步骤

1. 导入依赖

  • 必选项
    • 数据源(MySQL)
    • 导入SpringBoot整合的持久层框架(Mybatis)
  • 可选项
    • lombok(提供简单的实体类常用方法,日志等功能)

2. 编写配置文件

  • 数据库连接配置
  • Mybatis映射文件地址/路径绑定

3. 编写POJO实体类用于封装数据

  • 必写项
    • entity(与单表对应)
  • 选写项
    • vo(数据库中查询出来的信息)
    • dto(前端接受过来的数据)

4. 编写持久层接口及抽象方法

5. 将持久层接口交给Mybatis管理

下列情况任选其一即可:

  • 在对应的 XXXMapper 接口上添加 @Mapper 注解
  • 在配置类上添加 @MapperScan("持久层接口所在包的全路径名")
    • 使用现有的配置类 SpringBoot项目的启动类 XXXSpringBootApplication
    • 自己创建一个配置类

6. 编写映射文件(需要和配置文件中映射文件的路径保持一致)

7. 编写测试类及测试方法


二、简单的增删改查业务

此增删改查业务跳过上述 SpringBoot整合Mybatis步骤 中的 1,2,3 等步骤,直接从 4. 编写持久层接口及抽象方法 开始,前面的步骤可以参考
Mybatis入门(五)SpringBoot整合Mybatis_1
有具体的讲解说明及详细步骤

项目目录结构:

在这里插入图片描述

1. 新增

  • 业务:增加用户数据
  • 编写持久层接口及抽象方法
    public interface UserMapper {
    
        /**
         * @param user 参数:添加数据的对象
         * @return int 返回值类型:表示影响的行数
         * 方法名可以为:insertXXX / saveXXX
         */
        int insertUser(User user);
    }
    
  • 将持久层接口交给Mybatis管理(写一次即可,下面其他的功能不需要再重复了)
    使用方式:启动类添加 @MapperScan 注解,这样就不需要在每个持久层 XXXMapper 接口上再添加 @Mapper 注解了
    @SpringBootApplication
    @MapperScan("com.cy.mybatis.mapper") // 扫描持久层所在包的路径
    public class MybatisDemo01Application {
    
        public static void main(String[] args) {
            SpringApplication.run(MybatisDemo01Application.class, args);
        }
    
    }
    
  • 编写映射文件
    <?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.cy.mybtis.mapper.UserMapper">
        
        <!--
            id:绑定/映射的对应方法的方法名称
            keyProperty:将取出的主键自增的值赋值给实体类中的 id 字段,与 useGeneratedKeys 搭配使用
            useGeneratedKeys:是否取出数据库中主键自增的主键,默认值为 false,与 keyProperty 搭配使用
        -->
        <!-- insert into user values(null,ls,"123",李四) -->
        <insert id="insertUser" keyProperty="id" useGeneratedKeys="true">
            insert into user values(#{id},#{username},#{password},#{nickname})
        </insert>
    
    </mapper>
    
  • 编写测试类及测试方法
    @SpringBootTest
    public class UserMapperTests {
    
        @Autowired
        UserMapper userMapper;
    
        @Test
        void testInsertUser() {
            User user = new User();
            user.setId(null);
            user.setUsername("ls");
            user.setPassword("123");
            user.setNickname("李四");
            int rows = userMapper.insertUser(user);
            System.out.println("rows = " + rows); // rows = 1 响应的行数
            System.out.println("id = " + user.getId()); // id = 1 插入的数据对应的id值
        }
    }
    

2. 查询

  • 业务:

    • 业务1:根据用户名查询用户对象
    • 业务2:查询所有用户对象
  • 编写持久层接口及抽象方法

        /**
         * 根据用户名查询用户信息
         * @param username 用户名
         * @return User 用户对象
         * 方法名可以为:findUserByUsername / selectUserByUsername
         */
        User findUserByUsername(String username);
        
    
        /**
         * 查询用户对象列表
         * @return List<User> 用户列表数据/用户集合数据
         * 方法名可以为:getUsers / getAllUser
         */
        List<User> getUsers();
    
  • 编写映射文件

     	<!-- select * from user where username = 'ls' -->
        <select id="findUserByUsername" resultType="com.cy.mybtis.pojo.entity.User">
            select * from user where username = #{username}
        </select>
    
        <!--
            resultType(结果类型) 查询中必须包含resultType或者resultMap属性
            如果返回的是一个对象,resultType的值为对应实体类的路径
            如果返回的是一个集合,resultType的值为对应泛型中类型的路径
        -->
        <!-- select * from user -->
        <select id="getUsers" resultType="com.cy.mybtis.pojo.entity.User">
            select * from user
        </select>
    
  • 编写测试类及测试方法

        @Test
        void testFindUserByUsername() {
            User user = userMapper.findUserByUsername("ls");
            System.out.println(user);
        }
    
        @Test
        void testGetUsers() {
            List<User> users = userMapper.getUsers();
            System.out.println(users);
        }
    

3. 修改

  • 业务:根据用户id修改用户信息
  • 编写持久层接口及抽象方法
    	/**
         * 根据id修改用户信息
         * @param user 用户信息
         * @return int 影响的行数
         * 方法名可以为:updateUsernameById
         */
        int updateUsernameById(User user);
    
  • 编写映射文件
    	<!--
            动态SQL标签:<if>
            经常使用的场景:where子句中,新增操作中,修改操作中
            这里以修改为例:通过判断参数值是否为空来决定是否将SQL字段加入到SQL语句中:
        -->
        <!--
            update user set username = ? where id= ?
            update user set username=#{username},password=#{password},nickname=#{nickname} where id=#{id}
        -->
        <update id="updateUsernameById">
            update user
            <set>
                <if test="username != null">username=#{username},</if>
                <if test="password != null">password=#{password},</if>
                <if test="nickname != null">nickname=#{nickname}</if>
            </set>
            where id=#{id}
        </update>
    
  • 编写测试类及测试方法
        @Test
        void testUpdateUsernameById() {
            User user = new User();
            user.setId(1);
            user.setUsername("ww");
            user.setNickname("王五");
            int rows = userMapper.updateUsernameById(user);
            System.out.println("rows = " + rows); // 影响的行数
        }
    

4. 删除

  • 业务:根据用户id删除用户对象

  • 编写持久层接口及抽象方法

        /**
         * 根据用户id删除用户对象
         * @param id 用户id
         * @return int 影响的行数
         * 方法名可以为:deleteUserById
         */
        int deleteUserById(int id);
    
  • 编写映射文件

    	<!--  delete from user where id=?  -->
        <delete id="deleteUserById">
            delete from user where id=#{id}
        </delete>
    
  • 编写测试类及测试方法

    	@Test
        void testDeleteUserById() {
            int id = 6;
            int rows = userMapper.deleteUserById(id);
            System.out.println("rows = " + rows);
        }
    

总结

  • 增 删 改 业务一般返回一个 int 类型,返回值为 影响的行数

  • 业务xml文件中必须加入 resultType 或者 resultMap 属性

  • 业务一般方法的命名 insertXXX 或者 saveXXX

  • 业务一般方法的命名 deleteXXXByXXX 或者 removeXXXByXXX

  • 业务一般方法的命名 updateXXXByXXX

  • 业务一般方法的命名 selectXXXByXXX 或者 findXXXByXXX

    • 查询单个对象方法的命名可以使用 getXXX
    • 查询多个对象方法的命名可以使用 listXXX
    • 获取统计值的方法的命名使用 countXXX
  • 测试方法命名规则:

    • 类名:测试的为架构中的那个层次,哪个对应的接口,就进行对应的命名 xxxMapperTestsxxxServiceTests,如 UserMapperTests
    • 方法名:test + 对应测试的方法名:testxxx,如 testInsertUsertestSelectUserById

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107605.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!