日志
如果一个数据库操作出现了异常,我们需要排错,日志就是最好的助手。
曾经:sout,debug
现在:日志工厂
mybatis日志配置
在mybatis中具体使用哪个日志实现,在设置中设定!
STDOUT_LOGGING标准日志输出
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
LOG4J | LOG4J2
- log4j是Aoache的一个开源项目,通过使用,我们可以控制日志信息输送到目的地是控制台、文件、GUI组件;
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致的控制日志的生成过程
- 通过一个配置文件来灵活的进行配置,而不需要修改代码
- Apache Log4j2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。
- Apache Log4j2 版本 2.0-beta7 到 2.17.0(不包括安全修复版本 2.3.2 和 2.12.4)容易受到远程代码执行 (RCE) 攻击,在这种攻击中,有权修改日志配置文件的攻击者可以构建恶意配置将 JDBC Appender 与引用 JNDI URI 的数据源一起使用,该 JNDI URI 可以执行远程代码。此问题已通过将 JNDI 数据源名称限制为 Log4j2 版本 2.17.1、2.12.4 和 2.3.2 中的 java 协议来解决
mybatis配置log4j
1.先导入log4j包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=【%c】-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/shi.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=【%p】【%d{yy-MM-dd}】【%c】%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
3.配置log4j为日志的实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
使用
1.在要使用log4j的类中,导入包import org.apache.log4j.Logger;
2.日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(UserDaoTest.class);
3.日志级别
logger.info("info:");
logger.debug("debug");
logger.error("error");
分页
为什么要分页:
- 减少数据的处理量
使用limit分页
语法:SELECT * from user limit startIndex,pageSize
例如: SELECT * from user limit 3; #【1,3】
RowBounds
mybatis 自带的 RowBounds。Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,属于逻辑分页,即拿出所有符合要求的数据,然后再从这些数据中拿到我们需要的分页数据。而非物理分页,直接从数据库中拿出我们需要的数据。
1.接口
List<User> getUserByRowBounds();
2.mapper.xml
<select id="getUserByRowBounds" resultMap="UserMap">
select * from user
</select>
3.测试
@Test
public void getUserByRowBounds(){
SqlSession sqlSession = Mybatisutils.getSqlSession();
//RowBounds实现
RowBounds rowbounds = new RowBounds(1, 2);
//通过Java代码层面实现分页
List<User> userList =
SqlSession.selectList("com.sqs.UserMapper.getUserByRowBounds", null, rowBounds);
for(User user: usreList){
system.out.println(user);
}
sqlSession.close();
}
PageHelper
1.在pom.xml引入PageHelper的依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
2.在mybatis的全局配置文件中配置PageHelper分页插件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 分页插件配置-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
</configuration>
3.测试
public void testQueryUserListLikeName() {
//设置分页条件,Parameters:pageNum 页码pageSize 每页显示数量count 是否进行count查询
PageHelper.startPage(1, 3, true);
List<User> users = this.userMapper.queryUserListLikeName(null);
//可以使用PageInfo 查看分页信息
PageInfo<User> pageInfo = new PageInfo<User>(users);
//打印分页信息
System.out.println("数据总数:" + pageInfo.getTotal());
System.out.println("数据总页数:" + pageInfo.getPages());
System.out.println("最后一页:" + pageInfo.getLastPage());
for (User user : users) {
System.out.println(user);
}
}
注解
注解提供了一种简单且低成本的方式来实现简单的映射语句。
实现
1.注解在接口上实现
public interface TeacherMapper {
@Select("select * from teacher where id=#{id}")
Teacher getTeacher(@Param("id") int id);
}
2.需要在核心配置文件中绑定接口
<!-- 绑定接口-->
<mappers>
<mapper class="dao.TeacherMapper"/>
</mappers>
本质
反射机制实现
底层:动态代理
LomBok
lombok可以通过简单的注解的形式来帮助我们简化和消除一些必须有但显得很臃肿的Java代码,比如常见的Getter&Setter、toString()、构造函数等等。lombok不仅方便编写,同时也让我们的代码更简洁。
lombok提供了一个功能完整的jar包,可以很方便的与我们的项目进行集成。
使用步骤
1.在IDEA中安装Lombok插件
2.在项目中导入lombok的jar包
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
3.在实体类上加注解即可
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private int id;
private String name;
}
- @Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
- @NoArgsConstructor:生成无参构造器;
- @AllArgsConstructor:生成全参构造器
优缺点
优点:
- 1.能够通过注解的形式自动生成构造器、get/set方法、equals、hashcode、toString等方法,提高了一定的开发效率
- 2.让代码变得简洁,不用过多的关注相应的方法
- 3.属性做修改时,也简化了维护这些属性所生成的get/set方法等
缺点: - 1.不支持多种参数构造器的重载
- 2.虽然省去了手动创建get/set方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读代码的舒适度