其实对我个人而言还是不够熟悉JPA、hibernate,所以觉得这两种框架使用起来好麻烦啊。

一直用的Mybatis作为持久层框架,

JPA(Hibernate)主张所有的SQL都用Java代码生成,

而Mybatis则更主张用原生SQL。

准备

#引入依赖

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>

配置参数

修改application.yml:

spring:
datasource:
url: jdbc:mysql://localhost:3306/database_name?characterEncoding=utf-8//有的电脑需要加入时区参数zone不然会报错
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver

初始化数据库

-- create database springboot_mybatis charset utf8;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT NULL COMMENT '创建日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

注解版

Mybatis提供了一些注解实现快速CRUD,比如:@Select,@Update,@Insert,@Delete

相信你在看这篇文章之前已经用过Mybatis了(比如之前的SSM开发),

所以呢,使用注解方式按照XML方式的SQL写法就好。

写在前面之前在SSM开发时,

会在MapperScannerConfigurer中配置:

<property name="basePackage" value="xxx.mapper"/>用于使用Mybatis的接口代理开发模式(且接口和XML需要名称相同)。

那么在SpringBoot整合Mybatis中也要有对应的配置:

方式一:在每个interface Mapper前添加@Mapper注解

方式二:在Application.java启动类前添加@MapperScan("mapper所在的包名")注解

增删改查操作如下:

创建Entity /entity/User.java

@Data
@ToString
public class User implements Serializable {
private Long id;
private String username;
private String password;
private Date createTime;
//用lombok插件注解不用再写getter和setter
}
创建interface /mapper/UserMapperAno.java
public interface UserMapperAno {

    @Select("select * from user")
@Results({
@Result(property = "createTime", column = "create_time")
})
List<User> findAll(); @Select("select * from user where id = #{id}")
@Results({
@Result(property = "createTime", column = "create_time")
})
User findById(Long id); @Insert("insert into user(username,password,create_time) values(#{username},#{password},#{createTime})")
void save(User user); @Update("update user set username=#{username},password=#{password} where id=#{id}")
void update(User user); @Delete("delete from user where id=#{id}")
void delete(Long id);
}

其中@Result注解用于修饰返回结果集,若Entity和数据表字段不一致可以用其修饰

测试

创建测试类 /mapper/UserMapperAnoTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserMapperAnoTest {
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private UserMapper userMapper; @Test
public void testFindAll() {
List<User> list = userMapper.findAll();
list.forEach(user -> {
logger.info("user={}", user);
});
} @Test
public void testFindById(){
logger.info("user={}", userMapper.findById(1L));
} @Test
public void testSave(){
User user = new User();
user.setUsername("测试");
user.setPassword("123");
user.setCreateTime(new Date());
userMapper.save(user);
testFindAll();
} @Test
public void testUpdate() {
User user = new User();
user.setId(4L);
user.setUsername("测试呀");
userMapper.update(user);
testFindAll();
} @Test
public void delete() {
userMapper.delete(3L);
testFindAll();
}
}

小结

以上是常用CRUD操作的Mybatis注解版实现,对于基本的操作,使用注解确实比传统的XML简单好多,虽然也是SQL写在注解中,但是感觉比JPA的方式要简便一些(个人理解)。

XML版

使用Mybatis的XML开发方式应该是我们比较熟悉的,和注解版最大的不同就是Dao层,XML版会自动根据Dao层接口的方法名自动映射到XML中同名id对应的SQL。

修改application.yml

添加如下Mybatis配置属性

1
2
3
4
5
6
7
8
9
#mybatis配置
mybatis:
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: cn.tycoding.entity
configuration:
# 使用jdbc的getGeneratedKeys 可以获取数据库自增主键值
use-generated-keys: true
# 开启驼峰命名转换,如:Table(create_time) -> Entity(createTime)。不需要我们关心怎么进行字段匹配,mybatis会自动识别`大写字母与下划线`
map-underscore-to-camel-case: true

CRUD

创建interface UserMapperXML.java

1
2
3
4
5
6
7
8
9
10
11
12
public interface UserMapperXML {

    List<User> findAll();

    User findById(Long id);

    void save(User user);

    void update(User user);

    void delete(Long id);
}

resources/下创建/mapper/UserMapperXML.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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="cn.tycoding.mapper.UserMapperXML"> <select id="findAll" resultType="cn.tycoding.entity.User">
select * from user
</select> <select id="findById" resultType="cn.tycoding.entity.User">
select * from user where id = #{id}
</select> <insert id="save" parameterType="cn.tycoding.entity.User">
insert into user(username,password,create_time) values(#{username},#{password},#{createTime}
</insert> <update id="update" parameterType="cn.tycoding.entity.User">
update user set username=#{username},password=#{password} where id=#{id}
</update> <delete id="delete" parameterType="long">
delete from user where id=#{id}
</delete> </mapper>

测试

创建测试类UserMapperXMLTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserMapperXMLTest {
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private UserMapperXML userMapperXML; @Test
public void testFindAll() {
List<User> list = userMapperXML.findAll();
list.forEach(user -> {
logger.info("user={}", user);
});
} @Test
public void testFindById(){
logger.info("user={}", userMapperXML.findById(1L));
} @Test
public void testSave(){
User user = new User();
user.setUsername("测试");
user.setPassword("123");
user.setCreateTime(new Date());
userMapperXML.save(user);
testFindAll();
} @Test
public void testUpdate() {
User user = new User();
user.setId(4L);
user.setUsername("测试呀");
userMapperXML.update(user);
testFindAll();
} @Test
public void delete() {
userMapperXML.delete(3L);
testFindAll();
}
}

小结

练习了Mybatis注解版和XML版开发模式,更觉得两者配合使用最好,

简单的CRUD操作使用注解完全可以实现;

复杂的查询,比如Mybatis的动态SQL特性在注解中应该很难体现,而在XML中就很容易实现了。

Spring Boot整合Mybatis(注解方式和XML方式)的更多相关文章

  1. Spring Boot整合MyBatis(非注解版)

    Spring Boot整合MyBatis(非注解版),开发时采用的时IDEA,JDK1.8 直接上图: 文件夹不存在,创建一个新的路径文件夹 创建完成目录结构如下: 本人第一步习惯先把需要的包结构创建 ...

  2. Spring Boot整合Mybatis完成级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  3. Spring Boot系列(三):Spring Boot整合Mybatis源码解析

    一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...

  4. Spring Boot整合Mybatis并完成CRUD操作

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...

  5. spring boot 整合 mybatis 以及原理

    同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...

  6. Spring Boot 整合mybatis时遇到的mapper接口不能注入的问题

    现实情况是这样的,因为在练习spring boot整合mybatis,所以自己新建了个项目做测试,可是在idea里面mapper接口注入报错,后来百度查询了下,把idea的注入等级设置为了warnin ...

  7. 太妙了!Spring boot 整合 Mybatis Druid,还能配置监控?

    Spring boot 整合 Mybatis Druid并配置监控 添加依赖 <!--druid--> <dependency> <groupId>com.alib ...

  8. Spring Boot整合Mybatis报错InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider

    Spring Boot整合Mybatis时一直报错 后来发现原来主配置类上的MapperScan导错了包 由于我使用了通用Mapper,所以应该导入通用mapper这个包

  9. 【spring boot】14.spring boot集成mybatis,注解方式OR映射文件方式AND pagehelper分页插件【Mybatis】pagehelper分页插件分页查询无效解决方法

    spring boot集成mybatis,集成使用mybatis拖沓了好久,今天终于可以补起来了. 本篇源码中,同时使用了Spring data JPA 和 Mybatis两种方式. 在使用的过程中一 ...

随机推荐

  1. synchronized锁机制的实现原理

    Synchronized 锁机制的实现原理 Synchronized是Java种用于进行同步的关键字,synchronized的底层使用的是锁机制实现的同步.在Java中的每一个对象都可以作为锁. J ...

  2. JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth

    java8新出的YearMonth可以方便的用来表示某个月.我的项目中使用springmvc来接收YearMonth类型的数据时发现 x-www-from-urlencoded 格式的数据可以使用&q ...

  3. Codeforces Round #601 (Div. 2)E(寻找质因子,DP)

    先分解质因数,对于当前a[i],假设当前的质因数为x,这个位置要满足能被k整除,有两个可能,要么是它向后一个转移x%k个,要么是后一个向它转移k-x%k个. 对于每一个a[i]满足后,因为只会对下一个 ...

  4. 【IO多路复用】

    " 目录 一.IO模型介绍 二.阻塞IO(blocking IO) 三.非阻塞IO(non-blocking IO) 四.多路复用IO(IO multiplexing) 五.异步IO(Asy ...

  5. 关于this和base的区别

    一句话总结:在有冲突得时候,base和this能够进行区分,在没有冲突得时候,是一样得. 基于成员调用 基于构造方法 参考: http://www.cnblogs.com/reommmm/archiv ...

  6. idea设置单行注释格式(包括配置文件)

    idea中文件单行注释默认在行首位置 修改方法:进入File-->Settings-->Editor-->Code Style-->Java,修改Code Generation ...

  7. Java中引用类型、对象的创建与销毁

    引用类型 在java中,除了基本数据类型之外的,就是引用数据类型了,引用指的是对象的一个引用,通过引用可以操作对象,控制对象,向对象发送消息. 简单来说,引用可以访问对象的属性,并调用对象的方法 创建 ...

  8. 连接mysql,oracle的命令 以及导入sql文件

    Oracle 1,sqlplus  username/password 导入: 2,@后面跟着sql文件的路径,回车,导入数据 @D:/test.sql; 导入完毕,输入commit; MySQL: ...

  9. Cisco AP-如何识别思科胖瘦AP

    思科的胖瘦AP识别的方式不止一种,这里简单的总结一些我了解到的方式: 1.根据思科AP的型号 这个和思科不同时期的产品有关系,老一点的和新一些的AP命名上存在差别,这里简单举例: 类型1:AIR-LA ...

  10. ConcurrentHashMap 实现缓存类

    参考:https://blog.csdn.net/woshilijiuyi/article/details/81335497 在规定时间内,使用 hashMap 实现一个缓存工具类,需要考虑一下几点 ...