Spring Boot+mybatis集成数据库访问
1、整合druid数据源
1.1 单数据源配置
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//配置Druid的监控
//1、配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),
"/druid/*");
Map<String,String> initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","123456");
initParams.put("allow","");//默认就是允许所有访问
initParams.put("deny","192.168.15.21");
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
spring.datasource.druid.initial-size=10
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-active=15
spring.datasource.druid.filters=stat,wall,log4j2
spring.datasource.druid.filter.config.enabled=true
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=mysql
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=mysql
spring.datasource.druid.filter.wall.config.delete-allow=true
spring.datasource.druid.filter.wall.config.drop-table-allow=false
spring.datasource.druid.filter.log4j2.enabled=true
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin@zt3000
spring.datasource.druid.stat-view-servlet.use-global-data-source-stat=true
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.aop-patterns=com.xxxxxxxxxxx.bmp.dao.*
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
1.2 多数据源配置
spring:
# 数据源配置
datasource:
ds1: #数据源1
driver-class-name: com.mysql.jdbc.Driver # mysql的驱动你可以配置别的关系型数据库
url: jdbc:mysql://ip:3306/db1 #数据源地址
username: root # 用户名
password: root # 密码
ds2: # 数据源2
driver-class-name: com.mysql.jdbc.Driver # mysql的驱动你可以配置别的关系型数据库
url: jdbc:mysql://ip:3307/db2#数据源地址
username: root # 用户名
password: root # 密码
/**
* 多数据源配置
*/
@Configuration
public class DataSourceConfig {
//主数据源配置 ds1数据源
@Primary
@Bean(name = "ds1DataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.ds1")
public DataSourceProperties ds1DataSourceProperties() {
return new DataSourceProperties();
}
//主数据源 ds1数据源
@Primary
@Bean(name = "ds1DataSource")
public DataSource ds1DataSource(@Qualifier("ds1DataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
//第二个ds2数据源配置
@Bean(name = "ds2DataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.ds2")
public DataSourceProperties ds2DataSourceProperties() {
return new DataSourceProperties();
}
//第二个ds2数据源
@Bean("ds2DataSource")
public DataSource ds2DataSource(@Qualifier("ds2DataSourceProperties") DataSourceProperties dataSourceProperties) {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
}
2、整合Mybatis
2.1 简单整合
2.1.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.28</version>
<scope>runtime</scope>
</dependency>
2.1.2 配置数据源
spring.datasource.url=jdbc:mysql:///testdb?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
2.1.3 创建Mapper (基于注解)
public interface UserMapper {
@Select("select * from user")
List<User> getAllUsers();
@Results({
@Result(property = "id", column = "id"),
@Result(property = "username", column = "u"),
@Result(property = "address", column = "a")
})
@Select("select username as u,address as a,id as id from user where id=#{id}")
User getUserById(Long id);
@Select("select * from user where username like concat('%',#{name},'%')")
List<User> getUsersByName(String name);
@Insert({"insert into user(username,address) values(#{username},#{address})"})
@SelectKey(statement = "select last_insert_id()", keyProperty = "id", before = false, resultType = Integer.class)
Integer addUser(User user);
@Update("update user set username=#{username},address=#{address} where id=#{id}")
Integer updateUserById(User user);
@Delete("delete from user where id=#{id}")
Integer deleteUserById(Integer id);
}
2.1.4 创建Mapper (基于XML文件)
public interface UserMapper {
List<User> getAllUser();
Integer addUser(User user);
Integer updateUserById(User user);
Integer deleteUserById(Integer id);
}
<?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.boot.mybatis.mapper.UserMapper">
<select id="getAllUser" resultType="org.sang.mybatis.model.User">
select * from t_user;
</select>
<insert id="addUser" parameterType="org.sang.mybatis.model.User">
insert into user (username,address) values (#{username},#{address});
</insert>
<update id="updateUserById" parameterType="org.sang.mybatis.model.User">
update user set username=#{username},address=#{address} where id=#{id}
</update>
<delete id="deleteUserById">
delete from user where id=#{id}
</delete>
</mapper>
2.1.5 Mapper配置文件位置
2.1.5.1 放到UserMapper类同级
必须配置资源插件,因为boot默认只会加载resources的目录文件
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
2.1.5.1 放到resources文件夹中指定的目录
在application.properties中告诉mybatis去哪里扫描mapper:
mybatis.mapper-locations=classpath:mapper/*.xml
2.2 逆向工程
2.2.1 添加逆向工程插件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
2.2.2 指定逆向工程配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry
location="D:\installed\devtools\maven\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar"/>
<context id="mySQL" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/2pc" userId="root"
password="123">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--实体生成的配置-->
<javaModelGenerator targetPackage="com.mmren.edu.domain"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--mapper接口生成配置-->
<sqlMapGenerator targetPackage="com.mmren.edu.mapper"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--mapper对应的映射文件生成配置-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.mmren.edu.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--表对应实体名称的配置-->
<table tableName="t_order" domainObjectName="OrderInfo"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
生成实体,mapper,mapper配置文件
2.3 通用Mapper
通用Mapper就是为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。
2.3.1 添加依赖
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
2.3.2 添加实体
@Table(name="t_user") // 配置实体映射的表名
public class User implements Serializable {
private static final long serialVersionUID = -37900582537861695L;
@Id // 必须配置不配置,如果使用通过ID查询的时候会把所有字段当作条件进行查询
private Integer userId; private String userName; private Integer userAge; private Date userBirth; private Date createTime; private Date updateTime;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public Date getUserBirth() {
return userBirth;
}
public void setUserBirth(Date userBirth) {
this.userBirth = userBirth;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
2.3.3 配置Mapper
@Component
@org.apache.ibatis.annotations.Mapper
public interface UserMapper extends Mapper<User> {
}
2.3.4 配置数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///test1?useSSL=false
username: root
password: 123
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.3.5 编写测试用例
public class MapperTests extends DemoApplicationTests {
@Autowired
private UserMapper userMapper;
///////////////////////// 查询 测试 /////////////////////
// 测试根据ID查询,必须在注解字段标记@Id
@Test
public void testSelectById() throws Exception {
User user = userMapper.selectByPrimaryKey(30001);
convertToJson(user);
}
// 测试根据指定的列进行查询
@Test
public void testSelectByColumns() throws Exception {
// 创建查询条件对象
Example example = new Example(User.class);
example.and().andEqualTo("userName","牧码人")
.andEqualTo("updateTime","2020-04-21 23:42:13.0");
/* Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("userName","牧码人")
.andEqualTo("updateTime","2020-04-21 23:42:13.0");*/
User user = userMapper.selectOneByExample(example);
convertToJson(user);
}
// 测试模糊查询后排序
@Test
public void testSelectByColumnsForLike() throws Exception {
// 创建查询条件对象
Example example = new Example(User.class);
example.and().andLike("userName","%人%")
.andBetween("userAge",1,100);
example.orderBy("userId").desc();
/* Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("userName","牧码人")
.andEqualTo("updateTime","2020-04-21 23:42:13.0");*/
List<User> users = userMapper.selectByExample(example);
convertToJson(users);
}
// 自定义SQL语句查询
@Test
public void testSelectByCustomSql() throws Exception {
// 创建查询条件对象
Example example = new Example(User.class);
example.and().andLike("userName","%人%")
.andBetween("userAge",1,100)
// 自定义拼接的SQL
.andCondition("create_time=","2020-04-22 00:13:58")
// 自定义SQL语句
.andCondition("update_time='2020-04-22 00:13:58'");
example.orderBy("userId").desc();
List<User> users = userMapper.selectByExample(example);
convertToJson(users);
}
// 分页查询(全部)
@Test
public void testSelectByPage() throws Exception {
RowBounds rowBounds = new RowBounds(((1-1)*2),2);
List<User> users = userMapper.selectByRowBounds(new User(), rowBounds);
convertToJson(users);
}
// 分页查询(条件)
@Test
public void testSelectByPageForCondition() throws Exception {
Example example = new Example(User.class);
example.and().andLike("userName","%人%")
.andBetween("userAge",1,100);
example.orderBy("userId").desc();
RowBounds rowBounds = new RowBounds(((1-1)*2),2);
List<User> users = userMapper.selectByExampleAndRowBounds(example, rowBounds);
convertToJson(users);
}
////////////////////////// 添加测试 ////////////////////////
// 插入所有字段
@Value("${random.int[10000,99999]}")
private Integer userId;
@Test
public void testInsert() throws Exception {
User user = new User();
user.setUserAge(30);
user.setUserBirth(new Date());
user.setUserId(40001);
user.setUserName("Gerry");
int row = userMapper.insert(user);
System.out.println(row > 0 ? "成功" : "失败");
}
// 插入选择的字段
@Test
public void testInsertSelective() throws Exception {
User user = new User();
user.setUserAge(30);
user.setUserBirth(new Date());
user.setUserId(userId);
user.setUserName("Gerry");
int row = userMapper.insertSelective(user);
System.out.println(row > 0 ? "成功" : "失败");
}
////////////////////////////// 更新操作 //////////////////////////
// 根据主键更新所有的字段
@Test
public void testUpdateById() throws Exception {
// 根据ID查询信息
User user = new User();
user.setUserId(71636);
user.setUserName("王五11");
int row = userMapper.updateByPrimaryKey(user);
System.out.println(row > 0 ? "成功" : "失败");
}
// 根据主键更新指定的字段
@Test
public void testUpdateSelectiveById() throws Exception {
// 根据ID查询信息
User user = userMapper.selectByPrimaryKey(71636);
user.setUserName("王五");
int row = userMapper.updateByPrimaryKeySelective(user);
System.out.println(row > 0 ? "成功" : "失败");
}
// 根据条件更新所有的字段
@Test
public void testUpdateByExample() throws Exception {
// 创建查询条件对象
Example example = new Example(User.class);
example.and().andEqualTo("userName","牧码人")
.andEqualTo("crateTime","2020-04-21 23:42:13");
int row = userMapper.updateByExample(new User(), example);
System.out.println(row > 0 ? "成功" : "失败");
}
// 根据条件更新指定的字段
@Test
public void testUpdateSelectiveByExample() throws Exception {
// 创建查询条件对象
Example example = new Example(User.class);
example.and().andEqualTo("userName","张三")
.andEqualTo("createTime","2020-04-21 23:41:37");
User user = new User();
user.setUserName("gerry new");
int row = userMapper.updateByExampleSelective(user, example);
System.out.println(row > 0 ? "成功" : "失败");
}
public void convertToJson(Object obj) {
System.out.println("result===>"+JSON.toJSONString(obj, true));
}
///////////////////////////// 测试删除操作
// 根据主键删除记录
@Test
public void testDeleteById() throws Exception {
int row = userMapper.deleteByPrimaryKey(30001);
System.out.println(row > 0 ? "成功" : "失败");
}
// 指定条件删除
@Test
public void testDeleteByExample() throws Exception {
Example example = new Example(User.class);
example.and().andIsNull("userAge");
int row = userMapper.deleteByExample(example);
System.out.println(row > 0 ? "成功" : "失败");
}
// 指定对象删除
@Test
public void testDelete() throws Exception {
User user = new User();
user.setUserName("gerry");
user.setUserId(32118);
int row = userMapper.delete(user);
System.out.println(row > 0 ? "成功" : "失败");
}
}
2.4 Mybatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑;
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作;
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求;
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错;
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题;
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作;
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere );
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用;
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询;
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库;
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询;
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作。
2.4.1 添加依赖
<!--mybatis-plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
2.4.2 添加实体
public class User implements Serializable {
private static final long serialVersionUID = -37900582537861695L;
private Integer userId; private String userName; private Integer userAge; private Date userBirth; private Date createTime; private Date updateTime;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public Date getUserBirth() {
return userBirth;
}
public void setUserBirth(Date userBirth) {
this.userBirth = userBirth;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
2.4.3 添加配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///test1?useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
2.4.4 配置Mapper
@Mapper
@Component
public interface UserMapper extends BaseMapper<User> { }
2.4.5 配置Service
public interface UserService extends IService<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
启动分页
@Configuration
public class PageConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
2.4.6 编写测试用例
public class MpApplicationTests extends DemoMpApplicationTests {
@Autowired
private UserService userService;
@Value("${random.int[10000,99999]}")
private Integer userId;
@Test
public void testSaveUser() throws Exception {
User user = new User();
user.setUserId(userId);
user.setUserName("MP测试3");
user.setUserAge(20);
user.setUserBirth(new Date());
boolean save = userService.save(user);
System.out.println(save ? "成功" : "失败");
}
@Test
public void testSelectAll() throws Exception {
List<User> list = userService.list();
convertToJson(list);
}
@Test
public void testSelectByCondition() throws Exception {
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
//userQueryWrapper.eq("user_name","MP测试1");
userQueryWrapper.lambda().eq(User::getUserName,"Map测试");
List<User> list = userService.list(userQueryWrapper);
convertToJson(list);
}
@Test
public void testSelectByPage() throws Exception {
Page<User> userPage = new Page<>(1, 2);
Page<User> page = userService
.page(userPage,new QueryWrapper<User>().lambda().like(User::getUserName,"测试"));
convertToJson(page);
}
public void convertToJson(Object obj) {
System.out.println("result===>"+ JSON.toJSONString(obj, true));
}
}
Spring Boot+mybatis集成数据库访问的更多相关文章
- # spring boot + mybatis 读取数据库
spring boot + mybatis 读取数据库 创建数据库 use testdb; drop table if exists t_city; create table t_city( id i ...
- Spring Boot初探之数据库访问
一.背景 Spring boot是集服务发布.数据库管理.日志管理等于一身的服务开发框架:是微服务开发的全能小帮手.这章讲述一下如何使用spring boot访问MySQL数据库. 二.搭建基础环境 ...
- Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版
一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...
- Spring Boot MyBatis 数据库集群访问实现
Spring Boot MyBatis 数据库集群访问实现 本示例主要介绍了Spring Boot程序方式实现数据库集群访问,读库轮询方式实现负载均衡.阅读本示例前,建议你有AOP编程基础.mybat ...
- (45). Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
大家在开发的时候,会喜欢jdbcTemplate操作数据库,有喜欢JPA操作数据库的,有喜欢MyBatis操作数据库的,对于这些我个人觉得哪个使用顺手就使用哪个就好了,并没有一定要使用哪个,个人在实际 ...
- 如何通过Spring Boot配置动态数据源访问多个数据库
之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...
- Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取
〇.参考资料 1.hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2.Spring Boot+Mybatis实现登录注 ...
- Spring Boot(二):数据库操作
本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...
- Spring Boot + Mybatis + Redis二级缓存开发指南
Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...
- Spring Boot + Mybatis 实现动态数据源
动态数据源 在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动 ...
随机推荐
- 在Linux下开启指定端口号
1.查看某个端口是否已开启,如果提示no表示未开启 #8888表示要查询的端口号firewall-cmd --query-port=8888/tcp 2.永久开启端口号,提示 success 表示成功 ...
- JAVA 多线程---面经
线程与进程 提到进程那就要说程序,程序有指令和数据,程序从磁盘加载到内存,cpu获得指令进行执行,其中还会用到各种资源如网络资源,磁盘等.一个程序从磁盘进入内存,就是进程实例的创建. 一个程序可以有多 ...
- 酷睿i5与i7处理器有什么区别
本文将深入解析酷睿i5与i7处理器的区别,帮助您做出明智的购买决策.购买笔记本之前,了解处理器相关知识至关重要. 处理器作为电脑的核心部件,其性能直接影响整机运行速度和效率. 市面上主流的笔记本处理器 ...
- (完美解决)chatGPT登陆正常却无法发送消息
这几天要写关于项目的文字性材料,登陆上chatgpt,结果发现登陆正常,各方面都正常,但是点击发送消息就会不停转圈圈,无法发送出去,然后联想到之前看到朋友圈有人说chatGPT崩了,就没多在意,结果今 ...
- [win10] 开始-设置 / 右键-显示设置 / 右键个性化 等都不好使了。。 ms-settings:display
现象: 各种win10自带的都打不开了. 发现: 最近总是断网,重启下就好了,然后点击网络,就一直出不来.后来发现所有win10的窗口都出不来了.控制面板等等. 解决:好消息是最后解决了.坏消息是没有 ...
- C++统计代码运行时间
本来想自己写的,一看github上面都有就不再重复造轮子了.github上的项目如下: StopWatch 纯标准库实现:使用std::chrono::high_resolution_clock,其实 ...
- GoFrame 优化接口的错误码和异常的思路
前言 你是否想在使用 GoFrame 的过程中,拥有一个能打印异常堆栈,能自定义响应状态码,能统一处理响应数据的接口.如果你回答是,那么,请耐心看完本文,或许会对你有所启发.若文中由表达不当之处,恳请 ...
- Dashboard、Rancher与KubeSphere对比
在容器技术和微服务架构日益盛行的今天,对于容器编排和管理平台的选择显得尤为重要.Kubernetes(K8s)作为容器编排的事实标准,其生态系统中涌现出了许多管理和监控工具.其中,Dashboard. ...
- Uni-App 实现资讯滚动
项目需要实现资讯的滚动,使用了Swiper组件,实现了首页头部的资讯滚动,简单地做下笔记 效果 实现说明 主要是使用了Swiper可以自动滚动的特性来实现,左边是一个图片,右边则是Swpier,且姜S ...
- mybatis之Mapped Statements collection does not contain value for...错误原因分析
错误原因有几种: 1.mapper.xml中没有加入namespace: 2.mapper.xml中的方法和接口mapper的方法不对应: 3.mapper.xml没有加入到mybatis-co ...