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集成数据库访问的更多相关文章

  1. # spring boot + mybatis 读取数据库

    spring boot + mybatis 读取数据库 创建数据库 use testdb; drop table if exists t_city; create table t_city( id i ...

  2. Spring Boot初探之数据库访问

    一.背景 Spring boot是集服务发布.数据库管理.日志管理等于一身的服务开发框架:是微服务开发的全能小帮手.这章讲述一下如何使用spring boot访问MySQL数据库. 二.搭建基础环境 ...

  3. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  4. Spring Boot MyBatis 数据库集群访问实现

    Spring Boot MyBatis 数据库集群访问实现 本示例主要介绍了Spring Boot程序方式实现数据库集群访问,读库轮询方式实现负载均衡.阅读本示例前,建议你有AOP编程基础.mybat ...

  5. (45). Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】

    大家在开发的时候,会喜欢jdbcTemplate操作数据库,有喜欢JPA操作数据库的,有喜欢MyBatis操作数据库的,对于这些我个人觉得哪个使用顺手就使用哪个就好了,并没有一定要使用哪个,个人在实际 ...

  6. 如何通过Spring Boot配置动态数据源访问多个数据库

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  7. Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取

    〇.参考资料 1.hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2.Spring Boot+Mybatis实现登录注 ...

  8. Spring Boot(二):数据库操作

    本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...

  9. Spring Boot + Mybatis + Redis二级缓存开发指南

    Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...

  10. Spring Boot + Mybatis 实现动态数据源

    动态数据源 在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动 ...

随机推荐

  1. 离线部署-docker

    离线部署---docker 关键词:docker离线部署,images离线安装,docker compose,shell,minio docker离线安装 docker install offline ...

  2. IDEA使用与多线程

    IDEA缩写和快捷键 psvm全称public static void main sout 全称public static void main alt+enter 处理异常 s.out 自动打印s c ...

  3. vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码

    vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码

  4. WPF之命令

    目录 命令系统的基本元素 基本元素之间的关系 小试命令 WPF的命令库 命令参数 命令与Binding的结合 近观命令 ICommand接口与RoutedCommand 自定义Command 定义命令 ...

  5. go语言漏桶算法思路简单实现

    package main import ( "fmt" "time" ) // 桶 type LeakBucket struct { capacity int ...

  6. KingbaseES 数据库中不同user的视图访问授权

    前言 本文的目的是实现u1用户访问ud用户下的视图权限. 测试 登录system用户并创建schema,user,并授权schema的有关权限给ud用户 TEST=# select current_u ...

  7. [apue] 书中关于打印服务代码的一个错误

    在看 apue 第 21 章 与网络打印机通信一章时,发现一段关于链表操作的代码有问题,现在摘出来让大家 review 一下.先上代码: printd.c 这是打印服务的源代码,在打印时,用户通过  ...

  8. #状压dp,拓扑排序,内向基环树#CF1242C Sum Balance

    题目 有 \(k\) 个盒子, 第 \(i\) 个盒子有 \(n_i\) 个数. 保证所有数互不相同. 从每个盒子各拿出一个数, 并按照某种顺序放回去(每个盒子恰好放入一个数). 判断是否能使操作后所 ...

  9. #点分治,Kruskal#AT3611 Tree MST

    题目 给定一棵 \(n\) 个节点的树,现有有一张完全图, 两点 \(x,y\) 之间的边长为 \(w_x+w_y+dis_{x,y}\), 其中 \(dis\) 表示树上两点的距离. 求完全图的最小 ...

  10. PriorityQueue和PriorityBlockingQueue

    目录 简介 PriorityQueue PriorityBlockingQueue PriorityQueue和PriorityBlockingQueue 简介 Queue一般来说都是FIFO的,当然 ...