SpringBoot整合MyBatis

╰+哭是因爲堅強的太久メ 2022-05-25 13:49 306阅读 0赞

一、数据准备

  1. CREATE TABLE `tb_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `username` varchar(50) NOT NULL COMMENT '用户名', `age` int(11) NOT NULL COMMENT '年龄', `ctm` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  2. INSERT INTO `db_test`.`tb_user` (`username`, `age`, `ctm`) VALUES('张三', '18', NOW()) ;
  3. INSERT INTO `db_test`.`tb_user` (`username`, `age`, `ctm`) VALUES('李四', '20', NOW()) ;
  4. INSERT INTO `db_test`.`tb_user` (`username`, `age`, `ctm`) VALUES('王五', '19', NOW()) ;

二、引入依赖

  1. <!-- Spring-Mybatis -->
  2. <dependency>
  3. <groupId>org.mybatis.spring.boot</groupId>
  4. <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency>
  5. <!-- MySQL -->
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. </dependency>

另外web依赖也需要,因为我们采用MVC模式。

  1. <!-- Add typical dependencies for a web application -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>

三、数据库配置文件

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.jdbc.Driver
  4. url: jdbc:mysql://localhost:3306/db_user
  5. username: root
  6. password: root

四、代码

最开始使用mybati比较麻烦,各种配置文件、实体类、dao层映射关联、还有一大推其它配置。当然mybatis也发现了这种弊端,初期开发了generator可以根据表结果自动生产实体类、配置文件和dao层代码,可以减轻一部分开发量;后期也进行了大量的优化可以使用注解了。

于是两种使用方式都介绍一下,一、无配置注解版 二、配置文件版

1.无配置文件注解版

加入配置文件

  1. mybatis:
  2. type-aliases-package: cn.saytime.bean

这里写图片描述

实体类User.class

  1. package cn.saytime.bean;
  2. import java.util.Date;
  3. /** * @ClassName cn.saytime.bean.User * @Description * @date 2017-07-04 22:47:28 */
  4. public class User {
  5. private int id;
  6. private String username;
  7. private int age;
  8. private Date ctm;
  9. public User() {
  10. }
  11. public User(String username, int age) {
  12. this.username = username;
  13. this.age = age;
  14. this.ctm = new Date();
  15. }
  16. // Getter、Setter
  17. }

UserMapper.class

  1. package cn.saytime.mapper;
  2. import cn.saytime.bean.User;
  3. import org.apache.ibatis.annotations.Delete;
  4. import org.apache.ibatis.annotations.Insert;
  5. import org.apache.ibatis.annotations.Param;
  6. import org.apache.ibatis.annotations.Select;
  7. import org.apache.ibatis.annotations.Update;
  8. import java.util.List;
  9. // @Mapper 这里可以使用@Mapper注解,但是每个mapper都加注解比较麻烦,所以统一配置@MapperScan在扫描路径在application类中
  10. public interface UserMapper {
  11. @Select("SELECT * FROM tb_user WHERE id = #{id}")
  12. User getUserById(Integer id);
  13. @Select("SELECT * FROM tb_user")
  14. public List<User> getUserList();
  15. @Insert("insert into tb_user(username, age, ctm) values(#{username}, #{age}, now())")
  16. public int add(User user);
  17. @Update("UPDATE tb_user SET username = #{user.username} , age = #{user.age} WHERE id = #{id}")
  18. public int update(@Param("id") Integer id, @Param("user") User user);
  19. @Delete("DELETE from tb_user where id = #{id} ")
  20. public int delete(Integer id);
  21. }

Mybatis 注解使用 http://www.mybatis.org/mybatis-3/zh/java-api.html

UserService.class

  1. package cn.saytime.service;
  2. import cn.saytime.bean.User;
  3. import org.springframework.stereotype.Service;
  4. import java.util.List;
  5. /** * @ClassName cn.saytime.service.UserService * @Description */
  6. public interface UserService {
  7. User getUserById(Integer id);
  8. public List<User> getUserList();
  9. public int add(User user);
  10. public int update(Integer id, User user);
  11. public int delete(Integer id);
  12. }

UserServiceimpl.class

  1. package cn.saytime.service.impl;
  2. import cn.saytime.bean.User;
  3. import cn.saytime.mapper.UserMapper;
  4. import cn.saytime.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. /** * @ClassName cn.saytime.service.impl.UserServiceImpl * @Description */
  9. @Service public class UserServiceImpl implements UserService {
  10. @Autowired private UserMapper userMapper;
  11. @Override public User getUserById(Integer id) {
  12. return userMapper.getUserById(id);
  13. }
  14. @Override public List<User> getUserList() {
  15. return userMapper.getUserList();
  16. }
  17. @Override public int add(User user) {
  18. return userMapper.add(user);
  19. }
  20. @Override public int update(Integer id, User user) {
  21. return userMapper.update(id, user);
  22. }
  23. @Override public int delete(Integer id) {
  24. return userMapper.delete(id);
  25. }
  26. }

JsonResult.class 通用json返回类

  1. package cn.saytime.bean;
  2. public class JsonResult {
  3. private String status = null;
  4. private Object result = null;
  5. public JsonResult status(String status) {
  6. this.status = status;
  7. return this;
  8. }
  9. // Getter Setter
  10. }

UserController.class(Restful风格)

  1. package cn.saytime.web;
  2. import cn.saytime.bean.JsonResult;
  3. import cn.saytime.bean.User;
  4. import cn.saytime.service.UserService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.http.HttpStatus;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestBody;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.RequestParam;
  13. import org.springframework.web.bind.annotation.RestController;
  14. import java.util.List;
  15. /** * @ClassName cn.saytime.web.UserController * @Description * @date 2017-07-04 22:46:14 */
  16. @RestController
  17. public class UserController {
  18. @Autowired
  19. private UserService userService;
  20. /** * 根据ID查询用户 * @param id * @return */
  21. @RequestMapping(value = "user/{id}", method = RequestMethod.GET)
  22. public ResponseEntity<JsonResult> getUserById (@PathVariable(value = "id") Integer id){
  23. JsonResult r = new JsonResult();
  24. try {
  25. User user = userService.getUserById(id);
  26. r.setResult(user);
  27. r.setStatus("ok");
  28. } catch (Exception e) {
  29. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  30. r.setStatus("error");
  31. e.printStackTrace();
  32. }
  33. return ResponseEntity.ok(r);
  34. }
  35. /** * 查询用户列表 * @return */
  36. @RequestMapping(value = "users", method = RequestMethod.GET)
  37. public ResponseEntity<JsonResult> getUserList (){
  38. JsonResult r = new JsonResult();
  39. try {
  40. List<User> users = userService.getUserList();
  41. r.setResult(users);
  42. r.setStatus("ok");
  43. } catch (Exception e) {
  44. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  45. r.setStatus("error");
  46. e.printStackTrace();
  47. }
  48. return ResponseEntity.ok(r);
  49. }
  50. /** * 添加用户 * @param user * @return */
  51. @RequestMapping(value = "user", method = RequestMethod.POST)
  52. public ResponseEntity<JsonResult> add (@RequestBody User user){
  53. JsonResult r = new JsonResult();
  54. try {
  55. int orderId = userService.add(user);
  56. if (orderId < 0) {
  57. r.setResult(orderId);
  58. r.setStatus("fail");
  59. } else {
  60. r.setResult(orderId);
  61. r.setStatus("ok");
  62. }
  63. } catch (Exception e) {
  64. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  65. r.setStatus("error");
  66. e.printStackTrace();
  67. }
  68. return ResponseEntity.ok(r);
  69. }
  70. /** * 根据id删除用户 * @param id * @return */
  71. @RequestMapping(value = "user/{id}", method = RequestMethod.DELETE)
  72. public ResponseEntity<JsonResult> delete (@PathVariable(value = "id") Integer id){
  73. JsonResult r = new JsonResult();
  74. try {
  75. int ret = userService.delete(id);
  76. if (ret < 0) {
  77. r.setResult(ret);
  78. r.setStatus("fail");
  79. } else {
  80. r.setResult(ret);
  81. r.setStatus("ok");
  82. }
  83. } catch (Exception e) {
  84. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  85. r.setStatus("error");
  86. e.printStackTrace();
  87. }
  88. return ResponseEntity.ok(r);
  89. }
  90. /** * 根据id修改用户信息 * @param user * @return */
  91. @RequestMapping(value = "user/{id}", method = RequestMethod.PUT)
  92. public ResponseEntity<JsonResult> update (@PathVariable("id") Integer id, @RequestBody User user){
  93. JsonResult r = new JsonResult();
  94. try {
  95. int ret = userService.update(id, user);
  96. if (ret < 0) {
  97. r.setResult(ret);
  98. r.setStatus("fail");
  99. } else {
  100. r.setResult(ret);
  101. r.setStatus("ok");
  102. }
  103. } catch (Exception e) {
  104. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  105. r.setStatus("error");
  106. e.printStackTrace();
  107. }
  108. return ResponseEntity.ok(r);
  109. }
  110. }

Application.java

  1. package cn.saytime;
  2. import org.mybatis.spring.annotation.MapperScan;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. @SpringBootApplication
  6. @MapperScan("cn.saytime.mapper")
  7. public class SpringbootMybaitsApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(SpringbootMybaitsApplication.class, args);
  10. }
  11. }

使用PostMan通过测试。

2.配置文件版

加入配置文件

  1. mybatis:
  2. mapper-locations: classpath:mybatis/mapper/*.xml
  3. config-location: classpath:mybatis/mybatis-config.xml

项目目录结构:

这里写图片描述

代码部分,相比于上面那种方式,改变的只有配置文件以及下面几个部分。

UserMapper.class

  1. package cn.saytime.mapper;
  2. import cn.saytime.bean.User;
  3. import org.apache.ibatis.annotations.Delete;
  4. import org.apache.ibatis.annotations.Insert;
  5. import org.apache.ibatis.annotations.Param;
  6. import org.apache.ibatis.annotations.Select;
  7. import org.apache.ibatis.annotations.Update;
  8. import org.springframework.stereotype.Repository;
  9. import java.util.List;
  10. /** * @ClassName cn.saytime.mapper.UesrMapper * @Description */
  11. @Repository public interface UserMapper {
  12. User getUserById(Integer id);
  13. public List<User> getUserList();
  14. public int add(User user);
  15. public int update(@Param("id") Integer id, @Param("user") User user);
  16. public int delete(Integer id);
  17. }

mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <typeAliases>
  5. </typeAliases>
  6. </configuration>

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="cn.saytime.mapper.UserMapper" >
  4. <resultMap id="BaseResultMap" type="cn.saytime.bean.User" >
  5. <id column="id" property="id" jdbcType="INTEGER" />
  6. <result column="username" property="username" jdbcType="VARCHAR" />
  7. <result column="age" property="age" jdbcType="INTEGER" />
  8. <result column="ctm" property="ctm" jdbcType="TIMESTAMP"/>
  9. </resultMap>
  10. <sql id="Base_Column_List" >
  11. id, username, age, ctm
  12. </sql>
  13. <select id="getUserList" resultMap="BaseResultMap" >
  14. SELECT
  15. <include refid="Base_Column_List" />
  16. FROM tb_user
  17. </select>
  18. <select id="getUserById" parameterType="java.lang.Integer" resultMap="BaseResultMap" >
  19. SELECT
  20. <include refid="Base_Column_List" />
  21. FROM tb_user
  22. WHERE id = #{id}
  23. </select>
  24. <insert id="add" parameterType="cn.saytime.bean.User" >
  25. INSERT INTO
  26. tb_user
  27. (username,age,ctm)
  28. VALUES
  29. (#{username}, #{age}, now())
  30. </insert>
  31. <update id="update" parameterType="java.util.Map" >
  32. UPDATE
  33. tb_user
  34. SET
  35. username = #{user.username},age = #{user.age}
  36. WHERE
  37. id = #{id}
  38. </update>
  39. <delete id="delete" parameterType="java.lang.Integer" >
  40. DELETE FROM
  41. tb_user
  42. WHERE
  43. id = #{id}
  44. </delete>
  45. </mapper>

上面这种方式也使用PostMan通过测试。

五、简要说明

不知道大家有没有注意到一点,就是引入Springboot-mybatis依赖的时候,并不是spring官方的starter,往常的springboot集成的依赖,比如web,redis等,groupId以及artifactId的地址如下:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

而这里是mybatis为spring提供的starter依赖,所以依赖地址是:

  1. <dependency>
  2. <groupId>org.mybatis.spring.boot</groupId>
  3. <artifactId>mybatis-spring-boot-starter</artifactId>
  4. <version>1.3.0</version>
  5. </dependency>

而且值得注意的是,这里必须要指定版本号,往常我们使用springboot之所以不需要指定版本号,是因为我们引入的Maven Parent 中指定了SpringBoot的依赖,SpringBoot官方依赖Pom文件中已经指定了它自己集成的第三方依赖的版本号,对于Mybatis,Spring官方并没有提供自己的starter,所以必须跟正常的maven依赖一样,要加版本号。

SpringBoot自己集成的starter依赖,可以查看 http://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#using-boot-starter

参考:https://blog.csdn.net/saytime/article/details/74783296

发表评论

表情:
评论列表 (有 0 条评论,306人围观)

还没有评论,来说两句吧...

相关阅读