Spring对数据库的操作在jdbc上面做了更深层次的封装,而JdbcTemplate便是Spring提供的一个操作数据库的便捷工具。我们可以借助JdbcTemplate来执行所有数据库操作,例如插入,更新,删除和从数据库中检索数据,并且有效避免直接使用jdbc带来的繁琐编码。
当然,在大部分情况下,我们都会直接使用更加强大的持久化框架来访问数据库,比如MyBatis、Hibernate或者Spring Data JPA,我们这里讲解JdbcTemplate的整合,只是告诉大家有这么一种操作数据库的方式。
导入数据源的场景和数据库驱动:要使用JdbcTemplatedbc则导入这两个依赖配合使用
org.springframework.boot
spring-boot-starter-data-jdbc
mysql
mysql-connector-java
springboot默认自动进行了mysql版本仲裁:
但是不一定和我们本机的mysql版本对应:这时候我们要保持版本一致。
解决方法一:
1.yml中添加数据源配置:
在application.yml中 ,添加MySQL数据源的连接信息。
2.配置数据库的必要参数值:
说明:yml中的jdbc.template.下的query-timeout可以不用配置(建议不配置此项);
package com.fan.redis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
@SpringBootTest
class SpringbootRedisApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void testjdbcTemplate(){
Integer integer = jdbcTemplate.queryForObject("select count(*) from user ", Integer.class);
System.out.println("查出的记录数:"+integer);
}
}
效果:查出的记录数:7
测试:
开启防火墙;
配置登录名字:
刷新:
可以先登录后台管理,然后路径改成sql,这样就有了session的信息了。
Druid连接池的介绍:
Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。
com.alibaba
druid-spring-boot-starter
1.1.17
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
# ...其他配置(可选,不是必须的,使用内嵌数据库的话上述三项也可省略不填,使用druid的话不能省略)
Druid Spring Boot Starter 配置属性的名称完全遵照 Druid,你可以通过 Spring Boot 配置文件来配置Druid数据库连接池和监控,如果没有配置则使用默认值。
JDBC 配置
spring.datasource.druid.url= # 或spring.datasource.url=
spring.datasource.druid.username= # 或spring.datasource.username=
spring.datasource.druid.password= # 或spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=
连接池配置:
spring.datasource.druid.initial-size=
spring.datasource.druid.max-active=
spring.datasource.druid.min-idle=
spring.datasource.druid.max-wait=
spring.datasource.druid.pool-prepared-statements=
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=
spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.validation-query=
spring.datasource.druid.validation-query-timeout=
spring.datasource.druid.test-on-borrow=
spring.datasource.druid.test-on-return=
spring.datasource.druid.test-while-idle=
spring.datasource.druid.time-between-eviction-runs-millis=
spring.datasource.druid.min-evictable-idle-time-millis=
spring.datasource.druid.max-evictable-idle-time-millis=
spring.datasource.druid.filters= #配置多个英文逗号分隔
....//more
监控配置:
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值false
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=
# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
spring.datasource.druid.stat-view-servlet.login-username=
spring.datasource.druid.stat-view-servlet.login-password=
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=
# Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
spring.datasource.druid.aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
Druid Spring Boot Starter 不仅限于对以上配置属性提供支持,DruidDataSource 内提供setter方法的可配置属性都将被支持。你可以参考WIKI文档或通过IDE输入提示来进行配置。配置文件的格式你可以选择.properties或.yml,效果是一样的,在配置较多的情况下推荐使用.yml。
分析自动配置
找此类:DruidDataSourceAutoConfigure
springboot配置文件中数据源的各项配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
password: root
username: root
driver-class-name: com.mysql.cj.jdbc.Driver
#type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
druid:
aop-patterns: com.fan.admin.* #监控springbean
filters: stat,wall #底层开启功能,stat(sql监控),wall(防火墙)
stat-view-servlet: #配置监控页功能
enabled: true
login-username: admin
login-password: 123
reset-enable: false
web-stat-filter: #监控web
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter: #对上面filter里面的stat的详细配置,防火墙的配置
stat:
slow-sql-millis: 1000
log-slow-sql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
jdbc:
template:
query-timeout: 3
代码演示,数据层使用mybatis,结合thymleaf进行测试:
JDBC依赖必须要?
总结:无论springboot整合mybatis框架,还是springboot整合web资源,都不用添加jdbc依赖。
1.maven依赖:
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-jdbc
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
org.mybatis.generator
mybatis-generator-maven-plugin
1.4.0
mysql
mysql-connector-java
8.0.22
2.然后配置application.yal:
spring:
#jdbc配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/test?allowMultiQueries=true&useSSL=false&serverTimezone=UTC
#开启restful风格支持
mvc:
hiddenmethod:
filter:
enabled: true
#mybatis基本配置
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
3.写一个简单的HelloController进行测试:
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model){
model.addAttribute("msg","thymleaf,你好");
return "hello";
}
}
4.templates下的hello.html:
Title
成功页面
1.然后我们使用逆向工程的工具:generatorConfig.xml:
2.然后在maven的plugins中找到mybatis-generator工具,并运行,注意要先在数据库中创建好表且不要用user名字的表(存在冲突,遇到过这个坑),和不能在多个数据库中有相同的表名(遇到过这个坑)。
3.然后我们就可以在测试类中测试:
@SpringBootTest
class SpringbootAdminweb01ApplicationTests {
@Resource
LoginUserMapper loginUserMapper;
@Test
void contextLoads() {
int x = loginUserMapper.insert(new LoginUser(null, "fandongdong", "123"));
System.out.println(x);
}
}
正常情况下会测试成功的。这样想让我们的数据库跑起来。
参照官方文档:
https://github.com/alibaba/druid
https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
第一步:引入相应的场景启动器:
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.4
第二步:配置:
注意我们把mybatis全局配置文件编写完后,一定要将全局配置文件的位置告诉springboot的总配置文件application.yml。
通过mybatis.config-location: (全局配置文件的位置)
通过此配置mybatis.mapper.location:(sql映射文件的位置)
mapper接口的位置通过@MapperScan(“com.fan.mapper”)来告知springboot;
注意我们也可以这样设置,不需要mybatis-config.xml文件,和此配置:config-location: classpath:mybatis-config.xml
无需一一注册所有映射器。相反,您可以让MyBatis-Spring扫描它们的类路径。
有三种不同的方法可以做到这一点:
使用mybatis:scan元素。
使用注释 @MapperScan(推荐使用)
使用经典的Spring xml文件并注册 MapperScannerConfigurer
双方mybatis:scan/并@MapperScan在MyBatis的spring1.2.0引入的功能。@MapperScan需要Spring 3.1或更高版本。
从2.0.2开始,映射器扫描功能支持选项(lazy-initialization),该选项控制启用/禁用映射器bean的延迟初始化。添加该选项的动机是支持Spring Boot 2.2支持的惰性初始化控制功能。此选项的默认值为false(=不使用延迟初始化)。如果开发人员想要对映射器bean使用延迟初始化,则应将其设置为trueexpress。
重要的如果使用延迟初始化功能,则开发人员需要了解以下限制。如果满足以下任一条件,则通常无法在应用程序上使用延迟初始化功能。
当使用()和()引用其他映射器的语句时@One@Many
当包括对的片段其他映射器使用
当使用()引用其他映射器的缓存时@CacheNamespaceRef
当使用()引用其他映射器的结果映射时@ResultMap
package com.fan.admin.mapper;
import com.fan.admin.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper//Mapper接口
public interface UserMapper {
//此接口方法的实现我们写在xml文件中
public User getUser(Integer id);
}
Service代码:
package com.fan.admin.service;
import com.fan.admin.entity.User;
import com.fan.admin.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userService")
public class UserService {
@Resource//这里使用此注解避免报错
private UserMapper userMapper;//注入Mapper接口
public User getUser(Integer id){
return userMapper.getUser(id);
}
}
Cntroller代码:
package com.fan.admin.controller;
import com.fan.admin.entity.User;
import com.fan.admin.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
@Controller
public class SqlStateController {
@Autowired
private JdbcTemplate jdbcTemplate;
@Resource
private UserService userService;//注入service组件
@ResponseBody
@GetMapping("/user")
public User getUserById(@RequestParam("id") Integer id){
User user = userService.getUser(id);
return user;
}
}
mybatis-config.xml文件:
两种开启驼峰命名的方式只能选择一个:不然报错
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#configuration:
#map-underscore-to-camel-case: true
mapper接口:操作数据库的,相当于实体层
service:
纯注解版的mybatis就不需要sql映射文件了。因为我们已经在mapper接口那里写了。
测试:
mybatis-plus的官网:
https://mp.baomidou.com/
MybatisX快速开发插件:
MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。
安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx 搜索并安装。
mybatis-plus快速开始:
第一步,先创建一张表:
引入依赖;
看自动配置类的原理:
mapper映射文件的位置,默认是类路径下的mapper文件夹下:
实体类准备:
我们定义的mapper接口继承一个BaseMapper:
解决数据库的表名和实体类名不一致的方法:
默认情况下类名会去数据库中找和它实体类名一样的表。
修改service接口和实现类:
MP快速开始的小结:
通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!
从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。
mybatis原生的分页插件的官方文档:
链接: https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md.
mybatis与springboot结合的分页的官方文档:
链接: https://github.com/pagehelper/pagehelper-spring-boot.
MyBatis-Plus参考链接:
链接: https://www.cnblogs.com/l-y-h/p/12859477.html.
https://www.cnblogs.com/l-y-h/p/12859477.html
找到分页条,我们拿来用一下,然后在页面审查元素,右键copy-copy element即可,放到table表格下,然后ctrl+alt+l 进行代码的格式化。
我们可以参考官网的设置,进行部分修改即可:
https://mp.baomidou.com/guide/page.html
com.fan.admin.config.MybatisConfig的编写:
package com.fan.admin.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisConfig {
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.H2);
paginationInnerInterceptor.setOverflow(true);
paginationInnerInterceptor.setMaxLimit(500L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
分页有关的js:
分页的后台代码controller:
//无条件的分页查找
@GetMapping("/dynamic_table_bookPage")
public String dynamic_table_bookPage(
@RequestParam(required = true,defaultValue = "1",value = "pageNum")Integer pageNum,
@RequestParam(defaultValue = "3",value = "pageSize")Integer pageSize,
Model model
){
if(pageNum==null || "".equals(pageNum)){
pageNum = 1;
}
if(pageSize == null || "".equals(pageSize)) {
pageSize = 3;
}
Page bookPage = new Page<>(pageNum, pageSize);
System.out.println("bookPage***********"+bookPage);
Page page = bookService.getBaseMapper().selectPage(bookPage, null);
page.getRecords().forEach(System.out::println);
model.addAttribute("page",page);
return "table/dynamic_table_book";
}
新增和修改的js代码:
//打开新增模态框
$("#insert_open").click(function () {
alert("打开新增表单");
//重置表单
$('#layer_form')[0].reset();//重置表单
$("#myModalLabel").text("新增图书");
//设置表单的action
$("#layer_form").prop("action","/book/insertBook");
//弹出模态框
$("#myModal").modal('show');
});
后台controller代码:
//增加
@PostMapping("/insertBook")
public String insertBook(Model model,Book book){
log.info("前端参数:{}",book);
boolean save = bookService.save(book);
if(save){
return "redirect:/book/dynamic_table_bookPage";//重新定向到查询
}else {
model.addAttribute("msg","添加失败");
}
return "table/dynamic_table_book";
}
//修改要经过两个步骤,回显和更新
@ResponseBody
@PostMapping("/selectById")
public Book selectById(Model model,@RequestParam(value = "id") Integer id){
Book book = bookService.getById(id);
System.out.println("查询回显数据^^^^^^^^^^^^:"+book);
//model.addAttribute("book",book);
return book;
}
@PostMapping("/updateBook")
public String updateBook(Model model, Book book){
boolean b = bookService.updateById(book);
System.out.println("修改:==========================="+book);
return "redirect:/book/dynamic_table_bookPage";
}
删除
//删除一个用户,使用路径变量的方式
@GetMapping("/user/delete/{id}")
public String deleteUserById(@PathVariable("id") Integer id,
@RequestParam(value = "pn",defaultValue = "1")Integer pn,
RedirectAttributes re){
userService.removeById(id);
re.addAttribute("pn",pn);
return "redirect:/dynamic_table";
}
查询参数的回显: