目前常用的ORM框架有 Mybatis(batis)、MybatisPlus,Hibernate、Jpa等几个框架,今天就简单介绍一下搭建Mybatisplus框架的流程。
1.增加依赖
<dependencies>
<!-- 第一步:选择ORM框架,使用springboot整合mybatis-plus依赖包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 第二步:选择数据库驱动,这里是Mysql所以就选择Mysql的驱动,PG的就选择PG-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 第三步(可选):数据库连接池,可以使用druid的连接池。springboot-jdbc已经默认依赖了Hikari的连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
2.数据库实体模型
主要使用@TableName和@TableField,配置属性类和数据库表的对应关系
@TableName("userinfo")
@Data
public class UserInfo {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField
private String name;
private String usernum;
private int sex;
private Date createtime;
private Date updatetime;
}
3.增加Mapper
方式1:BaseMapper
直接使用继承BaseMapper,然后使用注入的Mapper对象实例即可。
public interface IUserInfoMapper extends BaseMapper<UserInfo> {
}
@Autowired
IUserInfoMapper iUserInfoMapper;
@Test
public void queryTest() {
LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper();
lambdaQueryWrapper.eq(UserInfo::getId,1);
List<UserInfo> list = iUserInfoMapper.selectList(lambdaQueryWrapper);
System.out.println(list);
}
方式2:IService
使用IService实现类,新建IUserInfoService 接口
public interface IUserInfoService extends IService<UserInfo> {
void queryList();
}
实现IUserInfoServiceb 接口 ,并继承ServiceImpl
@Service
public class UserInfoServiceImpl extends ServiceImpl<IUserInfoMapper, UserInfo> implements IUserInfoService {
public void queryList() {
LambdaQueryChainWrapper<UserInfo> userWarpper = this.lambdaQuery();
userWarpper.like(UserInfo::getName, "li");
System.out.println(userWarpper.list());
}
public void queryListPage() {
LambdaQueryChainWrapper<UserInfo> userWarpper = this.lambdaQuery();
Page<UserInfo> page = new Page<>(1, 2);
IPage<UserInfo> userInfoIPage = userWarpper.page(page);
System.out.println("total=" + userInfoIPage.getTotal());
System.out.println("page=" + userInfoIPage.getPages());
}
}
如果需要需要开始分页查询或者动态表名,需要开启
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setDbType(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true);
//动态表名拦截器
DynamicTableNameInnerInterceptor dynamicTableNameInner = new DynamicTableNameInnerInterceptor();
dynamicTableNameInner.setTableNameHandler(((sql, tableName) -> "userinfo"));
interceptor.addInnerInterceptor(dynamicTableNameInner);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
开始查询数据
@SpringBootTest(classes = MybatisPlusProgram.class)
public class IUserInfoServiceImplTest {
@Autowired
IUserInfoService iUserInfoService;
@Test
public void queryTest() {
iUserInfoService.queryList();
}
}
总结:
BaseMapper 接口中封装了一系列 CRUD 常用操作
IService 内部进一步封装了 BaseMapper 接口的方法(当然也提供了更详细的方法),使用IService需要继承ServiceImpl。
4.wapper介绍
Wrapper : 条件构造抽象类,最顶端父类
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
5.LambdaQueryWrapper常用的方法
方法图片来源: https://www.cnblogs.com/javagg/p/12654305.html
6.@Mapper或者@MapperScan
使用@Mapper或者@MapperScan,将Mapper的接口类编译成实现类,才能注入。
@MapperScan:在启动项类上增加@MapperScan,指定扫描的包。指定了变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
@Mapper:在接口上增加@Mapper,在编译之后会生成相应的接口实现类。
@SpringBootApplication
@MapperScan("com.lx.mybatisplus.mappers")
public class MybatisPlusProgram {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusProgram.class, args);
}
}
7.配置连接
默认数据库配置连接
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8
username: root
password: root
durid连接池配置连接:
#druid数据库链接池配置
spring:
datasource:
#1.JDBC
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8
username: root
password: root
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 # 检查数据库
validation-query-timeout: 20000 #设置检查数据库SQL查询超时时间
test-while-idle: true #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-on-borrow: false #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-return: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
pool-prepared-statements: true # 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
max-pool-prepared-statement-per-connection-size: 20
filter: # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
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 #设置监控页面的登录名和密码 ,监控页访问:http://localhost:端口号/项目名称/druid/login.html
login-password: admin
allow: 127.0.0.1
#deny: 192.168.1.100
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
level:
root: info
8.LambdaQueryWrapper和LambdaQueryChainWrapper区别
LambdaQueryWrapper和LambdaQueryChainWrapper都支持lamdba的写法,用法基本相同。LambdaQueryChainWrapper是在LambdaQueryWrapper的基础上封装的。
LambdaQueryWrapper<UserInfo> userWarpper = new QueryWrapper<UserInfo>().lambda()
.like(UserInfo::getName, "li");
iUserInfoService.list(userWarpper);
iUserInfoService.getOne(userWarpper);
LambdaQueryChainWrapper<UserInfo> userWarpperChain = iUserInfoService.lambdaQuery()
.like(UserInfo::getName, "li");
userWarpperChain.list(); //等于iUserInfoService.list(userWarpperChain.getWrapper());
userWarpperChain.one(); //等于iUserInfoService.getOne(userWarpperChain.getWrapper())
9.开启打印SQL日志
1.第一种方法:使用mybatis配置
#打印sql,但是不出现在log中
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
2.第二种方法:使用Logback日志配置
#打印sql,出现在log中
logging.level.com.lx.mybatisplus=debug
参考:
Springboot配置Druid或Hikari连接池(并开启MyBatisPlus事务)_繁华尽头满是殇的博客-CSDN博客