在Springboot中用Mybatisplus连接Mysql数据库
Posted Arion-ren
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Springboot中用Mybatisplus连接Mysql数据库相关的知识,希望对你有一定的参考价值。
0.前言
Mybatisplus可以说是Mybatis的升级版,最大的优点就是在Mybatis的基础上只升级不改动,之前在使用Mybatis时候,我们需要先编写mapper接口,然后再resources文件下新建xml文件作为接口的实现类,需要在xml文件中指定映射关系,但是mybatisplus可以实现二者的自动绑定和生成实现类的xml文件。
1.导入mybatisplus的依赖
导入了mybatisplus依赖以后就不要导入mybatis依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
2.编写配置文件
用yml格式编写,其中包括数据库的用户名密码,以及数据库的名字,allowMultiQueries=true代表允许批量更新。
# DataSource Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost/mall?serverTimezone=GMT%2B8&characterEncoding=UTF-8&allowMultiQueries=true
username: root
password: 123456
#日志格式
logging:
pattern:
console: "[%thread] %-5level %logger36 - %msg%n"
#自己写的mapper路径
mybatis-plus:
mapper-locations: classpath:mappers/*.xml
3.编写Category实体类,利用lombook注解方式得到get和set方法
编写的实体类的属性最好和你数据库中的数据一一对应,这样测试的时候比较容易检查。数据库中的表明经常会加上前缀,当实体类的名字和数据库表明不一致时,可以用@TableName注解
4.创建mapper接口继承BaseMapper
这里要注意,当报错无法“ Error creating bean”时,大致意思就是mapper层没有交给spring管理,建议直接在mapper接口上加上注解@Mapper,有时候在启动类上加上mapperscan扫描也不行。
5.自定义sql语句(关于代码生成详解看下篇博客)
mapper接口继承的BaseMapper中自带基础的增删改查方法,自定义sql方法有注解和xml两种类型,注解直接在mapper类接口中的方法上直接加,但是当sql较长时会显的比较乱。一般用xml编写,在resources文件夹下新建mapper文件夹。
注意:namespace要写自己的包名,sql id是方法名,resultType方法名
6.编写测试类
规范的写法是新建一个测试类对应mapper接口,具体操作是在mapper接口中点击右键go to,点击test,然后勾选方法就可以。或者直接在自带的测试类中直接写测试方法。
注:需要再类上加上@SpringBoot注解,否则测试方式时会报错。
以上过程就是mybatisplus的入门,利用代码生成器生成整体的三层结构具体细节在下一篇博客中。
springboot+postgresql+mybatisplus 整合的一些坑
技术架构:springboot+mybatisplus+postgresql+gradle
自定义TypeHnadler的使用
自定义的TypeHandler主要是转换Jsonb和array等类型
如果是使用mybatisplus的内置方法,则需要在实体字段加上@TableField注解,并且需要在类名上启动@TableName(autoResultMap = true)
// autoResultMap = true 必须写,否则无法识别
@TableName(autoResultMap = true)
public class BlogUser implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
private Integer version;
// 使用类型转换,否则无法增删改查
@TableField(typeHandler= JsonTypeHandler.class)
private Map<String,Object> relation;
}
如果是写在xml里面,则必须在对应字段注明转换器class:
<insert id="addxml" parameterType="com.hou.postgresql.blog.entity.po.BlogUser">
INSERT INTO blog_user (name, relation, fans, birthday, points, login_time, write_interval, numbers, adult, address, weight)
VALUES (#{name},
/*必须显式的指明转换器,否则编译过程就会报错,主要是List,map这种数组,jsonb对应的实体类型*/
#{relation,typeHandler=com.hou.postgresql.handler.JsonTypeHandler},
#{fans,typeHandler=com.hou.postgresql.handler.ArrayTypeHandler}, #{birthday}, #{points}, #{loginTime}, #{writeInterval}::interval,
#{numbers,typeHandler=com.hou.postgresql.handler.ArrayTypeHandler}, #{adult}, #{address}, #{weight})
</insert>
column is of type jsonb but expression is of type character varying问题
即使写了转换器,查询的时候没问题,但是插入的时候依然会报这个错,这时需要在连接的url后面加上参数stringtype=unspecified就可以正常添加了
url: jdbc:postgresql://192.168.1.11:5432/postgres?currentSchema=sys&stringtype=unspecified
schemas问题
pgsql默认的是public,如果用mybatisplus的内置方法的话,是需要指定连接的currentSchema的,否则只会默认查询public,自己写sql可以在前面加上schemas
但是使用内置方法没有,必须在连接url指定schemsa,否则会报ERROR: relation "item" does not exist表不存在
所有数据类型参数格式
url后面加上stringtype=unspecified就可以使用任意格式插入了,除了json和array之外,其他的特殊类型,比如地址,间隔,时间等都可以使用string
参数如下:
{
"address": "192.168.1.70", // inet
"adult": false, // boolean
"birthday": "1994-12-16", // date
"fans": ["zhangpeng","zhouhang","pengle"],
"loginTime": "09:12", // time
"name": "侯征",
"numbers": [12,56,42], // array
"points": 10.522, // numeric
"relation": { // jsonb
"key": "value"
},
"weight": "[45,50]", // 区间
"writeInterval": "800" // 时间间隔,单位秒
}
以上是关于在Springboot中用Mybatisplus连接Mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章
MyBatisPlus新版本SpringBoot集成MyBatisPlus主键生成策略
MyBatisPlus新版本SpringBoot集成MyBatisPlus主键生成策略
MyBatisPlus新版本SpringBoot集成MyBatisPlus主键生成策略