SpringBoot学习总结
1.springboot整合Druid/HikariCP+ mybatis+thymeleaf+logback.xml日志输出
- Step1: pom文件引入相关依赖
<!-- springboot整合Druid连接池 -->
<dependency>-->
<groupId>com.alibaba</groupId>-->
<artifactId>druid</artifactId>-->
<version>1.1.21</version>-->
</dependency>
<!-- -------------连接池二选一,优先采取HikariCP号称速度最快 -->
<!-- springboot整合HikariCP连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<!-- 排除tomcat-jdbc 以使用HikariCP -->
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatis整合 springboot -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!-- 整合thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
-
Step2: logback.xml : 建议直接复制cv
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <!--改成你自己的,这里value直接写个名字会在当前项目下生成Logs文件--> <property name="LOG_HOME" value="logs"/> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}/logback.log</FileNamePattern> <!--日志文件保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> </root> </configuration>
-
Step3: yml配置文件
spring:
// druid连接池配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: jack
password: 123456
//连接池 二选一 建议HikariCP号称最快最牛逼
//HikariCP连接池配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: jack
password: 123456
hikari:
minimum-idle: 5
idle-timeout: 600000
maximum-pool-size: 10
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
// thymeleaf配置 默认找resouces底下的templates里面的html页面,不用像mvc一样配置
thymeleaf:
cache: false
mode: HTML
encoding: UTF-8
servlet:
content-type: text/html
//mybatis配置
mybatis:
type-aliases-package: com.guanqi.domain
mapper-locations: classpath:mapper/**/*.xml
//添加logback配置文件
logging:
config: src/main/resources/logback.xml
-
Step4 : 例子:编辑页面
1.在resouces包底下的templates包创建HTML文件
2.在Html标签 中添加属性 xmlns:th=“http://www.thymeleaf.org”
3.前端控制器返回Modal(“u”,user)
4.单个对象数据,需要在form标签添加 th:object"${u}"
5.form表单下的所有标签如需要u对象里面的数据 需要 添加 th:value="*{对应的entity属性名}"<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post" th:object="${u}"> uid:<input type="text" th:value="*{id}" /><p/> username:<input type="text" th:value="*{username}" /><p/> birthday:<input type="text" th:value="*{birthday}" /><p/> sex:<input type="text" th:value="*{sex}" /><p/> addr:<input type="text" th:value="*{address}" /><p/> <input type="submit" value="submit" /> </form>
```
-
Step4: 需要在main方法启动器类上面添加多一个@MapperScan注解,扫面注解相应的mapper,此注解是因为配置了mybatis所以需要添加使用,如果是jpa则不需要添加;
@SpringBootApplication @MapperScan("这里填写mapper或者dao包的全路径 例如:com.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
2.Springboot+HikariCP连接池+tk.mybatis+pagehelper插件使用
-
POM.xml 添加相关依赖
<!-- springboot 整合tk.mybatis--> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency> <!-- springboot整合HikariCP--> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <!-- 排除tomcat-jdbc 以使用HikariCP --> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency> <!-- MYSQL驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- pagehelper插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency>
-
application.yml 文件添加配置
server: port: 8080 spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false username: jack password: 123456 hikari: minimum-idle: 5 idle-timeout: 600000 maximum-pool-size: 10 auto-commit: true pool-name: MyHikariCP max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1 mybatis: type-aliases-package: com.guanqi.domain mapper-locations: classpath:mapper/**/*.xml logging: level: root: info
-
在springboot启动器的类的包之外建立tkmapper接口 例如当前项目包是com.demo, 则需要另外新建一个包tk.mybatis.mapper包下存放以下 tkmapper接口
/**
* 注意:此接口不可以被扫描到,否则会出错,所以单独拎出来放另外得包
* @Classname
* @Description TODO
* @Date 2020/4/11 20:10
* @Author 56901
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
-
dao层的mapper接口 继承tkmapper接口 而后在service层调用dao接口的父类方法(包含增删改查,不需要在mapper.xml写sql语句了,tkmybaits在mybatis的基础上进行了封装),对于开发者而言可以更好的专注于业务。
/** * @Classname ${Name} * @Description TODO * @Date 2020/4/11 20:30 * @Author 56901 */ public interface UserMapper extends MyMapper<User> { //此接口内不需要写任何东西,crud都在父类。 }
-
pagehelper插件的使用
在idea中直接调用PageHelper.startPage(pageNum,pageSize)方法 而后创建一个PageInfo<>()对象 //从第一页开始查询五条数据 PageHelper.startPage(1,5);
//把相应的查询结果放进PageInfo对象里面完成封装,返回此对象给前端。
//第一种方式采用有参构造注入
PageInfo pageBean = new PageInfo<>(userMapper.selectAll());//第二种方式采用set注入
//pageBean 对象里面内置了分页所需要的所有数据但不包含 数据库获取的list对象集合数据,所以只需要设置List集合对象就可以了。
PageInfo<User> pageBean = new PageInfo<>();
pageBean.setList(userMapper.selectAll());
3.springboot测试的正确打开方式
- for example:
加上事务注解
以及回滚注解
以及slf4j日志注解
@SpringBootTest
@Transactional
@Rollback
@Slf4j
class DemoApplicationTests {
@Resource
private UserMapper userMapper;
/**
* 查询全部
*/
@Test
void contextLoads() {
List<User> users = userMapper.selectAll();
users.forEach(user -> System.out.println(user));
}
/**
* add user
*/
@Test
public void testInsert() {
User user = new User();
user.setUsername("啥子");
user.setAddress("北京");
user.setBirthday(new Date(1996));
user.setSex("男");
userMapper.insert(user);
}
/**
* 分页
*/
@Test
public void testFindbyPage(){
PageHelper.startPage(1,5);
PageInfo<User> pageBean = new PageInfo<>(userMapper.selectAll());
System.out.println("总页数="+pageBean.getPages());
System.out.println("总共记录数"+pageBean.getTotal());
System.out.println("当前页码"+pageBean.getPageNum());
pageBean.getList().forEach(user -> System.out.println(user));
//查看封装的东西是什么
System.out.println(pageBean);
log.info(pageBean.toString());
}
}