Spring Boot 從零到一:連接數據庫

前言

上一篇已經創建好了一個最簡單的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");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章