SpringBoot 配置设置包含源码
文章目录
一、新建 SpringBoot 项目。
- 可使用
http://start.spring.io/
,在 Spring 官方提供的网址上快捷创建项目。 - 也可以使用 IDEA
http://www.jetbrains.com/idea/
,依照项目引导创建。 - 在 SpringBootDemoApplication 中编写 类注解 @RestController
@RequestMapping("/")
public String hello() {
return "Welcome SpringBoot 2.2.0 !";
}
- 浏览器输入: http://loccalhost:8080/
二、Banner 设置
可以在resource目录下面放入一个 banner.txt 文件,Spring Boot启动项目的时候就会优先启动这个文件中的内容。
- 推荐两个字符画生成网站
http://www.network-science.de/ascii/
http://patorjk.com/software/taag/
(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 建议使用。
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系统属性和操作系统环境变量的类。
### 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 的修改语句,包括新增、修改、删除、执行存储过程等。
- 编写测试方法
- 使用 Junit4 ,加载 Spring 的上下文。
JdbcTemplate 的增强
NamedParameterJdbcTemplate 继承了 JdbcTemplate 。
SpringBoot 已经自动配置了 NamedParameterJdbcTemplate ,可以自动注入使用。
- NamedParameterJdbcTemplate 的优点:
传统的 JdbcTemplate 只支持 " ?"占位符。NamedParameterJdbcTemplate 允许 SQL 中使用参数的名字作为占位符。使用 ":"开头的参数名称。
上述的测试用例我们可以更改为 :
可以查询到上述同样的内容,这里不贴图证明了。
SpringBoot 集成 Mybatis 。
SpringBoot + Mybatis 框架,就是 SSM 框架,也就是说开发SpringBoot集成可以按照SSM的过程执行。
- 在 pom.xml 文件中加入依赖。
- 一般的情况下,我们使用的是逆向工程的方式生成 实体类、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概念和技术。
- 添加 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 已经配置好的数据源。
- 配置 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 类。
- 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 文件。
- 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 语句后,占位符将输出 "?"。
@}
- 如果上述的 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
- BaseMapper 是 Beetl 提供的一个内置 Dao 接口,内置了多种增删改查方法。
SqlMapper 内置 CRUD
SQLManager 内置 API 是指不需要自己编写 SQL 文件就能完成对象的增删改查。
- sqlManager 内置 插入 insert 、内置更新 update 、内置查询 all / template / unique / single 。
- 代码生成方法。
根据已经创建好的数据表,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;
}
}
});
-------------------------
- 使用代码生成方法。
- 通过 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。也可以分为以下两种方便记忆。
- 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 |
- 继承关系中的嵌套实体: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 的查询
- Example 对象则是一种折中方案,允许根据实体创建一个 Example 对象,Spring Data 通过 Example 对象来 构造 JPQL。
Example<User> example = Example.of(user);
List<User> list = userDao.findAll(example);
- 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