springboot + springDataJpa初步配置和简单自定义sql

这段时间需要用springboot+springDataJpa为基础配置一个项目后台。

这是项目部分依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-data-mongodb</artifactId>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-solr</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.restdocs</groupId>
            <artifactId>spring-restdocs-mockmvc</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>1.5.8</version>
                <executions>
                    <execution>
                        <id>generate-docs</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>process-asciidoc</goal>
                        </goals>
                        <configuration>
                            <backend>html</backend>
                            <doctype>book</doctype>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework.restdocs</groupId>
                        <artifactId>spring-restdocs-asciidoctor</artifactId>
                        <version>${spring-restdocs.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <!--for others-->
        <!--        阿里源-->
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <!--<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>-->
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
        <!--for testng repository 下载testng-->
        <repository>
            <id>jcenter</id>
            <name>bintray</name>
            <url>http://jcenter.bintray.com</url>
        </repository>
    </repositories>

然后写配置文件application.yml和dev.yml

server:
  port: 47
spring:
  profiles:
    active: dev

  jpa:
    hibernate:
      #自动建表
      ddl-auto: update
      #查看sql
      show-sql: true
      format_sql: true
      database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties:
      show-sql: true
      format_sql: true
      database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
  main:
    allow-bean-definition-overriding: true
logging:
  config: classpath:config/log4j2.xml
spring:
  rabbitmq:
    addresses: 47.106.188.177
  mvc:
    view:
      prefix: templates
      suffix: .html
  datasource:
    username: carblog
    password: 
    type: com.alibaba.druid.pool.DruidDataSource
    # 配置监控统计拦截的filters,去掉后监控界面sql将无法统计,'wall'用于防火墙
    filters: stat, wall, log4j
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://url/carblog?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
    logSlowSql: true
    # 初始化
    initialSize: 3
    # 最大
    maxActive: 20
    # 最小
    minIdle: 3
    # 最大连接等待超时时间
    maxWait: 60000
    # 打开PSCache,并且指定每个连接PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000

这样就直接可以启动了。

配置一下log4j,这里注意要将springboot内置的logging移除。

然后再配置对应log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>

<!--设置log4j2的自身log级别为warn-->

<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,

    当设置成trace时,你会看到log4j2内部各种详细输出-->

<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->

<configuration status="warn" monitorInterval="30">

    <!--先定义所有的appender-->

    <appenders>

        <!--这个输出控制台的配置-->

        <console name="Console" target="SYSTEM_OUT">

            <!--输出日志的格式-->

            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

        </console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->

        <File name="log" fileName="log/test.log" append="false">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

        </File>

        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,

        则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->

        <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"

                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">

            <Filters>

                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->

                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>

                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>

            </Filters>

            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

            <Policies>

                <TimeBasedTriggeringPolicy/>

                <SizeBasedTriggeringPolicy size="100 MB"/>

            </Policies>

        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"

                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">

            <Filters>

                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>

                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>

            </Filters>

            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

            <Policies>

                <TimeBasedTriggeringPolicy/>

                <SizeBasedTriggeringPolicy size="100 MB"/>

            </Policies>

            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->

            <DefaultRolloverStrategy max="20"/>

        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"

                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">

            <ThresholdFilter level="ERROR"/>

            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

            <Policies>

                <TimeBasedTriggeringPolicy/>

                <SizeBasedTriggeringPolicy size="100 MB"/>

            </Policies>

        </RollingFile>

    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->

    <loggers>

        <!--过滤掉spring和hibernate的一些无用的debug信息-->

        <logger name="org.springframework" level="INFO">

        </logger>

        <logger name="org.mybatis" level="INFO">

        </logger>

        <root level="all">

            <appender-ref ref="Console"/>

            <appender-ref ref="RollingFileInfo"/>

            <appender-ref ref="RollingFileWarn"/>

            <appender-ref ref="RollingFileError"/>

        </root>

    </loggers>

</configuration>

这个配置文件可以直接进入Apache官网学习文档。

生成实体类:

package com.shengxi.carblog.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

/**
 * @Author: matthew
 * @ClassName TestUser
 * @Date: 2019-09-17 19:35
 * @Version: 1.0.0
 * @description: 实体类
 * 注意要有无参构造器
 * 其他构造器按需书写
 */
@Table(name ="test_user")
@Entity(name = "TestUser")
@DynamicUpdate
@NoArgsConstructor
@AllArgsConstructor
@Data
@ToString
@EqualsAndHashCode
public class TestUser implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private Integer age;
}

然后我们可以写持久层,继承JpaRepository<O, T> O是对应的实体类的对象, T是主键的数据类型。

package com.shengxi.carblog.repository;

import com.shengxi.carblog.pojo.TestUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

/**
 * @Author: matthew
 * @ClassName TestUserRepository
 * @Date: 2019-09-17 19:35
 * @Version: 1.0.0
 * @description: 测试模板持久层
 */
@Repository
public interface TestUserRepository extends JpaRepository<TestUser, Long> {

    /**
     * 在自定义方法查询中,
     * 我们要使用new一个对象来封装实例
     * 然后用对应的实体类来替代表
     * 所以我们的实体类需要去绑定表
     * 注意:在new的使用,实体类中要有对应的构造器
     * @param name userName
     * @return TestUser
     */
    @Query("select new com.shengxi.carblog.pojo.TestUser(id, name, age) from TestUser where name = :name")
    TestUser findUserByName(@Param("name") String name);
}

猜你喜欢

转载自blog.csdn.net/mathew_leung/article/details/100975378