SpringBoot 构建ORM框架

article/2025/10/19 7:43:03

目前常用的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;@TableFieldprivate 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> {}
 @AutowiredIUserInfoMapper iUserInfoMapper;@Testpublic 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 {/*** 新的分页插件*/@Beanpublic 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 {@AutowiredIUserInfoService iUserInfoService;@Testpublic 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.Driverurl: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8username: rootpassword: root

durid连接池配置连接:

#druid数据库链接池配置
spring:datasource:#1.JDBCtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/myboot?useUnicode=true&characterEncoding=utf8username: rootpassword: rootdruid:#2.连接池配置initial-size: 5       #初始化连接池的连接数量 大小,最小,最大min-idle: 5max-active: 20max-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: 20filter:   # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙stat:merge-sql: trueslow-sql-millis: 5000#3.基础监控配置web-stat-filter:enabled: trueurl-pattern: /*#设置不统计哪些URLexclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable: truesession-stat-max-count: 100stat-view-servlet:enabled: trueurl-pattern: /druid/*reset-enable: truelogin-username: admin  #设置监控页面的登录名和密码 ,监控页访问:http://localhost:端口号/项目名称/druid/login.htmllogin-password: adminallow: 127.0.0.1#deny: 192.168.1.100mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpllogging: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博客


http://chatgpt.dhexx.cn/article/LxepMZc3.shtml

相关文章

DjangoORM框架

DjangoORM框架 文章目录 DjangoORM框架一、ORM框架1.ORM简介2.使用django进行数据库开发的步骤如下&#xff1a;3.定义模型类4.迁移5.数据操作5.对象的关联操作6.ORM框架的功能 二、后台管理1.简介2.使用步骤3.管理界面本地化4.创建管理员5.注册模型类6.自定义管理页面 模型设计…

mybatis —— ORM框架

一、什么是框架 框架是一种经过校验、具有一定功能的半成品软件品&#xff0c;已经对基础的代码进行了封装并提供相应的API&#xff0c;开发者在使用框架是直接调用封装好的api可以省去很多代码编写&#xff0c;从而提高工作效率和开发速度。 二、什么是ORM ORM&#…

ORM框架——SqlSugar

目录 一、ORM框架 二、SqlSugar现状 三、SqlSugar的优点 四、SqlSugar的使用 五、主要函数 六、传参 五、读写分离 一、ORM框架 常用的ORM框架有Dapper、EF/EF Core、FreeSql、Dos.ORM、SqlSugar等&#xff0c;SqlSugar是国产的 二、SqlSugar现状 SqlSugar ORM 5.X 官…

很多小伙伴不太了解ORM框架的底层原理,这不,冰河带你10分钟手撸一个极简版ORM框架(赶快收藏吧)

大家好&#xff0c;我是冰河~~ 最近很多小伙伴对ORM框架的实现很感兴趣&#xff0c;不少读者在冰河的微信上问&#xff1a;冰河&#xff0c;你知道ORM框架是如何实现的吗&#xff1f;比如像MyBatis和Hibernate这种ORM框架&#xff0c;它们是如何实现的呢&#xff1f; 为了能够…

.Net Core ORM 框架

我的.net core orm 框架 一个简单的orm框架支持的数据库版本新的版本项目地址使用方式实现方式高级特性扩展函数性能bug 一个简单的orm框架 作者在使用很多orm框架的时候觉得查询语句写法似乎不是很好用&#xff0c;例如sqlSugar,EF,sqlSugar呢链接的时候必须注意表的别称&…

SQLAlchemy ORM框架

ORM简介 ORM 全称 Object Relational Mapping, 叫对象关系映射。简单的说&#xff0c;ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样&#xff0c;我们要操作数据库&#xff0c;数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。 对于…

ORM框架

ORM框架 一、什么是ORM框架 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 ORM框架是连接数据库的桥梁&#xff0c;只要提供了持久化类与表的映射关系&#xff0c;OR…

ORM框架使用优缺点

1. 什么是ORM? 对象-关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;面向对象的开发方法是当今企业级应用开发环境中的主流开发方法&#xff0c;关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业…

Redis I/O 多路复用

引出IO多路复用 为什么 Redis 中要使用 I/O 多路复用这种技术呢&#xff1f; 首先&#xff0c;Redis 是跑在单线程中的&#xff0c;所有的操作都是按照顺序线性执行的&#xff0c;但是由于读写操作等待用户输入或输出都是阻塞的&#xff0c;所以 I/O 操作在一般情况下往往不能…

IO多路复用—由Redis的IO多路复用yinch

linux IO多路复用有epoll&#xff0c; poll, select&#xff0c;epoll性能比其他几者要好。 名词比较绕口&#xff0c;理解涵义就好。一个epoll场景&#xff1a;一个酒吧服务员&#xff08;一个线程&#xff09;&#xff0c;前面趴了一群醉汉&#xff0c;突然一个吼一声“倒酒”…

什么是IO多路复用?用来解决什么问题?如何实现?

白话IO多路复用 这里引述知乎大佬对于IO多路复用的机场空管的比喻和理解&#xff1a; 假设你是一个机场的空管&#xff0c; 你需要管理到你机场的所有的航线&#xff0c; 包括进港&#xff0c;出港&#xff0c; 有些航班需要放到停机坪等待&#xff0c;有些航班需要去登机口接…

I/O多路复用

https://blog.csdn.net/baixiaoshi/article/details/48708347 https://blog.csdn.net/z69183787/article/details/52943917 select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。所谓I/O多路复用机制&#xff0c;就是说通过一种机制&#xff0c;可以监视多个描述符…

概念 多路复用 到底是个啥?通俗易懂的理解

前言&#xff1a;教育的公平才是最大的公平&#xff0c;本科和专科还是有点差别的。时间长点学方面会充实些。 先给个结论&#xff1a;I/O多路复用技术&#xff08;就是大家经常说的事件循环&#xff09;实际上&#xff0c;事件驱动模型还有另外一个名字&#xff0c;而且更加出…

Redis的IO多路复用原理

什么是阻塞&#xff0c;非阻塞&#xff0c;异步同步&#xff0c;select&#xff0c;poll&#xff0c;epoll&#xff1f;今天我们用一遍文章解开这多年的迷惑。 首先我们想要通过网络接收消息&#xff0c;是这样的一个步骤。 用户空间向内核空间请求网络数据内核空间把网卡数据…

什么是IO多路复用,理解IO多路复用

什么是IO多路复用&#xff1f; IO 多路复用是一种同步IO模型&#xff0c;实现一个线程可以监视多个文件句柄&#xff1b;一旦某个文件句柄就绪&#xff0c;就能够通知应用程序进行相应的读写操作&#xff1b;没有文件句柄就绪就会阻塞应用程序&#xff0c;交出CPU。 多路是指网…

多路复用与多路分用

从现在开始&#xff0c;我们开始传输层的学习&#xff0c;自顶向下第六版中改成了运输层&#xff0c;感觉怪怪的 书中打了邮政服务和代收发信件的兄弟姐妹之间的比方&#xff0c;非常贴切&#xff0c;这是传输层和网络层的作用区别&#xff0c;也就是说&#xff0c;传输层管的是…

多路复用(

apue 多路复用 需求来自用户&#xff0c;用户的需求来自实际的使用场景。在实际运用中&#xff0c;一个系统或者程序需要处理的事件并不是只有一个或一类&#xff0c;而是存在各种各样的事件在一小段事件内一起发生&#xff0c;此时按照没学多线程的逻辑的处理方式就是这样&…

多路复用

讲多路复用先我觉得有必要讲一下什么是阻塞IO、非阻塞IO、同步IO、异步IO这几个东西&#xff1b;linux的五种IO模型&#xff1a; 1)阻塞I/O&#xff08;blocking I/O&#xff09; 2)非阻塞I/O&#xff08;nonblocking I/O&#xff09; 3) I/O复用(select和poll)&#xff08;…

io多路复用的原理和实现_IO多路复用机制详解

select&#xff0c;poll&#xff0c;epoll机制区别总结: 服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; (1)同步阻塞IO(Blocking IO)&#xff1a;即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO)&#xff1a;默认创建的socket都是…

【多路复用器介绍】

【多路复用器介绍】意义 作用 实现 意义逻辑电路原理结构与真值表逻辑电路 实现代码参考资料 意义 多路复用器将接收的复合数据流&#xff0c;依照信道分离数据&#xff0c;并将它们送到对应的输出线上&#xff0c;故称为解多路复用器。 实际生活中&#xff0c;使用多路复用器…