前言
上一篇已經創建好了一個最簡單的Spring Boot項目,那接下來按照我自己的思路是把ta和數據庫連接起來。
接下來是用到阿里的數據連接池和mybatisplus,爲什麼用這他們原因很多,比較重要的點 1國產 2到目前還在持續更新 3習慣問題
正文
先在pom.xml 添加以下依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid數據庫 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 省去手寫getter或equals方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybatisplus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
然後去application.yml下添加配置,這一步將配置根據運行環境修改成多個application.yml、application-dev.yml、application-xxx.yml
application.yml
server:
port: 8089
spring:
# 環境 dev|test|prod
profiles:
active: dev
#mybatis
mybatis-plus:
#MyBatis Mapper 所對應的 XML 文件位置
mapper-locations: classpath*:mapper/**/*.xml
# MyBaits 別名包掃描路徑,通過該屬性可以給包中的類註冊別名,
#註冊後在 Mapper 對應的 XML 文件中可以直接使用類名,而不用使用全限定的類名(即 XML 中調用的時候不用包含包名)
typeAliasesPackage: com.zz.ll.*.entity
configuration:
#使用駝峯法映射屬性,配置這個resultType可以映射
map-underscore-to-camel-case: true
global-config:
db-config:
#主鍵類型 AUTO:"數據庫ID自增", INPUT:"用戶輸入ID", ID_WORKER:"全局唯一ID (數字類型唯一ID)", UUID:"全局唯一ID UUID";
#id-type: AUTO
# 配置表明前綴,例如表設計時錶名爲tb_manager,對應entity爲Manager
#table-prefix: admin_
#邏輯已刪除值
logic-delete-value: 1
#邏輯未刪除值
logic-not-delete-value: 0
# 是否開啓like查詢,即對 stirng 字段是否使用 like,默認不開啓
# column-like: false
#原生配置
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
jdbc-type-for-null: 'null'
application-dev.yml
server:
port: 8088
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://ip:port/databaseName?characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false
username: ***
password: ***
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
#Oracle需要打開註釋
#validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
enabled: true
url-pattern: /druid/*
#login-username: admin
#login-password: admin
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true
在啓動類加上兩個註解
@MapperScan("com.zz.ll.admin.dao")
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
package com.zz.ll;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@MapperScan("com.zz.ll.admin.dao")
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class LlApplication {
public static void main(String[] args) {
SpringApplication.run(LlApplication.class, args);
}
}
根據MyBatis-Plus官方文檔(https://mp.baomidou.com/guide/quick-start.html#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B7%A5%E7%A8%8B)寫道這裏就好了,但是我實際上遇到了問題:Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
這裏是默認的他不知道用,所以我們自己手動把bean注入所以創建MybatisPlusConfig
package com.zz.ll.datasource.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* Mybatis-Plus 配置相關
*/
@Configuration
public class MybatisPlusConfig {
/**
* Mybatis-Plus 分頁插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求 默認false
// paginationInterceptor.setOverflow(false);
// 設置最大單頁限制數量,默認 500 條,-1 不受限制
// paginationInterceptor.setLimit(500);
// 開啓 count 的 join 優化,只針對部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
/**
* druid注入
*/
@Bean
@ConfigurationProperties(prefix="spring.datasource.druid")
public DataSource DataSource() { return new DruidDataSource(); }
}
當然導致這個還有幾種可能
1.@MapperScan("com.zz.ll.admin.dao") 這裏的路徑不對
2.mapper-locations: classpath*:mapper/**/*.xml
typeAliasesPackage: com.zz.ll.*.entity 這裏的路徑不對
項目裏使用的是自己封裝的分頁,sql 基本上也是自己寫的。這裏爲了體現Mybatis-Plus的核心功能,我們使用CRUD 接口和自帶的分頁
package com.zz.ll.admin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("admin_user_info")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "user_id", type = IdType.INPUT)
private String id;
@TableField(value = "s_name")
private String name;
@TableField(value = "status")
private Integer status;
@TableField(value = "ct_time")
private Date ctTime;
}
package com.zz.ll.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zz.ll.admin.entity.User;
import java.util.List;
public interface UserService extends IService<User> {
public List<User> getList();
IPage<User> selectPageVo(Page<?> page, Integer status);
}
package com.zz.ll.admin.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zz.ll.admin.dao.UserDao;
import com.zz.ll.admin.entity.User;
import com.zz.ll.admin.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
@Autowired
private UserService userService;
@Autowired
private UserDao userDao;
@Override
public List<User> getList() {
return userService.list();
}
@Override
public IPage<User> selectPageVo(Page<?> page, Integer status) {
return userDao.selectPageVo(page,status);
}
}
package com.zz.ll.admin.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zz.ll.admin.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDao extends BaseMapper<User> {
/**
* <p>
* 查詢 : 根據state狀態查詢用戶列表,分頁顯示
* </p>
*
* @param page 分頁對象,xml中可以從裏面進行取值,傳遞參數 Page 即自動分頁,必須放在第一位(你可以繼承Page實現自己的分頁對象)
* @param status 狀態
* @return 分頁對象
*/
IPage<User> selectPageVo(Page<?> page, Integer status);
}
<?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.zz.ll.admin.dao.UserDao">
<select id="selectPageVo" resultType="com.zz.ll.admin.entity.User">
SELECT * from admin_user_info WHERE status=#{status}
</select>
</mapper>
最後我們打開Druid的sql監控這一塊,任然是在MybatisPlusConfig。
package com.zz.ll.datasource.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* Mybatis-Plus 配置相關
*/
@Configuration
public class MybatisPlusConfig {
/**
* Mybatis-Plus 分頁插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求 默認false
// paginationInterceptor.setOverflow(false);
// 設置最大單頁限制數量,默認 500 條,-1 不受限制
// paginationInterceptor.setLimit(500);
// 開啓 count 的 join 優化,只針對部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
/**
* druid注入
*/
@Bean
@ConfigurationProperties(prefix="spring.datasource.druid")
public DataSource DataSource() { return new DruidDataSource(); }
/**
* 註冊一個StatViewServlet
*/
@Bean
public ServletRegistrationBean druidStatViewServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid/*");
//添加初始化參數:initParams
//白名單:
//servletRegistrationBean.addInitParameter("allow","127.0.0.1");
//IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
//servletRegistrationBean.addInitParameter("deny","192.168.1.100");
//登錄查看信息的賬號密碼.
//servletRegistrationBean.addInitParameter("loginUsername","admin");
//servletRegistrationBean.addInitParameter("loginPassword","111111");
//是否能夠重置數據.
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
/**
* 註冊一個:filterRegistrationBean
*/
@Bean
public FilterRegistrationBean druidStatFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
//添加過濾規則.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
在啓動項目後,訪問http://localhost:8088/druid/ 即可看到,如果需要登陸輸入自己設置的賬號密碼//servletRegistrationBean.addInitParameter("loginUsername","admin");
//servletRegistrationBean.addInitParameter("loginPassword","111111");