文章目录
一、SpringBoot整合Mybatis步骤
1. 导入依赖
- 必选项
- 数据源(MySQL)
- 导入SpringBoot整合的持久层框架(Mybatis)
- 可选项
- lombok(提供简单的实体类常用方法,日志等功能)
2. 编写配置文件
- 数据库连接配置
- Mybatis映射文件地址/路径绑定
3. 编写POJO实体类用于封装数据
- 必写项
- entity(与单表对应)
- 选写项
- vo(数据库中查询出来的信息)
- dto(前端接受过来的数据)
4. 编写持久层接口及抽象方法
5. 将持久层接口交给Mybatis管理
下列情况任选其一即可:
- 在对应的
XXXMapper接口上添加@Mapper注解 - 在配置类上添加
@MapperScan("持久层接口所在包的全路径名")- 使用现有的配置类 SpringBoot项目的启动类
XXXSpringBootApplication - 自己创建一个配置类
- 使用现有的配置类 SpringBoot项目的启动类
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
- 查询单个对象方法的命名可以使用
-
测试方法命名规则:
- 类名:测试的为架构中的那个层次,哪个对应的接口,就进行对应的命名
xxxMapperTests、xxxServiceTests,如UserMapperTests - 方法名:test + 对应测试的方法名:
testxxx,如testInsertUser、testSelectUserById
- 类名:测试的为架构中的那个层次,哪个对应的接口,就进行对应的命名
1万+

被折叠的 条评论
为什么被折叠?



