当前位置:   article > 正文

springboot整合Mybatis实现增删改查_springboot 整合mybatis 增删改查

springboot 整合mybatis 增删改查

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~

 

springboot整合Mybatis实现增删改查

 1 前言      

      持久层框架有很多,常见的持久层框架实现有spring-data-jpa、mybatis(mybatis-plus)和hibernate等。本教程将以mybatis持久层框架为例,详述springboot整合mybatis框架的过程,并最终通过注解和xml两种方式实现数据增删改查(CRUD)操作。

 

2 什么是mybatis?

      mybatis官方文档中的解释:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

      也就是mybatis对数据库操作做了大量封装,使得开发者拿来即用,减少开发成本。同时mybatis支持注解和xml两种映射方式,也提供对原生sql的支持。

 

3 创建springboot项目

      创建springboot项目的过程非常简单,此处省略。下面是已经建好的springboot项目的目录结构。

      项目名称:mybatis-demo

 

4 安装mysql数据库

4.1 安装mysql数据库      

      略!关注微信公众号:IT特靠谱,回复"我要mysql安装教程"免费领取吧~

 

4.2 创建表并初始化数据

      mysql数据库连接信息如下:

  1. url: jdbc:mysql://localhost:3306/test_mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
  2. username: root
  3. password: root

       创建的数据库表:user_t 给数据库表user_t添加唯一索引。索引字段为:mobile,索引名:udx_user_mobile。创建表的sql脚本如下:

  1. CREATE TABLE `user_t` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  3. `mobile` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户手机号',
  4. `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  5. `age` tinyint(4) NULL DEFAULT NULL COMMENT '年龄',
  6. `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  7. `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '最后更新时间',
  8. PRIMARY KEY (`id`) USING BTREE,
  9. UNIQUE INDEX `udx_user_mobile`(`mobile`) USING BTREE COMMENT '用户手机号唯一索引'
  10. ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

 

     

      我们先往user_t数据库表中插入如下4条数据,用于查询测试!

  1. INSERT INTO `user_t` VALUES (1, '13111111111', '张三', 10, '2020-10-22 15:58:51', '2020-10-22 18:26:31');
  2. INSERT INTO `user_t` VALUES (2, '13555555555', '李四', 20, '2020-10-22 15:58:59', '2020-10-22 18:26:33');
  3. INSERT INTO `user_t` VALUES (3, '13666666666', '王五', 20, '2020-10-22 15:59:15', '2020-10-22 18:26:35');
  4. INSERT INTO `user_t` VALUES (4, '15222222222', '小六', 40, '2020-10-22 17:30:21', '2020-10-22 18:26:39');

 

 

5 springboot整合mybatis

5.1 引入jar包

      项目pom.xml文件中添加mysql数据库驱动、数据库连接池和mybatis相关依赖包。

  1. <!--持久化api依赖包:与数据库交互,比如Java bean和数据库表的对应关系-->
  2. <dependency>
  3. <groupId>javax.persistence</groupId>
  4. <artifactId>persistence-api</artifactId>
  5. <version>1.0</version>
  6. </dependency>
  7. <!--mybatis依赖包-->
  8. <dependency>
  9. <groupId>org.mybatis.spring.boot</groupId>
  10. <artifactId>mybatis-spring-boot-starter</artifactId>
  11. <version>2.1.1</version>
  12. </dependency>
  13. <!-- mybatis通用Mapper依赖包:提供了基本的增删改查Mapper -->
  14. <dependency>
  15. <groupId>tk.mybatis</groupId>
  16. <artifactId>mapper-spring-boot-starter</artifactId>
  17. <version>1.2.4</version>
  18. </dependency>
  19. <!--mysql数据库驱动包-->
  20. <dependency>
  21. <groupId>mysql</groupId>
  22. <artifactId>mysql-connector-java</artifactId>
  23. <version>5.1.35</version>
  24. </dependency>
  25. <!--Druid数据库连接池-->
  26. <dependency>
  27. <groupId>com.alibaba</groupId>
  28. <artifactId>druid-spring-boot-starter</artifactId>
  29. <version>1.1.10</version>
  30. </dependency>

 

5.2 配置数据源

      在application.properties或application.yml配置文件中添加如下配置。

      1)配置数据源

      2)指定Mapper.xml资源文件所在路径

      3)开启sql日志

  1. #mysql配置数据源
  2. spring:
  3. datasource:
  4. driver-class-name: com.mysql.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/test_mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
  6. username: root
  7. password: root
  8. #指定Mapper.xml所在路径
  9. mybatis:
  10. mapper-locations: classpath:mapping/*Mapper.xml
  11. type-aliases-package: com.hc.mybatisdemo.entity
  12. #打印sql日志
  13. logging:
  14. level:
  15. com:
  16. hc:
  17. mybatisdemo:
  18. mapper: debug

 

5.3 扫描Mapper接口

  1. //注意这里需要引入tk.mybatis这个依赖
  2. import tk.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @MapperScan("com.hc.mybatisdemo.mapper") //扫描的mapper包路径
  7. public class MybatisDemoApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(MybatisDemoApplication.class, args);
  10. }
  11. }

 

6 编写代码实现增删CRUD

6.1 创建实体类

       实体类: User.java

  1. import com.fasterxml.jackson.annotation.JsonFormat;
  2. import java.util.Date;
  3. import javax.persistence.Column;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. import lombok.AllArgsConstructor;
  9. import lombok.Builder;
  10. import lombok.Data;
  11. import lombok.NoArgsConstructor;
  12. import org.springframework.format.annotation.DateTimeFormat;
  13. /**
  14. * 用户实体类
  15. */
  16. @Data
  17. @Builder
  18. @NoArgsConstructor
  19. @AllArgsConstructor
  20. @Table(name = "user_t")
  21. public class User {
  22. /**
  23. * 主键id
  24. */
  25. @Id
  26. @GeneratedValue(strategy = GenerationType.IDENTITY)
  27. @Column(name = "id")
  28. private Long id;
  29. /**
  30. * 用户手机号
  31. */
  32. @Column(name = "mobile")
  33. private String mobile;
  34. /**
  35. * 用户名
  36. */
  37. @Column(name = "user_name")
  38. private String userName;
  39. /**
  40. * 年龄
  41. */
  42. @Column(name = "age")
  43. private Integer age;
  44. /**
  45. * 创建时间
  46. */
  47. @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") //写入数据库时格式化
  48. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") //数据库查询后json格式化
  49. @Column(name = "create_time")
  50. private Date createTime;
  51. /**
  52. * 创建时间
  53. */
  54. @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
  55. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
  56. @Column(name = "update_time")
  57. private Date updateTime;
  58. }

 

6.2 创建Mapper接口类

      Mapper接口类:UserMapper.java

  1. import com.hc.mybatisdemo.entity.User;
  2. import java.util.List;
  3. import org.apache.ibatis.annotations.Delete;
  4. import org.apache.ibatis.annotations.Insert;
  5. import org.apache.ibatis.annotations.Mapper;
  6. import org.apache.ibatis.annotations.Param;
  7. import org.apache.ibatis.annotations.Select;
  8. import org.apache.ibatis.annotations.Update;
  9. import tk.mybatis.mapper.common.BaseMapper;
  10. import tk.mybatis.mapper.common.MySqlMapper;
  11. /**
  12. * UserMapper接口
  13. */
  14. @Mapper
  15. public interface UserMapper extends BaseMapper<User>, MySqlMapper<User> {
  16. /**
  17. * 根据id查询
  18. */
  19. User findById(Long id);
  20. /**
  21. * 根据用户名获取用户信息 注意:like模糊查询的占位符用${},不能用#{}
  22. */
  23. @Select(value = "select id, mobile, user_name as userName, age, create_time as createTime, update_time as updateTime from user_t where user_name like '%${userName}'")
  24. List<User> findByUserName(@Param("userName") String userName);
  25. /**
  26. * 更新id数据的用户名和年龄信息方式1
  27. */
  28. @Update(value = "update user_t set user_name = #{userName}, age = #{age} where id = #{id}")
  29. Integer updateById1(@Param("userName") String userName, @Param("age") Integer age, @Param("id") Long id);
  30. /**
  31. * 删除id数据方式1
  32. */
  33. @Delete(value = "delete from user_t where id = #{id}")
  34. Integer deleteById1(@Param("id") Long id);
  35. /**
  36. * 更新数据方式2
  37. */
  38. Integer updateById2(User user);
  39. /**
  40. * 删除id数据方式2
  41. *
  42. * @param id 被删除的数据id
  43. */
  44. Integer deleteById2(Long id);
  45. }

 

6.3 创建UserMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.hc.mybatisdemo.mapper.UserMapper">
  4. <resultMap id="BaseResultMap" type="com.hc.mybatisdemo.entity.User">
  5. <result column="id" jdbcType="VARCHAR" property="id"/>
  6. <result column="mobile" jdbcType="VARCHAR" property="mobile"/>
  7. <result column="user_name" jdbcType="VARCHAR" property="userName"/>
  8. <result column="age" jdbcType="INTEGER" property="age"/>
  9. <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
  10. <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
  11. </resultMap>
  12. <select id="findById" resultMap="BaseResultMap">
  13. select * from user_t where id = #{id}
  14. </select>
  15. <!--<select id="findById" resultType="com.hc.mybatisdemo.entity.User">-->
  16. <!--select * from user_t where id = #{id}-->
  17. <!--</select>-->
  18. <update id="updateById" parameterType="com.hc.mybatisdemo.entity.User">
  19. update user_t set user_name = #{userName}, age = #{age} where id = #{id};
  20. </update>
  21. <delete id="deleteById" parameterType="String">
  22. delete from user_t where id = #{id};
  23. </delete>
  24. </mapper>

 

6.4 创建业务层接口类

      创建业务层接口类:IUserService.java

  1. import com.hc.mybatisdemo.entity.User;
  2. import java.util.List;
  3. import org.springframework.stereotype.Service;
  4. /**
  5. * 用户service接口
  6. */
  7. @Service
  8. public interface IUserService {
  9. /**
  10. * 查询一个
  11. */
  12. User findOne(Long id);
  13. /**
  14. * 根据用户名获取用户列表
  15. */
  16. List<User> findByUserName(String userName);
  17. /**
  18. * 插入一条数据
  19. */
  20. Integer insert(User user);
  21. /**
  22. * 更新一条数据
  23. */
  24. Integer updateById(User user);
  25. /**
  26. * 删除一条数据
  27. */
  28. Integer deleteById(Long id);
  29. /**
  30. * 事务控制测试--删除id1和id2两条数据
  31. */
  32. Integer transactionTest(Long id1, Long id2);
  33. }

 

6.5 创建业务层接口实现类

      创建业务层接口实现类:UserServiceImpl.java

  1. import com.hc.mybatisdemo.entity.User;
  2. import com.hc.mybatisdemo.mapper.UserMapper;
  3. import com.hc.mybatisdemo.service.IUserService;
  4. import java.util.List;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import org.springframework.transaction.annotation.Transactional;
  9. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  10. /**
  11. * 用户service实现类
  12. */
  13. @Slf4j
  14. @Service
  15. public class UserServiceImpl implements IUserService {
  16. @Autowired
  17. private UserMapper userMapper;
  18. /**
  19. * 查询一个
  20. */
  21. @Override
  22. public User findOne(Long id) {
  23. return userMapper.findById(id);
  24. }
  25. /**
  26. * 根据用户名获取用户列表
  27. */
  28. @Override
  29. public List<User> findByUserName(String userName) {
  30. return userMapper.findByUserName(userName);
  31. }
  32. /**
  33. * 新增一条数据
  34. */
  35. @Override
  36. public Integer insert(User user) {
  37. return userMapper.insertSelective(user);
  38. }
  39. /**
  40. * 更新一条数据
  41. */
  42. @Override
  43. public Integer updateById(User user) {
  44. // return userDao.updateById1(user.getUserName(), user.getAge(), user.getId());
  45. return userMapper.updateById2(user);
  46. }
  47. /**
  48. * 删除一条数据
  49. */
  50. @Override
  51. public Integer deleteById(Long id) {
  52. // return userDao.deleteById1(id);
  53. return userMapper.deleteById2(id);
  54. }
  55. /**
  56. * 事务控制测试--删除id1和id2两条数据
  57. */
  58. @Override
  59. @Transactional(rollbackFor = Exception.class)
  60. public Integer transactionTest(Long id1, Long id2) {
  61. try {
  62. userMapper.deleteById1(id1);
  63. userMapper.deleteById1(id2);
  64. int a = 0;
  65. int b = 10 / a;//模拟抛出异常
  66. } catch (Exception e) {
  67. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  68. return 0;
  69. }
  70. return 1;
  71. }
  72. }

 

6.6 创建控制层api类

      创建控制层api类:UserController.java

  1. import com.hc.mybatisdemo.entity.User;
  2. import com.hc.mybatisdemo.service.IUserService;
  3. import java.util.List;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.DeleteMapping;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.PutMapping;
  9. import org.springframework.web.bind.annotation.RequestBody;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RestController;
  12. /**
  13. * 用户控制器
  14. */
  15. @RestController
  16. @RequestMapping(value = "/user")
  17. public class UserController {
  18. @Autowired
  19. private IUserService userService;
  20. /**
  21. * 根据id查询
  22. */
  23. @GetMapping(value = "findOne")
  24. public User findOne(Long id) {
  25. User user = userService.findOne(id);
  26. return user;
  27. }
  28. /**
  29. * 根据用户名获取用户列表
  30. */
  31. @GetMapping(value = "findByUserName")
  32. public List<User> findByUserName(String userName) {
  33. return userService.findByUserName(userName);
  34. }
  35. /**
  36. * 新增一条数据
  37. */
  38. @PostMapping(value = "insert")
  39. public Integer insert(@RequestBody User user) {
  40. return userService.insert(user);
  41. }
  42. /**
  43. * 更新一条数据
  44. */
  45. @PutMapping(value = "update")
  46. public Integer update(@RequestBody User user) {
  47. return userService.updateById(user);
  48. }
  49. /**
  50. * 根据用户名获取用户列表
  51. */
  52. @DeleteMapping(value = "delete")
  53. public Integer delete(Long id) {
  54. return userService.deleteById(id);
  55. }
  56. /**
  57. * 事务控制测试
  58. */
  59. @GetMapping(value = "transactionTest")
  60. public Integer transactionTest(Long id1, Long id2) {
  61. return userService.transactionTest(id1, id2);
  62. }
  63. }

 

7 测试API

7.1 根据id查询一条数据

      查询id为2的数据。

 

7.2 模糊查询

      左模糊查询。查询以“五”结尾的用户名数据。

 

7.3 保存一条数据

      插入一条用户名为“老七”的记录。

      保存结果:

 

7.4 更新一条数据

      将id为5的数据的用户名更新为“老七七”,年龄更新为75。

      更新后结果:

 

7.5 删除一条数据

      删除id为5的数据。

      删除后结果:

 

7.6 事务控制(Transaction)测试

      调用事务控制测试api接口(接口的业务层会删除id为1和2的两条数据),但是我们人为埋下了一个抛出异常的代码(int b = 10/a;)。理想结果:由于代码抛出异常,那么两条数据都不会被删除,因为事务回滚了!

      调用接口,删除id为1和2的两条数据:

      测试结果如下,可见事务回滚了。id为1和2的数据都没有删除成功。证明了同一个事务种mysql操作的原子性和一致性。

      关注微信公众号并回复"我要mybatis整合源码",免费获取本教程mybatis-demo源码~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/232866
推荐阅读
相关标签
  

闽ICP备14008679号