springboot
小记
@ConfigurationProperties(prefix = "person")
可以通过yaml文件给实体类赋值,person是yaml文件中的类名-
@PropertySource(value="xiaosheng.properties")
这样不能像yaml一样直接给实体类赋值,得在实体类的每一个属性上都写@Value(${name})
-
在类上写上
@Validate
可以进行数据校验,类的属性上可以再写上@Email()等
-
@Param
报红,导入org.apache.ibatis.annotations.Param
-
mybatis mybatis plus
不要重复导入
想要让sql
可见的话可以在yaml
配置mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
在build中配置resources
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
谈谈重定向和转发的区别
相同点:
页面都会实现跳转
不同点:
– 请求转发的时候,url不会产生变化 ,http状态码:307
- 重定向的时候url地址栏会发生变化, http状态码:302
// 重定向:需要加路径
resp.sendRedirect("/test04/Success.jsp");
// 转发不需要加路径
req.getRequestDispatcher("/Success.jsp").forward(req, resp);
jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Success</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
学到的小知识点
在分析源码的时候,遇到异常处理的代码,通常不用去看他,在遇到异常的时候再去看他
jsp
C:\Users\xiaosheng\.IntelliJIdea2019.3\system\tomcat\Unnamed_com_xsx\work\Catalina\localhost\test05\org\apache\jsp
final javax.servlet.jsp.PageContext pageContext; // 页面上下文
javax.servlet.http.HttpSession session = null; // session
final javax.servlet.ServletContext application; // application
final javax.servlet.ServletConfig config; // config
javax.servlet.jsp.JspWriter out = null; // out
final java.lang.Object page = this; // page
HttpServletRequest request // request
HttpServletResponse response // response
err
err解决
<?xml version="1.0" encoding="UTF8" ?>
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-resources-plugin -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version>
</dependency>
小知识点
mybatis
中事务管理器有两种类型,JDBC
和MANAGED
,默认事务管理器是JDBC
mybatis-config 中properties
优先使用外部配置文件
类型别名
类型别名是为java类型设置一个短的名字
存在的意义仅在于用来减少类完全限定名的冗余
<typeAliases>
<!-- 可以给实体类起别名-->
<typeAlias type="xiaosheng.pojo.User" alias="User"></typeAlias>
</typeAliases>
也可以指定一个包名,Mybatis会在包名下搜索需要的JavaBean, 比如扫描实体类的包,他的默认包名就为这个类的类名,首字母小写,首字母也可以大写,不过不推荐,小写的话他就知道扫描包
<typeAliases>
<package name="xiaosheng.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式
如果实体类十分多,推荐使用第二种方式
第一种可以自定义别名,第二种不行,如果非要改,可以在实体类上面添加注解@Alias("user")
设置
mybatis-config
<settings>
<!-- 是否自动开启数据库下划线转java中驼峰命名的方式-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 日志实现-->
<setting name="logImpl" value="LOG4J"/>
<!-- 开启缓存-->
<setting name="cachedEnabled" value="true"/>
<!-- 延迟加载的全局开关-->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<mappers>
<!-- 推荐使用resource 指定路径的方式-->
<mapper resource="xiaosheng/dao/UserMapper.xml"></mapper>
<!-- 使用class文件绑定注册-->
<!--用此方式,接口和他的Mapper配置文件必须同名,且必须在同一包下-->
<!-- <mapper class="xiaosheng.dao.UserMapper"></mapper>-->
<!-- 使用扫描包进行注入-->
<!--用此方式,接口和他的Mapper配置文件必须同名,且必须在同一包下-->
<!-- <package name="com.xiaosheng.dao"/>-->
</mappers>
结果集映射
场景:数据库中字段名和实体类中名称不一样
数据库字段:
id, name, pwd
实体类字段:
id, name, password
UserMapper.xml
<!-- 因为在dao层,可以直接找到这个类-->
column代表数据库中字段,property代表实体类中属性
<resultMap id="UserMap" type="User">
<result column="id" property="id"></result>
<result column="name" property="name"></result>
<result column="pwd" property="password"></result>
</resultMap>
<!-- 根据id获取用户-->
<select id="getUserById" resultMap="UserMap" parameterType="com.xiaosheng.pojo.User">
select * from mybatis.user where id =#{id}
</select>
Log工厂
使用
- 先导包
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 配置文件
其中log4j.appender.file = org.apache.log4j.RollingFileAppender
要这样写,不然会报错WARN No such property [maxFileSize] in org.apache.log4j.FileAppender.
### 配置根 ###
log4j.rootLogger = debug,console,file
### 配置输出到控制台 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%-5p] %d(%r) --> [%t] %l: %m %x %n
### 配置输出到文件 ###
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = logs/log.log
log4j.appender.file.MaxFileSize = 10mb
log4j.appender.file.Append = true
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 配置输出到文件,并且每天都创建一个文件 ###
#log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
#log4j.appender.dailyRollingFile.File = logs/log.log
#log4j.appender.dailyRollingFile.Append = true
#log4j.appender.dailyRollingFile.Threshold = DEBUG
#log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
#log4j.appender.dailyRollingFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n### 配置输出到文件,且大小到达指定尺寸的时候产生一个新的文件 ###log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
### 日志输出级别 ###
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.org.apache=DEBUG
log4j.logger.java.sql.Connection=DEBUG
mybatis-config.xml
中设置setting
<settings>
<!-- 日志实现-->
<setting name="logImpl" value="LOG4J"/>
</settings>
useage
:
UserMapperTest
为要输出日志类的类名
> import org.apache.log4j.Logger;
> Logger logger = Logger.getLogger(UserMapperTest.class);
mybatis
注解
接口中方法存在多个参数,所有参数前面必须加上@Param
参数,
User getUserById(@Param(“id”) int id)
sql语句中的 select * from mybatis.user where id=#{id}{id}这个id必须和Param中一致
关于@Param()
- 基本类型得到参数或者String类型,需要加上
-
引用类型不需要加
-
如果只有一个基本类型的话,可以忽略,不过最好都加上
#{}
和${}区别
#{}
能够防止sql注入,类似于jdbc
的prepareStatement
,${}
不能,
偷懒神器:lombok
注解
@Data
自动添加get set
@AllArgsConstructor
有参构造
@NoArgsConstructor
无参构造
使用时记得导入,记得在idea中添加插件
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
一对多
缓存
- 一级缓存
一级缓存默认是开启的, 只在一次sqlSession中有效,也就是拿到链接到关闭连接这个区间段有效,
一级缓存是一个map集合
- 二级缓存
由于他的缓存作用域太小了,所以诞生了二级缓存,二级缓存就是全局缓存,基于nameSpace级别的缓存,一个名称空间对应一个二级缓存
开启步骤:
– 1.开启全局缓存,是默认开启的,只不过为了让别人阅读方便显示的开启一下
<!--在mybatis-config.xml中的settings标签中添加如下代码-->
<!-- 显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
- 2.在要使用的二级缓存的Mapper中开启
<!--在当前mapper中使用二级缓存-->
<cache/>
<!--也可以自定义一些参数-->
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"></cache>
memoryStoreEvictionPolicy: LRU(最近最少使用) FIFO(先进先出) LFU(最少访问次数)
- 3.遇到的小问题
需要将实体类序列化,否则就会报错
org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.xiaosheng.pojo.User
缓存查询顺序
-
首先先看二级缓存中有没有
-
再看一级缓存中有没有
-
如果还没有,再查询数据库
新建项目碎碎念
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>