在公司项目开发中,使用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依赖,访问数据库

		<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 引入MySQL连接的依赖包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>

1.2 配置数据库信息

在application.properties 配置相关mysql信息

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

1.3 创建user表

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

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

1.4 创建实体类

创建user表的映射实体类。

package com.w3cjava.entity;
public class User {
private Long id; private String name; private Integer age; public User() {
} public User(String name, int age) {
this.name = name;
this.age = age;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

1.5 数据访问层Dao

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

package com.w3cjava.dao;

import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.w3cjava.entity.User; @Mapper
public interface UserDao{
int insert(@Param("name") String name, @Param("age") Integer age); /**
*
* @author cos
* @desc 通过Map<String, Object>对象来作为传递参数的容器
* @param map
* @return
*/
int insertByMap(Map<String, Object> map);
/**
*
* @author cos
* @desc 使用对象
* @param user
* @return
*/ int insert(User user); void update(User user); void delete(Long id);
/**
*
* @author cos
* @desc 返回结果的绑定
* @return
*/
List<User> findAll();
/**
*
* @author cos
* @desc 使用@Param传参,@Param中定义的name对应了SQL中的#{name},age对应了SQL中的#{age}
* @param name
* @return
*/
User findByName(@Param("name") String name);
}

1.6 数据访问xml映射

通过mybatis.mapper-locations=classpath:mapper/.xml配置,我们将在classpath路径的mapper文件夹下创建UserDao对应的映射xml。

<?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" >
<mapper namespace="com.w3cjava.dao.UserDao">
<sql id="testColumns">
a.id AS "id",
a.name AS "name",
a.age AS "age"
</sql> <sql id="testJoins">
</sql>
<!-- 查询所有user -->
<select id="findByName" resultType="com.w3cjava.entity.User">
select
<include refid="testColumns"/>
from user a
WHERE a.name = #{name}
</select> <!-- 查询所有user -->
<select id="findAll" resultType="com.w3cjava.entity.User">
select
<include refid="testColumns"/>
from user a
</select> <insert id="insert">
INSERT INTO user(
name,
age
) VALUES (
#{name},
#{age}
)
</insert> <insert id="insertByMap">
INSERT INTO user(
name,
age
) VALUES (
#{name,jdbcType=VARCHAR},
#{age,jdbcType=INTEGER}
)
</insert>
<update id="update">
UPDATE user SET age=#{age} WHERE name=#{name}
</update>
<delete id="delete">
DELETE FROM user WHERE id =#{id}
</delete>
</mapper>

2.应用启动类

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

package com.w3cjava;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
*
* @class SpringBootMybatisApplication
* @version SpringBoot 2.1.9
* @author cos
* @desc 整合Mybatis
*
*/
@SpringBootApplication
@EnableTransactionManagement
public class SpringBootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisApplication.class, args);
} }

3.单元测试

测试基本逻辑:

  • 向数据库中插入数据
  • 查询部分数据
  • 通过使用@Rollback、@Transactional回滚数据,保证每一次单元测试数据的独立性。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringBootMybatisApplication.class})
public class UserServiceTest {
@Autowired
private UserDao userDao;
@Test
@Transactional
@Rollback
public void insert() throws Exception {
userDao.insert("AAA", 20);
} @Test
@Transactional
@Rollback
public void findByName() throws Exception {
userDao.insert("AAA", 20);
User u = userDao.findByName("AAA");
Assert.assertEquals(20, u.getAge().intValue());
} @Test
@Transactional
@Rollback
public void testMap() throws Exception{
Map<String, Object> map = new HashMap<>();
map.put("name", "CCC");
map.put("age", 40);
userDao.insertByMap(map);
} @Test
@Transactional
@Rollback
public void testuserDao() throws Exception {
// insert一条数据,并select出来验证
userDao.insert("AAA", 20);
User u = userDao.findByName("AAA");
Assert.assertEquals(20, u.getAge().intValue());
// update一条数据,并select出来验证
u.setAge(30);
userDao.update(u);
u = userDao.findByName("AAA");
Assert.assertEquals(30, u.getAge().intValue());
// 删除这条数据,并select验证
userDao.delete(u.getId());
u = userDao.findByName("AAA");
Assert.assertEquals(null, u);
} @Test
@Transactional
@Rollback
public void testSelectMapper() throws Exception {
List<User> userList = userDao.findAll();
for(User user : userList) {
Assert.assertEquals(null, user.getId());
Assert.assertNotEquals(null, user.getName());
}
}
}

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. 【python】ConnectionRefusedError: [WinError 10061]

    在测试接口过程中,由于各种原因服务端返回:10061,由于目标计算机积极拒绝,无法连接. 图一 图二 造成这种返回结果的可能原因:1.代码问题2.本机代理设置问题3.本地防火墙或者安全卫士之类的设置问 ...

  2. Flex,Flash,AS3,AIR的关系和区别

    转自:http://www.admin10000.com/document/156.html 本文详细介绍了 Flash.Flex.AS3.AIR 的关系和区别.希望对初学者有帮助. AS3 Acti ...

  3. NSQ端口关系以及注意事项

    0.相关参考文章: 官网:https://nsq.io/ <golang实战-nsq集群入门与坑> <nsq系统架构> <NSQ消息队列> 1.启动命令 ①nsql ...

  4. python3自动部署mariadb主从

    master import configparser import os def config_mariadb_yum(): exists = os.path.exists('/etc/yum.rep ...

  5. 爬虫-lxml用法

    安装 pip install lxml 用法 # coding=utf-8 from lxml import etree text = ''' <div> <ul> <l ...

  6. python基础之函数重点

    函数的返回值 现在有一个需求,比较两个人的月薪,然后想获取月薪较大人的年薪. 如果需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须要有返回值. 需要注意的是: return是一个函数结束的 ...

  7. 小学四则运算口算练习app---No.2

    经过昨天的了解,虽然还是很懵,总要下手摸到鼠标来写第一个页面! 这是一开始设置出体数目和时间的页面,使用者根据提示进行相关设置即可! 代码如下: <?xml version="1.0& ...

  8. 5分钟使用docker搭建一个WordPress

    环境为已安装Docker Destop的Windows系统. 过程 使用Docker拉去官方WordPress镜像再进行简单配置是可行的, 但是这里我们使用docker-compose,它会自动根据你 ...

  9. 最全BT磁力搜索引擎索引(整理分享,不断更新...)

    最全BT磁力搜索引擎索引(整理分享,不断更新...) btkitty:http://cnbtkitty.com/(知名的BT磁力搜索,资源很多) idope.se:https://idope.se/( ...

  10. 请描述一下cookies、sessionStorage、localStorage、session四者的区别?

    存储大小: cookie在4K以内. sessionStorage和localStorage在5M以内. 有效时间: cookie:如果未设置过期时间,关闭浏览器时清空:如果设置了有效时间则在到期后清 ...