springboot整合mybatis入门
Posted 好大的月亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot整合mybatis入门相关的知识,希望对你有一定的参考价值。
先上依赖
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<!-- mybatis启动包-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<!-- 数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<!-- 数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
yml中配置
主要看mysql
连接配置和mybatis
的配置,这里的druid
对于demo案例来说没啥作用
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8
username: root
password: 10086
druid:
#2.连接池配置
#初始化连接池的连接数量 大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
#配置获取连接等待超时的时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filter:
stat:
merge-sql: true
slow-sql-millis: 5000
#3.基础监控配置
web-stat-filter:
enabled: true
url-pattern: /*
#设置不统计哪些URL
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: true
session-stat-max-count: 100
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
#设置监控页面的登录名和密码
login-username: admin
login-password: admin
allow: 127.0.0.1
#deny: 192.168.1.100
mybatis:
type-aliases-package: com.felix.event.entity # 让mybatis自己把这个包下的实体类起个别名,不用每次在用它的时候起包名的前缀
mapper-locations: classpath:mapper/*.xml #让mapper.xml文件可以被扫描到
定义实体类
package com.felix.event.entity;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String address;
private String phone;
}
定义mapper接口
**需要使用@Mapper注解,不然SpringBoot无法扫描**
或者不写mapper
注解,在启动类上写上mapper
包路径扫描mapper
package com.felix.event.mapper;
import com.felix.event.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
void insertUser(User user);
}
定义mapper的xml文件
一般mapper的xml格式:
- doctype:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- 使用mapper标签包含:
<mapper namespace="com.pro.dao.UserDao"></mapper>
实际demo
<?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.felix.event.mapper.UserMapper">
<!--mybatis:
type-aliases-package: com.felix.event.entity
因为之前在yml中设置了包名下的实体类让mybatis自动以 小写字母开头的类名为别名,所以 parameterType 这里可以不用写类名全路径-->
<insert id="insertUser" parameterType="user">
insert into user(name,age) values (#{name},#{age})
</insert>
</mapper>
开始写点增删改查业务
mvc直接套,在m和c之间service搞起来
package com.felix.event.service;
import com.felix.event.entity.User;
public interface UserService {
void addUser(User user);
}
这里用autowired肯定会爆红,可以用J2EE的@Resource默认byName注入
package com.felix.event.service.impl;
import com.felix.event.entity.User;
import com.felix.event.mapper.UserMapper;
import com.felix.event.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public void addUser(User user) {
this.userMapper.insertUser(user);
}
}
启动类加上MapperScan扫描到mybatis的mapper接口
package com.felix.event;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
@MapperScan("com.felix.event.mapper")
public class EventApplication {
public static void main(String[] args) {
SpringApplication.run(EventApplication.class, args);
}
}
上面有几个要注意的点
1.mapper.xml
文件中的namespace
中需要与使用@Mapper
的接口对应
2.UserMapper.xml
文件名称必须与使用@Mapper
的接口一致
3.标签中的id
必须与@Mapper
的接口中的方法名一致,且参数一致
mapper文件中select标签demo
<select
id="selectPerson" //唯一标识sql语句,与接口中方法名一致。
parameterType="int"//入参类型
resultType="hashmap"//期望返回类型的类名或别名,集合时,应该是集合可以包含的类型,而不能是集合本身
resultMap="personResultMap"//引用resultMap标签定义
flushCache="false"//设置为true,清空缓存
useCache="true"//使用cache:本条结果将被缓存
timeout="10000"
fetchSize="256"
statementType="PREPARED"//Statement,PreparedStatement 或 CallableStatement。 默认值:PREPARED
resultSetType="FORWARD_ONLY">//FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE 中的一种。默认是不设置(驱动自行处理)。
定义一个基础column,提供给其他select引入使用
<sql id="Base_Column_List">
id, shop_id, shop_member_id, name, gender
</sql>
<select id="selectByExample" parameterType="com.xxx.xxx.xxxIntention" resultMap="BaseResultMap">
select
<if test="distinct">
distinct
</if>
<include refid="Base_Column_List" />
from shop_member_intention
<if test="orderByClause != null">
order by ${orderByClause}
</if>
</select>
使用for
循环填充条件
传入的参数是一个Map
,在foreach
标签里可以直接拿这个参数的key
去做判断,可以少写一步map
的getKey
<select id="countByShopIds" parameterType="java.util.Map" resultType="com.xxx.xxx.xxx.xxxIntentionCountVO">
select shop_id as shopId, count(1) as `count` from xxx
where is_deleted=0
<if test="shopIds != null and !shopIds.isEmpty()">
and shop_id IN
<foreach collection="shopIds" index="index" item="shopId" open="(" separator=","
close=")">
#{shopId}
</foreach>
</if>
group by shop_id
</select>
使用大于等于小于等于这些符号的时候,在xml里是需要转义符号的,或者直接用代码块
原符号 < <= > >= & ' "
替换符号 < <= > >= & ' "
但是这样写起来麻烦,看起来也没有符号清楚直接,所以可以使用CDATA代码块,设定里面的块级代码无需转义
<![CDATA[
AND gmt_create >=#{beginTime}
]]>
<![CDATA[
AND gmt_create <=#{endTime}
]]>
以上是关于springboot整合mybatis入门的主要内容,如果未能解决你的问题,请参考以下文章