在公司项目开发中,使用Mybatis居多。在 SpringBoot:3.SpringBoot使用Spring-data-jpa实现数据库访问 中,这种jpa风格的把sql语句和java代码放到一起,总感觉分离的不够彻底。基于个人习惯,还是比较喜欢把代码和sql分开,sql语句在xml文件里不管多复杂,写到xml里看起来比较简单,不是那么臃肿。

1.整合Mybatis

1.1 添加pom.xml依赖

主要就四个依赖:

spring-boot-starter-test、spring-boot-starter:用于做单元测试

mybatis-spring-boot-starter:Mybatis核心依赖

mysql-connector-java:Mysql依赖,访问数据库

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.mybatis.spring.boot</groupId>
  12. <artifactId>mybatis-spring-boot-starter</artifactId>
  13. <version>1.1.1</version>
  14. </dependency>
  15. <!-- 引入MySQL连接的依赖包 -->
  16. <dependency>
  17. <groupId>mysql</groupId>
  18. <artifactId>mysql-connector-java</artifactId>
  19. <version>5.1.21</version>
  20. </dependency>

1.2 配置数据库信息

在application.properties 配置相关mysql信息

  1. #数据库配置
  2. spring.datasource.url=jdbc:mysql://localhost:3306/test
  3. spring.datasource.username=root
  4. spring.datasource.password=123456
  5. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  6. #mybatis放置xml文件的地方,我们配置在classpath下的mapper文件夹下
  7. mybatis.mapper-locations=classpath*:mapper/*.xml

1.3 创建user表

通过下面的sql语句创建user表信息:包括id、name(名字)、age(年龄)。

  1. DROP TABLE IF EXISTS `user`;
  2. CREATE TABLE `user` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `name` varchar(255) DEFAULT NULL,
  5. `age` int(11) DEFAULT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

1.4 创建实体类

创建user表的映射实体类。

  1. package com.w3cjava.entity;
  2. public class User {
  3. private Long id;
  4. private String name;
  5. private Integer age;
  6. public User() {
  7. }
  8. public User(String name, int age) {
  9. this.name = name;
  10. this.age = age;
  11. }
  12. public Long getId() {
  13. return id;
  14. }
  15. public void setId(Long id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public Integer getAge() {
  25. return age;
  26. }
  27. public void setAge(Integer age) {
  28. this.age = age;
  29. }
  30. }

1.5 数据访问层Dao

创建User实体类的UserDao层,实现简单的增删改查操作。

  1. package com.w3cjava.dao;
  2. import java.util.List;
  3. import java.util.Map;
  4. import org.apache.ibatis.annotations.Mapper;
  5. import org.apache.ibatis.annotations.Param;
  6. import com.w3cjava.entity.User;
  7. @Mapper
  8. public interface UserDao{
  9. int insert(@Param("name") String name, @Param("age") Integer age);
  10. /**
  11. *
  12. * @author cos
  13. * @desc 通过Map<String, Object>对象来作为传递参数的容器
  14. * @param map
  15. * @return
  16. */
  17. int insertByMap(Map<String, Object> map);
  18. /**
  19. *
  20. * @author cos
  21. * @desc 使用对象
  22. * @param user
  23. * @return
  24. */
  25. int insert(User user);
  26. void update(User user);
  27. void delete(Long id);
  28. /**
  29. *
  30. * @author cos
  31. * @desc 返回结果的绑定
  32. * @return
  33. */
  34. List<User> findAll();
  35. /**
  36. *
  37. * @author cos
  38. * @desc 使用@Param传参,@Param中定义的name对应了SQL中的#{name},age对应了SQL中的#{age}
  39. * @param name
  40. * @return
  41. */
  42. User findByName(@Param("name") String name);
  43. }

1.6 数据访问xml映射

通过mybatis.mapper-locations=classpath:mapper/.xml配置,我们将在classpath路径的mapper文件夹下创建UserDao对应的映射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.w3cjava.dao.UserDao">
  4. <sql id="testColumns">
  5. a.id AS "id",
  6. a.name AS "name",
  7. a.age AS "age"
  8. </sql>
  9. <sql id="testJoins">
  10. </sql>
  11. <!-- 查询所有user -->
  12. <select id="findByName" resultType="com.w3cjava.entity.User">
  13. select
  14. <include refid="testColumns"/>
  15. from user a
  16. WHERE a.name = #{name}
  17. </select>
  18. <!-- 查询所有user -->
  19. <select id="findAll" resultType="com.w3cjava.entity.User">
  20. select
  21. <include refid="testColumns"/>
  22. from user a
  23. </select>
  24. <insert id="insert">
  25. INSERT INTO user(
  26. name,
  27. age
  28. ) VALUES (
  29. #{name},
  30. #{age}
  31. )
  32. </insert>
  33. <insert id="insertByMap">
  34. INSERT INTO user(
  35. name,
  36. age
  37. ) VALUES (
  38. #{name,jdbcType=VARCHAR},
  39. #{age,jdbcType=INTEGER}
  40. )
  41. </insert>
  42. <update id="update">
  43. UPDATE user SET age=#{age} WHERE name=#{name}
  44. </update>
  45. <delete id="delete">
  46. DELETE FROM user WHERE id =#{id}
  47. </delete>
  48. </mapper>

2.应用启动类

创建应用主类。@EnableTransactionManagement之所以加上这个注解,是为了后面每一个单元测试时使用回顾注解,保证数据库数据测试完成后不被污染。以便开始下一个测试。

  1. package com.w3cjava;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.transaction.annotation.EnableTransactionManagement;
  5. /**
  6. *
  7. * @class SpringBootMybatisApplication
  8. * @version SpringBoot 2.1.9
  9. * @author cos
  10. * @desc 整合Mybatis
  11. *
  12. */
  13. @SpringBootApplication
  14. @EnableTransactionManagement
  15. public class SpringBootMybatisApplication {
  16. public static void main(String[] args) {
  17. SpringApplication.run(SpringBootMybatisApplication.class, args);
  18. }
  19. }

3.单元测试

测试基本逻辑:

  • 向数据库中插入数据
  • 查询部分数据
  • 通过使用@Rollback、@Transactional回滚数据,保证每一次单元测试数据的独立性。
  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest(classes = {SpringBootMybatisApplication.class})
  3. public class UserServiceTest {
  4. @Autowired
  5. private UserDao userDao;
  6. @Test
  7. @Transactional
  8. @Rollback
  9. public void insert() throws Exception {
  10. userDao.insert("AAA", 20);
  11. }
  12. @Test
  13. @Transactional
  14. @Rollback
  15. public void findByName() throws Exception {
  16. userDao.insert("AAA", 20);
  17. User u = userDao.findByName("AAA");
  18. Assert.assertEquals(20, u.getAge().intValue());
  19. }
  20. @Test
  21. @Transactional
  22. @Rollback
  23. public void testMap() throws Exception{
  24. Map<String, Object> map = new HashMap<>();
  25. map.put("name", "CCC");
  26. map.put("age", 40);
  27. userDao.insertByMap(map);
  28. }
  29. @Test
  30. @Transactional
  31. @Rollback
  32. public void testuserDao() throws Exception {
  33. // insert一条数据,并select出来验证
  34. userDao.insert("AAA", 20);
  35. User u = userDao.findByName("AAA");
  36. Assert.assertEquals(20, u.getAge().intValue());
  37. // update一条数据,并select出来验证
  38. u.setAge(30);
  39. userDao.update(u);
  40. u = userDao.findByName("AAA");
  41. Assert.assertEquals(30, u.getAge().intValue());
  42. // 删除这条数据,并select验证
  43. userDao.delete(u.getId());
  44. u = userDao.findByName("AAA");
  45. Assert.assertEquals(null, u);
  46. }
  47. @Test
  48. @Transactional
  49. @Rollback
  50. public void testSelectMapper() throws Exception {
  51. List<User> userList = userDao.findAll();
  52. for(User user : userList) {
  53. Assert.assertEquals(null, user.getId());
  54. Assert.assertNotEquals(null, user.getName());
  55. }
  56. }
  57. }

4.参考文章

spring-test @Rollback回滚: https://www.jianshu.com/p/3b245b002dff

5.文章源码

04.Spring-Boot-Mybatis

欢迎扫面下列二维码关注“余弦的自留地”公众微信号



万物之中,希望至美

SpringBoot:4.SpringBoot整合Mybatis实现数据库访问的更多相关文章

  1. 【springboot spring mybatis】看我怎么将springboot与spring整合mybatis与druid数据源

    目录 概述 1.mybatis 2.druid 壹:spring整合 2.jdbc.properties 3.mybatis-config.xml 二:java代码 1.mapper 2.servic ...

  2. SpringBoot 2.X整合Mybatis

    1.创建工程环境 勾选Web.Mybatis.MySQL,如下 依赖如下 <dependency> <groupId>org.springframework.boot</ ...

  3. mybatis与数据库访问相关的配置以及设计

    mybatis与数据库访问相关的配置以及设计 mybatis不管如何NB,总是要与数据库进行打交道.通过提问的方式,逐步深入 我们常用的MyBatis配置中哪些是与数据库相关? 数据源配置: < ...

  4. SpringBoot: 10.整合mybatis(转)

    需求:通过使用 SpringBoot+SpringMVC+MyBatis 整合实现一个对数据库中的 t_user 表的 CRUD 的操作 1.创建maven项目,添加项目所需依赖 <!--spr ...

  5. springboot学习2 整合mybatis

    springboot整合mybatis 一.添加mybatis和数据库连接的依赖 <!--整合mybatis--> <dependency> <groupId>or ...

  6. SpringBoot学习之整合Mybatis

    本博客使用IDEA开发工具,通过Maven构建SpringBoot项目,初始化项目添加的依赖有:spring-boot-starter-jdbc.spring-boot-starter-web.mys ...

  7. SpringBoot | 3.2 整合MyBatis

    目录 前言 1. 导入MyBatis场景 1.1 初始化导向 1.2 手动导入 2. *MyBatis自动配置原理 3. 全局配置文件 @Mapper @MapperScan 3.1 配置模式 3.2 ...

  8. SpringBoot当中如何整合mybatis和注入

    [学习笔记] 6.整合mybatis和注入: 马克-to-win@马克java社区: 根据第3部分的helloworld例子,用那个项目做底子.pom.xml只需要加入mybatis和mysql的部分 ...

  9. springboot笔记07——整合MyBatis

    前言 Springboot 整合 MyBatis 有两种方式,分别是:"全注解版" 和 "注解.xml混合版". 创建项目 创建Springboot项目,选择依 ...

随机推荐

  1. SPL06-001 气压计

    歌尔是全球领先的MEMS厂家,最新推出新款气压传感器SPL06-001,定位精度可达5cm 手册地址 https://download.csdn.net/download/zhangxuechao_/ ...

  2. Android源码分析(十一)-----Android源码中如何引用aar文件

    一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...

  3. Spring cloud简单学习总结

    微服务简介 一.spring boot和spring cloud 的关系 spring boot来写各个拆分出来的微服务,spring  cloud把各个微服务联系起来,比如各个微服务通过eurke找 ...

  4. CentOS7 firewalld防火墙规则

    在CentOS7里有几种防火墙共存:firewalld.iptables.ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等. f ...

  5. RMAN笔记

    Rman常用命令 Preview选项 1)    显示用于还原system表空间数据文件的备份文件 RMAN> restore datafile 2 preview; 2)    显示用于还原特 ...

  6. linux中find命令的使用详解(转载)

    常用命令 find  (目录)   [-type d | f]  (文件夹 | 文件)   -name   (名称,可使用正则表达式) find  /root  -name "*core&q ...

  7. 【SSH错误】ssh_exchange_identification: read: Connection reset by peer

    进行远程登录时,ssh root@xxxxxxxxx出现如下错误 ssh_exchange_identification: read: Connection reset by peer 解决方案:登录 ...

  8. 【Appium】Android 按键码

    keycode也是appium很强大的功能,鉴于官网不翻墙无法打开,特此备忘. 电话键     KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOM ...

  9. Keras 训练一个单层全连接网络的线性回归模型

    1.准备环境,探索数据 import numpy as np from keras.models import Sequential from keras.layers import Dense im ...

  10. json转dataframe格式

    方法1:利用pandas自带的read_json直接解析字符串 方法2:利用json的loads和pandas的json_normalize进行解析 方法3:利用json的loads和pandas的D ...