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中事务管理器有两种类型,JDBCMANAGED,默认事务管理器是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注入,类似于jdbcprepareStatement${}不能,

偷懒神器: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>
分类: java

浙公网安备33011302000604

辽ICP备20003309号