SpringBoot 配置设置(从SpringBoot到SpringBoot+Mybatis)

SpringBoot 配置设置包含源码

一、新建 SpringBoot 项目。

  1. 可使用 http://start.spring.io/,在 Spring 官方提供的网址上快捷创建项目。
  2. 也可以使用 IDEA http://www.jetbrains.com/idea/,依照项目引导创建。
  3. 在 SpringBootDemoApplication 中编写 类注解 @RestController
	@RequestMapping("/")
	public String hello() {
		return "Welcome SpringBoot 2.2.0 !";
	}
  1. 浏览器输入: http://loccalhost:8080/

二、Banner 设置

(1)在Application的main方法中设置Banner

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(SpringBootDemoApplication.class);
    application.setBannerMode(Mode.OFF);	// 通过 Mode设置Banner的内容 OFF(关闭)、CONSOLE(控制台输出,默认)、LOG(日志方式输出)
    application.run(args);
}

(2) 修改 Banner.txt 配置文件

Spring Boot启动项目的时候就会优先启动这个文件中的内容。
在 src/main/resouces 下新建 banner.txt ,

在 文件中可以加入以下 的内容 :
#  MANIFEST.MF 文件中的版本号
${application.version}
#  这个是上面的版本号前面加上V后上括号
${application.formatted-version}
#  这个是 SpringBoot 的版本号
${spring-boot.version}
#  这个是SpringBoot的版本号,加上 V
${spring-boot.formatted-version}
  • ${application.formatted-version}
    在这里插入图片描述
  • ${spring-boot.formatted-version}
    在这里插入图片描述

(3) 重写接口 Banner 实现

写一个 Banner 接口的实现类,重写 Banner 接口的 printBanner方法

(4) 在 application.properties 中配置

### 进行 banner 的显示和关闭
spring.main.show-banner=false|true
SpringBoort 提供一个枚举类 AnsiColor,这个可以控制 Banner.txt 中的字符颜色(eclipse中不起作用)

application.properties 中配置 :spring.output.ansi.enabled=ALWAYS

在这里插入图片描述

三、配置浏览器显示 ico

<link rel="shortcut icon" href="/images/apple.ico">

四、日志的设置

默认情况下,日志不需要做配置就可以使用。
LogBack 作为日志的实现。默认级别是Info

日志的简单配置

# 日志
logging.level.root=debug
# 日志格式
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
  • DEBUG 启动日志
    在这里插入图片描述
  • INFO 启动日志
    在这里插入图片描述

日志输出文件设置(日志文件达到10MB时,产生新日志文件)

  • 日志输出到当前目录,命名为 my.log
## 日志输出到 my.log 文件中,位于 SpringBoot 应用运行的当前目录。
logging.file=my.log
logging.pattern.file=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
  • 日志输出到指定存放目录
## 日志输出文件到 D:\RebortChao\SpringBootDemo 文件夹下 spring.log 文件中。
logging.path=D:\RebortChao\SpringBootDemo
logging.pattern.file=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %m %n

日志输出文件格式

  • %level,表示输出日志级别
  • %date,表示日志发生的时间,%d{ISO8601} 为标准的日期输出。可选择%d{HH:mm:ss}输出时分秒,适用于控制台查看。
  • %logger ,输出 Logger 的名字,包名+类名,{n} 设置长度。
  • %thread,当前线程名
  • %M ,method ,日志发生时候的方法名。
  • %L ,日志发生所在的代码行,线上运行不建议使用。
  • %m%n ,日志消息 , 日志换行。一般都是连续使用。

五、WebMvcConfigurer

  • extends WebMvcConfigurerAdapter 过时,建议使用接口
  • implements WebMvcConfigurer 建议使用。

WebMvcConfigurer
在这里插入图片描述

1. 增加拦截器 Interceptor 。

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 自定义拦截器
		/*
		 * 原操作拦截器
		 * WebMvcConfigurer.super.addInterceptors(registry);
		 */
		HandlerInterceptor handlerInterceptor = new HandlerInterceptor() {
			@Override
			public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
					throws Exception {
				// Controller 执行之前。
				System.out.println("WebMvcConfig ===》Controller 执行之前");
				return HandlerInterceptor.super.preHandle(request, response, handler);
			}
			@Override
			public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
					ModelAndView modelAndView) throws Exception {
				// Controller 执行之后,渲染之前。
				System.out.println("WebMvcConfig ===》Controller 执行之后,渲染之前。");
				HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
			}
			@Override
			public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
					Exception ex) throws Exception {
				// 渲染之后执行
				System.out.println("WebMvcConfig ===》渲染之后执行");
				HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
			}
		}; 
		registry.addInterceptor(handlerInterceptor).addPathPatterns("/**");
		registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
	}

2. 字符转换器 addFormatters 。

	@Override
	public void addFormatters(FormatterRegistry registry) {
		// 格式化
		/*
		 * WebMvcConfigurer.super.addFormatters(registry);
		 * 建议使用注解的方式 :
		 * @DateTimeFormat(pattern = "yyyy-MM-dd")
		 * private Date createTime;
		 */
		registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
	}

3. 注册 Controller。 addViewControllers 。

  • 举例:对于仅有一个简单跳转页面的功能的 Controller,可以使用这种方式进行配置。
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		/*
		 * WebMvcConfigurer.super.addViewControllers(registry);
		 */
		/*
		 * 对于 index.html 的请求,设置返回的视图为 index.btl 。
		 * 所有 以 .do 结尾的请求重定向到 /index.html 请求。
		 */
		registry.addViewController("/index.html").setViewName("/index.btl");
		registry.addRedirectViewController("/**/*.do", "/index.html");
	}

4. 自定义视图解析器 addViewControllers 。

addStatusController : 设置请求的资源的,返回的 Http 状态。
addRedirectViewController:重定向当前的请求资源。
addViewController:访问 Controller 跳转直接访问视图。

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    super.addViewControllers(registry);
    // 对 "/hello" 的 请求 redirect 到 "/home"
    registry.addRedirectViewController("/hello", "/main");
    // 对 "/admin/**" 的请求 返回 404 的 http 状态
    registry.addStatusController("/admin/**", HttpStatus.NOT_FOUND);
    // 将 "/home" 的 请求响应为返回 "home" 的视图 
    registry.addViewController("/main").setViewName("main");
}

5. 添加静态资源处理器:addResourceHandlers

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    // 通过 "/main.html" 请求, 来访问 /resource/static/main.html 静态资源
 registry.addResourceHandler("/main.html").addResourceLocations("classpath:/static/main.html");
//  访问 images/1.jpg  ,则是访问 static/images/1.jpg 。		registry.addResourceHandler("/images/**").addResourceLocations("classpath:/static/images/");

}

6.匹配路由请求规则:configurePathMatch。

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    super.configurePathMatch(configurer);
    /*
     * 1.ServletMappings 设置的是 "/" 
     * 2.setUseSuffixPatternMatch 默认设置为 true,
     * 那么,"/user" 就会匹配 "/user.*",也就是说,"/user.html" 的请求会被 "/user" 的 Controller所拦截.
     * 3.如果该值为false,则不匹配
     */
    configurer.setUseSuffixPatternMatch(false);
    /*
     * setUseTrailingSlashMatch的默认值为true
     * 是说, "/user" 和 "/user/" 都会匹配到 "/user"的Controller
     */
    configurer.setUseTrailingSlashMatch(true);
}

7.内容裁决解析器 configureContentNegotiation

在这里插入图片描述

六、数据库的访问

以 Sql 为中心,访问灵活,更能适应大型的互联网和企业应用。
以对象的方式访问数据库更适合较为简单的系统或者工具类系统。

配置数据源

1、内置数据源(四种)
四种数据源类型的生效先后顺序如下:Tomcat–> Hikari --> Dbcp --> Dbcp2 。
2、第三方数据源
通过 Environment 类在 Spring Boot 中代表环境上下文,包含了 application.properties 配置属性、JVM系统属性和操作系统环境变量的类。

私人 SpringBoot配置数据源的文档,留言发公开的

### application.properties
spring.datasouece.url=
### pom.xml 中引入数据库连接池 与 数据库驱动
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>

1、Spring JDBC JdbcTemplate

Spring 提供了 JdbcTemplate 对数据库访问技术 JDBC 做了一定的封装,包括管理数据库连接,简单结果查询映射成 Java 对象,复杂的结果集通过实现 RowMapper 接口来映射到 Java 对象。
只要配置好数据源 ,就可以自动使用 JdbcTemplate 。

JdbcTemplate 的使用

1、查询.query
简单查询 、复杂查询(映射结果集)
2、修改 update
提供 update 方法来实现 SQL 的修改语句,包括新增、修改、删除、执行存储过程等。

  • 编写测试方法
    Jdbc测试的使用
  • 使用 Junit4 ,加载 Spring 的上下文。
    测试的结果
JdbcTemplate 的增强

NamedParameterJdbcTemplate 继承了 JdbcTemplate 。
SpringBoot 已经自动配置了 NamedParameterJdbcTemplate ,可以自动注入使用。

  • NamedParameterJdbcTemplate 的优点:
    传统的 JdbcTemplate 只支持 " ?"占位符。NamedParameterJdbcTemplate 允许 SQL 中使用参数的名字作为占位符。使用 ":"开头的参数名称。

上述的测试用例我们可以更改为 :
在这里插入图片描述
可以查询到上述同样的内容,这里不贴图证明了。

SpringBoot 集成 Mybatis 。

SpringBoot + Mybatis 框架,就是 SSM 框架,也就是说开发SpringBoot集成可以按照SSM的过程执行。

  • 在 pom.xml 文件中加入依赖。
    Mybatis 的测试依赖
  • 一般的情况下,我们使用的是逆向工程的方式生成 实体类、mapper.xml 与 mapper.java。所以还要进行如下的配置:
===
* 在 src/main/resources 下创建 generator 文件夹,下面创建generatorConfig.xml文件。
<build>
	<plugins>
		<!-- mybatis generator 自动生成代码插件 -->
		<plugin>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-maven-plugin</artifactId>
			<version>1.3.2</version>
			<configuration>
				<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
				<overwrite>true</overwrite>
				<verbose>true</verbose>
			</configuration>
		</plugin>
	</plugins>
</build>
  • 配置pom.xml中 逆向工程的 generator 插件所对应的配置文件 ${basedir}/src/main/resources/generator/generatorConfig.xml(上述位置已经给出)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
    <classPathEntry  location="数据库驱动包所载的绝对路径"/>
    <context id="DB2Tables"  targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/wechat" userId="root" password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- 生成模型的包名和位置-->
        <javaModelGenerator targetPackage="cn.chao.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置,mapper.xml -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置,mapper.java-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.chao.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
        <table tableName="test" domainObjectName="User" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true"></table>
    </context>
</generatorConfiguration>
  • 编写 application.propoerties
### mybatis 的配置内容 。
 #注意:一定要对应mapper映射xml文件的所在路径
mybatis.mapper-locations=classpath:mapping/*.xml 
 # 注意:对应实体类的路径
mybatis.type-aliases-package=cn.chao.model 
#pagehelper分页插件
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
  • 编写 Generator 主类,执行后生成model、mapper.xml 以及 mapper.java 。
    执行

2、SpringBoot 集成 Mybatis 的通用 Mapper 。

通用mapper是一个国人编写的工具jar,它可以极其方便的做单表增删改查(使用Mybatis框架),目前不支持通用的多表联合查询,在使用mybatis时,就不需要重复的维护功能类似单表操作mapper.xml文件和mapper接口的定义。

  • 引入依赖。
    在这里插入图片描述
  • 配置 Mapper
    在这里插入图片描述
  • 使用 Mapper
    在这里插入图片描述
  • 编写 model 实体类。
@Data			//  所有  getter  &&  setter 以及 toString() 还有 继承 Object 类,之后的equals()、hashCode() 等方法。
@NoArgsConstructor		// 无参构造器
@AllArgsConstructor		// 所有属性做参数的有参构造器
@Builder		//  声明实体,表示可以进行 Builder 方式初始化,对外保持 private setter,而对属性的赋值采用Builder的方式。
				//  @Value注解,表示只公开getter,对所有属性的setter都封闭,即private修饰,所以它不能和@Builder现起用
public class User implements Serializable {
    /*
     * 用户ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select uuid()")
    @Length(min=1, max=64)
    private String id;
    /*
     * 昵称
     */
    @NotBlank		//  不能为空 。
    @Length(min=1, max=64)
    private String nickname;
    /*
     * 用户类型
     */
    @NotBlank		// 不能为空,且设置枚举类型。
    @EnumValue(enumClass=UserTypeEnum.class,enumMethod="isValidName")
    private String UserType;
    /*
     * 用户类型枚举
     */
    public enum UserTypeEnum {
        /* 普通 */
        NORMAL,
        /* 管理员 */
        ADMIN;
 
        public static boolean isValidName(String name) {
            for (UserTypeEnum userTypeEnum : UserTypeEnum.values()) {
                if (userTypeEnum.name().equals(name)) {
                    return true;
                }
            }
            return false;
        }
    }
}
  • 上述实体类中的 枚举 类型 的使用值得我们借鉴。在完成上述操作之后进行,controller 方法的测试。测试查询和增加。
{
	"id":"1",
	"nickname":"robertChao",
	"gender":"ADMIN",
}

3、Spring Boot 集成 BeetlSQL

BeetlSQL 功能齐全的 DAO 工具,集中了 JPA 多种功能的优点,也吸取了 MyBatis 这样的 SQL 集中管理的优点。同时具有 Hibernate 和 MyBatis 的优点,适用于承认以 SQL 为中心,同时有需要工具能自动生成大量常用的 SQL 的应用。

  • 无须注解,自动使用大量的内置SQL,轻易完成增删改查 功能,节省约 50% 的开发工作量。
  • 数据模型支持 POJO ,也支持 Map/List 这种快速模型,还支持混合模型。
  • 灵活直观的支持一对一、一对多、多对多关系映射而不引入复杂的 ORMapper概念和技术。
  1. 添加 Maven 依赖。
## BeetlSQL 提供 starter 来快速集成 SpringBoot ,在 pom.xml 需要添加如下依赖:
<dependency>
	<groupId>com.ibeetl</groupId>
	<artifatId>beetl-framework-starter</artifactId>
	<version>1.1.15.RELEASE</version>
</dependency>
## beetl-framework-starter 会自动集成 Spring Boot 已经配置好的数据源。
  1. 配置 BeetlSQL 。

beetl-beetlsql.dev 与 beetlsql.basePackage 同时使用。
beetlsql.nameConversion 与 beetlsql.dbStyle 同时使用。

  • beetlsql.sqlPath,默认为 /sql ,作为存放 SQL 文件的根目录,位于 /resources/sql 目录下。
  • beetlsql.nameConversion,默认是 org.beetl.sql.core.UnderlineNameConversion(驼峰映射),还有常用的 DefaultNameConversion,数据库命名完全和 Java 命名一致,以及 JPA2NameConversion,兼容 JPA 命名。
  • beetlsql.dbStyle,数据库风格,默认的是 org.beet.sql.core.db.MyStyle。
  • beetl-beetlsql.dev,默认是 true ,即向控制台输出执行时的 SQL,包括参数、执行时间及执行的位置,每次修改 SQL 文件时,自动检测 SQL 文件修改。
  • beetlsql.dao.Suffix ,默认的是 Dao。任何接口继承了 BaseMapper 接口,将自动具备实体内置的 CRUD 功能。daoSuffix 选项会在 Spring Boot 启动的时候,自动扫描以 Dao 接口结尾的接口,自动注册为 Spring 管理的 Dao 类,便可以在任何地方自动注入这个 Dao 类。
  • beetlsql.basePackage,默认为 com 。此配置 beetlsql.dao.Suffix 来自扫描 com 包及子包的所有以 Dao 结尾 的 Mapper 类。
  1. Spring 管理的 Bean 中注入 SqlMapper 来完成数据库访问操作,在Service 中使用 SqlMapper 。
### SqlMapper 是 BettlSQL 的核心类,提供了所有数据库访问的操作。
@Service
public UserServiceImpl implements UserService{
	@Autowire
	SqlMapper sqlMapper;
}
###  查询: unique 和  single 根据主键查询内容,如果未查找到,仅仅返回 null 。
###  插入:如果想获取到自增主键,可以传入 true 参数。
###  更新:updateById(user) 根据 id 更新全部 和 updateTemplateById(user); 根据 id 部分更新。
使用 SQL 文件。
  1. SSM项目开发中sql 文件是存放在 mapper.xml 文件中的,在 SpringBoot+Mybatis 项目中, SQL 文件放在单独文件中更容易编写和维护,需要在 /resources/sql 目录下创建 user.md文件(也就是前文提到的 beetlsql.sqlPath 默认的存放 sql 文件的目录在 resource/sql 中)。
文件名约定为类名,首字母小写。
selectUserByName		// 唯一标识 sqlld
===				//  上面是 sql 语句的唯一标识,下面是多行注释,必须是"*"开头。
* 一个简单的查询的例子
* 根据用户名查询用户
select * from user where 1=1		// @ 与 回车 是定界符号,里边写  Beetl 语句。
@if(!isEmpty(name)){				//  isEmpty  是 Beetl 的 一个函数,用来判断变量是否为空或者是否不存在
	and name = #name#				//  #  是占位符,生成 SQL 语句后,占位符将输出 "?"。
@}
  1. 如果上述的 SQL 文件的名称为 user.md文件,使用 sqlManager 的调用方式是
### 参数 分别是 :1、使用哪个文件名下的sql(类似于mapper.xml 的工作空间)
	2、User.class 表示查询结果集映射到User类。
	3、查询的参数。根据名称查询,参数是名称。
sqlMapper.select("user.selectUserByName",User.class,query);
### sqlManager 会查询 beetlsql.sqlPath 设置路径下的 `user.md 或者 .sql 文件`
### 找到 selectUserByName 对应的 SQL 模板语句,
Mapper 功能

Mapper 功能是 将 md 文件的 sqlld 映射为方法名。
创建一个接口,继承 BaseMapper 接口,并添加 md 文件中的 sqlld 作为方法名,查询的结果集做返回值,查询的条件做查询参数。
1、类似于 通用Mapper 继承 Mapper 一样,区别在于 sql 文件是我们自己编写的。
2、类似于SSM中 mapper.java 接口是 Mapper 功能接口,SSM中mapper.xml 是 mapper.md

  1. BaseMapper 是 Beetl 提供的一个内置 Dao 接口,内置了多种增删改查方法。
SqlMapper 内置 CRUD

SQLManager 内置 API 是指不需要自己编写 SQL 文件就能完成对象的增删改查。

  1. sqlManager 内置 插入 insert 、内置更新 update 、内置查询 all / template / unique / single 。
  2. 代码生成方法。

根据已经创建好的数据表,BeetlSQL 能够自动生成表对应的实体、Dao操作和 md 文件。

sqlManager.genPojoCodeToConsole(String table);
# 根据表名生成 POJO 类,输出到控制台。
sqlManager.genSQLTemplateToConsole(String table)
# 生成查询条件、更新SQL等语句,输出到控制台。
sqlManager.genPojoCode(String table,String pkg,GenConfig config);
# 生成 pojo 代码到项目工程中,pkg 包名,GenConfig 细节内容。
## GenConfig 设置:
## baseClass,设置POJO的基类,默认是Object 。
## spaceCount ,格式控制,默认是 4个空格。
## preferBigDecimal ,默认为 true ,对于浮点类型,对应的 Java 类型使用 BigDeciamal 。
## preferDate,默认使用 util.Date,否则使用 TimeStamp 。
sqlManager.genSQLFile(String table);
# 生成指定表对应的 md 文件。
sqlManager.genAll(String pkg,GenConfig config,GenFilter filter);
# 生成所有的 POJO 代码和 SQL 模板,GenFilter 用来过滤
-------------------------
SQLManager.genAll("cn.chao.entity",new GenConfig(),new GenFilter(){
	public boolean accept(String tableName){
		if(tableName.equalsIgnoreCase("user")){
			return true;
		}else{
			return false;
		}
	}
});
-------------------------
  • 使用代码生成方法。
    BeetlSQL执行
    在这里插入图片描述
    在这里插入图片描述
  • 通过 GenConfig 进行喜好设置。下面两个方法生成 test 表对应的 POJO 和 md 文件。
  • 书上说可以生成 Dao 文件,BeetlSQL 文档中便没有说可以生成 Dao文件。
  • BeetlSQL 2.10中文文档
    在这里插入图片描述

Spring Data JPA

MyBatis 、Template 、BeetlSQL 都是以SQL 为中心的。
通用 mapper 与 JPA 则是以 Java Entity 为中心的,将实体和实体关系对应到数据库的表和表关系,属于 ORM (Object Relational Mapping) 工具。

集成 Spring Data JPA ,配置数据源
### pom.xml
<dependency>
	<group>org.spring.framework.boot</group>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

### application.properties
spring.jpa.hibernate.ddl-auto,是否自动建库,默认为 none ,Hibernate 能根据 Entity 类的定义自动生成表和表主外键设置等。对于内存数据,H2,SpringBoot 默认为 create-drop。
spring.jpa.show-sql,是否自动打印 SQL ,默认为 false ,我们设置为 true ,也就是 JPA 操作自动显示对应的数据库 SQL 语句。

### Entity 数据实体。
JPA 要求实体必须有一个空的构造函数。
### Mapper 接口
Repository 是 Spring Data 的核心概念,抽象了对数据库和 NOSQL 的操作。
1、CrudRepository :提供了基本的增删改查,批量操作接口。
2、PagingAndSortingRepository :集成 CrudRepository ,提供了附加的分页查询功能。
3、JpaRepository :专门用于 JPA,提供了丰富的数据库访问接口,比如根据 Example来查询。
  • 上述接口之间的继承关系
    继承关系
  • 实现接口
### 创建一个 UserRepository 继承 Dao 层接口。
public interface UserRepository extends JpaRepository<User,Integer>{}
### 业务处理层直接调用。
@Service
@Transactional
public class UserServiceImpl implements UserService{
	@Autowired
	UserRepository userDao;  
}
  • Sort 、Pageable、Page 以及基于方法名称查询。
  • 1、Sort 对象用来指示排序,最简单的 Sort 对象构造可以传入一个属性名列表,默认采用升序排序。
Sort sort = new Sort("id");     //  这里传入的不是数据库列名,是属性名。
return userDao.findAll(sort);

其他的 Sort 构造方法,还包含
1、public Sort(String ……properties),按照指定的属性列表升序排序。
2、public Sort(Direction direction,String ……properties),
	按照指定属性列表排序,排序由Direction 指定。
3、public Sort(Order ……orders),Order 可以通过 Order 静态方法来创建。
## 3.1、public static Order asc(String propertyName);
## 3.2、public static Order desc(String propertyName);
  • **2、Pageable 接口用于构造翻页查询,PageRequest 是其实现类,可以通过提供的工厂方法创建 PageRequest 。 **
public static PageRequest of(int page,int size)
public static PageRequest of(int page,int size,Sort sort)
public static PageRequest of(int page,int size,Direction direction,String ……properties)

### Page 总是从 0 开始,表示查询页,size 指每页的期望行数。
* int getTotalPages(),总的页数。
* long getTotalElements(),返回总数。
* List getContent(),返回此次查询的结果集。

范例:
public List<User> getAllUser(int page,int size){
	PageRequest pageable = PageRequest.of(page,size);   //  设置分页条件
	Page<User> pageObject = userDao.findAll(pageable);	//   根据分页条件查询内容
	int totalPage = pageObject.getTotalPages();			// 获取总页数
	long count = pageObject.getTotalElements();			// 得到总数
	return pageObject.getContent();		// 返回此次的结果集
}
  • 3、基于方法名字的查询。
  • Spring Data 通过查询的方法名和参数名来自动构造一个 JPA OQL 查询。举例:
#####
public interface UserRepository extends JpaRepository<User,Integer>{
	public User findByName(String name);
}

######
* 方法名通常包括多个实体属性用于查询,属性之间用于 And 和 Or 链接,同样支持 Between、LessThan、GreaterThan、Like;
* 方法名可以是:findBy 、getBy、queryBy开头。
* 查询结果可以排序,方法名包含 OrderBy+属性+ASC(DESC)
* 可以通过 Top 、First 来限定查询结果集。
* 一些特定的参数可以出现在参数列表里,比如:Pageable、Sort。
  • 更过关键字查询方式,可参考通用Mapper。也可以分为以下两种方便记忆。
  1. find/get/query+全局修饰+By+实体的属性名称+限定词+连接词+ …(其它实体属性)+OrderBy+排序属性+排序方向。
要求关键字
全局修饰Distinct、Top、First
实体的属性名称实体类中定义的属性名称(User表中的name 属性)
限定词(1)IsNull、 IsNotNull、 Like、 NotLike、 Containing、 In、 NotIn、
限定词(2)IgnoreCase、 Between、 Equals、LessThan、GreaterThan、 After、 Before
连接词And 、Or
其它实体属性关联到其他实体类中的字段
排序属性实体类中能够明显排序的字段。例如:时间、生日、年龄等
排序方向Asc、 Desc
  1. 继承关系中的嵌套实体:find/get/query+全局修饰+By+主实体中子实体的名称+ _ +子实体的属性名称。
  • 4、@Query 查询,允许方法上使用的 JPQL。

@Query 使用 nativeQuery=true ,则使用的是 SQL语句。
1、无论是那种语句,都支持 "命名参数"的使用 (name=:name)
2、@Query 允许 SQL 更新、删除语句,必须搭配 @Modifying 使用。

#### 范例 一 :
@Query(value="select u from User u where u.department.id=?1 ")
public Page<User> queryUsers(Integer departmentId,Pageable page);

#### 范例二:
@Modifying
@Query("update User u set u.name=?1 where u.id=?2")
int updateName("String name,Integer id");
  • 5、JPA Qquery

通常情况下,JPQL 语句是运行时决定的,比如查询,需要根据输入条件来组成不同的 JPQL 语句,必须使用底层的 EntityManager 来完成查询。EntityManager 是 JPA 提供的数据库访问接口,类似 BeelSQL 的SQLManager 。

@Service
@Transactional
public class UserServiceImpl implements UserService{
	@Autowired
	EntityManager em;
}
### EntityManager 提供了 createQuery(String jpqlString)来创建 Query 对象。
Query query= em.createQuery("select count(1) "+baseJpql.toString());
setQueryParameter(query,paras);			// 设置参数
Number number = (Number)query.getSingleResult();		//  获取查询结果总数
// 不知道返回的数据类型(Mysql 实际上 BigInteger )。对于 SpringBoot 应用来说,Long 精度已足够。
return  number.longValue();		
query.setFirstResult(page.getOffset());		// 查询的起始位置
query.setMaxResults(page.getPageNumber());	// 设置此次查询期望返回的总数
List list= query.getResultList();			//  查询的结果

EntityManager 也支持直接使用 Native SQL 。可以调用 em.createNaticeQuery(sqlString)。

  • Example 的查询
  1. Example 对象则是一种折中方案,允许根据实体创建一个 Example 对象,Spring Data 通过 Example 对象来 构造 JPQL。
Example<User> example = Example.of(user);
List<User> list = userDao.findAll(example);
  1. ExampleMatcher 提供了更多的条件指定。
ExampleMathcher matcher = ExampleMatcher.matching()     // 构建对象
		.withMatcher("name",GenericPropertyMatchers.startersWith().ignoreCase());  // name 开头的所有用户
		.withStringMatcher(StringMatcher.CONTAINING) // 改变默认字符串匹配方式:模糊查询
        .withIgnoreCase(true) // 改变默认大小写忽略方式:忽略大小写
        .withIgnorePaths("focus");  //忽略属性:是否关注。因为是基本类型,需要忽略掉
Example<User> example = Example.of(user,matcher);
  • ExampleMatcher.matching() ,设置。
    (1)改变Null值处理方式。
    定义:
    public ExampleMatcher withNullHandler(NullHandler nullHandler)
    public ExampleMatcher withIncludeNullValues()
    public ExampleMatcher withIgnoreNullValues()
    产生效果:
    改变配置项nullHandler,分别设为:指定值、INCLUDE(包括)、IGNORE(忽略)。
    (2)改变默认字符串匹配方式。
    定义:
    public ExampleMatcher withStringMatcher(StringMatcher defaultStringMatcher)
    产生效果:
    改变配置项defaultStringMatcher,设为指定值。
    (3)改变默认大小写忽略方式。
    定义:
    public ExampleMatcher withIgnoreCase()
    public ExampleMatcher withIgnoreCase(boolean defaultIgnoreCase)
    产生效果:
    改变配置项defaultIgnoreCase,分别设为:true,指定值。
    (4)向“忽略属性列表”中添加属性。
    定义:
    public ExampleMatcher withIgnorePaths(String… ignoredPaths)

产生效果:
改变配置项ignoredPaths,向列表中添加一个或多个属性。

  • GenericPropertyMatchers在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值