配置数据源
在配置文件中写好,username,password,url,Driver后,就可以直接连接数据库
@Autowired
DateSource dataSource;
SpringBoot中有很多xxxxTemplate,比如jdbcTemplate,redisTemplate等模板,可以直接拿来即用
jdbctemplate
jdbctemplate是spring自带的,功能比较简单
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
-
配置数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/powernode?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=admin
-
创建JdbcTemplate类,通过JdbcTemplate执行sql语句。
整合Druid连接池:
在pom文件中添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
在application中添加配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrZh5n1B-1628604336793)(D:\Typora\记录\image-20210524223416589.png)]
spring:
datasource:
username: root
password: admin
url: jdbc:mysql://localhost:3306/springstudy4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
添加Druid配置文件
@Configuration
public class DruidConfig {
//数据源的使用
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource DruidDataSource(){
return new DruidDataSource();
}
//后台监控:相当于web.xml
//因为springboot内置了servlet容器,所以没有web.xml,用ServletRegistrationBean替代了web.xml
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean=new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
HashMap<String,String> initParameters=new HashMap<>();
//增加配置
initParameters.put("loginUsername","root");//登录key是固定的 loginUsername loginPassword
initParameters.put("loginPassword","admin");
//设置谁可以访问
initParameters.put("allow","");
//禁止谁可以访问
//initParameters.put("hs","192.168.1.1");
bean.setInitParameters(initParameters);
return bean;
}
//配置拦截器
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean=new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//这些东西不进行统计
Map<String,String> initParameters=new HashMap<>();
initParameters.put("exclusions","*.js,*.css,/druid/*");
return bean;
}
}
只要在配置文件中写了
type: com.alibaba.druid.pool.DruidDataSource
项目连接池就变成了Druid
整合mybatis:
1.使用xml文件方式
1.添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
2.建立UserMapper接口
开启自动扫描方法:
方法1:Springboot启动类上添加注解@MapperScan(“com.hs.mapper”)
方法2:在Mapper接口上添加@Mapper
3.在resources下新建一个目录mybatis,在mybatis下新建一个目录mapper,在mapper目录中新建对应的xml文件
<?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.hs.backstage.mapper.UserMapper">
4.在配置文件中添加相关配置
#整合mybatis
#设置实体类的别名
mybatis.type-aliases-package=com.hs.springbootstudy5_mybatis.domain
#设置mapper配置文件所在的位置 classpath后不需要/
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
#开启驼峰命名,即自动将mysql中的hs_a转化为hsA
mybatis.configuration.map-underscore-to-camel-case=true
2.使用全注解方式
同样添加依赖,并在配置文件中配置
只是建立Mapper接口时有所不同
@Mapper
public interface UserMapper {
@Select("select ename userName,job password from emp where empno=#{id}")
public User getUser(Long id);
}
xml文件方式和注解方式可以混合使用。但是如果一个方法使用了注解方式,那么xml文件中就不能有这个方法
整合mybatis-plus
- 引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
mybatis-plus中包含mybatis,引入Mybatis-plus后不需要再引入mybatis
-
mapperLocations XML文件路径是自动配置好的。默认值为classpath*:/mapper/**/*.xml;
包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。 建议以后sql映射文件,放在 mapper下
-
编写Mapper接口,只要写一个Mapper接口继承BaseMapper<要操作的实体类>,并且在这个接口上添加@Mapper就可以了
-
编写service接口及service实现类;service接口需要继承IService< T>,实现类需要继承ServiceImpl<M,T> ,并继承service接口
mybatisplus的注解
- @TableName(“xxx”) 在实体类上添加,指定数据库中对应的表名,不加默认为类名
- @TableId(“xxx”) 在属性上添加,指定主键 有一个type属性用来指定主键类型:AUTO 数据库ID自增;INPUT insert前自行set主键值;
- @TableField(“xxx”) 加在属性上,指定数据库中对应的属性名
- @Version 乐观锁注解、标记
@Verison
在字段上
mybatisplus的配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志
mybatisplus分页
- MP中有一个Page类用于分页
Page<Teacher> page = new Page<>(pn, 2);//按页查询数据
//分页查询结果,包含当前页码、查询结果、总页码数等等
Page<Teacher> page1 = teacherService.page(page,null);
model.addAttribute("teacherpage",page1);
List<Teacher> records = page1.getRecords();//获取结果中的teachers信息
long current = page1.getCurrent();//获取当前页码
- 还需要添加分页配置类才能使第 1 步中的分页代码生效
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//这是分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.H2);
paginationInnerInterceptor.setMaxLimit(500L);//设置每页最大条数
paginationInnerInterceptor.setOverflow(true);//当查询到末位时是否循环
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
thymeleaf中分页所需代码:
<li th:class="${num==user.current}?'active':''">如果页码num等于当前页码,就让这个页码常亮
th:each="num:${#numbers.sequence(1,users.pages)}"生成1到users.pages的数列
th:href="@{/dynamic_table(pn=${num})} 动态添加参数 结果为/dynamic_table?pn=xxx
<li th:class="${teacherpage.current==num?'active':''}" th:each="num:${#numbers.sequence(1,teacherpage.pages)}">
<a th:href="@{/dynamic_table(pn=${num})}">[[${num}]]</a><a href="#">[[${num}]]</a>
</li>
请求转发时携带参数:
public String dynamicTable(@RequestParam(value = "pn",defaultValue = "1") Integer pn,
Model model,
RedirectAttributes re)
{
re.addAttribute("pn",1);//重定向也能带参数pn,值为1
return "redirect:main";
}