网站首页 > 技术文章 正文
1.0日志
为什么需要写日志
如果一个数据库操作出现了异常,需要排错,那么日志就是最好的助手
Mybatis通过使用内置的日志工厂提供日志功能,有一下几种实现方式:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j(官方推荐)
- JDK Logging
Mybatis会按照上面的顺序使用第一个查找到的实现
有不少的应用服务器的类路径下已经包含了Commons Logging,这种情况下,Mybatis会将优先级高的Commons Logging作为日志实现,其他的日志配置将会被忽略。如果想使用其他日志实现,需要在Mmybatis-config.xml中添加以下配置
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
在所有的日志实现中,我们需要掌握LOG4J和STDOUT_LOGGING(标准日志输出)
<settings>
<!--标准的日志工厂的实现-->
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
1|1Log4J
可以控制日志信息输送的目的地是控制台、文件、GUI组件
也可以控制每一条日志的输出格式,自定义日志输出
通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程
通过一个配置文件来灵活地进行配置,不需要修改应用的代码
使用方式:
- 导入Log4J包
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 在mybatis-config.xml中配置log4j日志的实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
- 添加接口代码
package org.luoqing.dao;
public interface TeacherMapper {
@Select("SELECT * FROM teacher WHERE id = #{id}")
Blog selectTeacher(int id);
}
- 在resource目录中添加log4j.properties
### 将等级为DEBUG的日志信息输出到console和file两个目的地 ###
log4j.rootLogger = DEBUG,console,file
### 打印Mapper的日志(以下配置对于注解和XML配置文件都可) ###
log4j.logger.org.luoqing.dao.TeacherMapper=TRACE
### 或者也可以打印包中所有的Mapper的日志
log4j.logger.org.luoqing.dao=TRACE
### 甚至可以打印Mapper中特定语句的日志
log4j.logger.org.luoqing.dao.TeacherMapper.selectTeacher=TRACE
### 输出到控制台 ###
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/log.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
- 测试
测试代码此处省略
自定义输出语句
- 只要使用log4j的类中导入包
import org.apache.log4j.Logger;
- 日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(UserMapperTest.class);
- 日志级别
@Test
public void logTest() {
logger.info("info:进入了logTest");
logger.debug("debug:进入了logTest");
logger.error("error:进入了logTest");
}
2|0分页
为什么要分页
为了减少数据的处理量
2|1使用limit分页
语法:select * from tableName limit startIndex, pageSize
select * from user limit 0,3 # 从第0条记录开始,每页显示3个
使用Mybatis实现
- 接口
public interface UserMapper {
// 分页实现
List<User> getUserByLimit(Map<String, Integer> map);
}
- Mapper.xml
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from learn.user limit #{startIndex}, #{pageSize}
</select>
- 测试
@Test
public void limitTest() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("startIndex", 0);
map.put("pageSize", 2);
List<User> userByLimit = mapper.getUserByLimit(map);
for (User user : userByLimit) {
System.out.println(user);
}
sqlSession.close();
}
2|2使用RowBounds分页
不再使用SQL实现分页
- 接口
public interface UserMapper {
// RowBounds分页
List<User> getUserByRowBounds();
}
- Mapper.xml
<select id="getUserByRowBounds" resultMap="UserMap">
select * from learn.user
</select>
- 测试
@Test
public void getUserByRowBoundsTest() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
//RowBounds实现
RowBounds rowBounds = new RowBounds(0, 2);
List<User> userList = sqlSession.selectList("com.luoqing.dao.UserMapper.getUserByRowBounds", null, rowBounds);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
2|3分页插件-PageHelper
- 添加依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
- 在mybatis-config.xml中配置插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql"/>
<!--
默认是false
设置为true,会将RowBounds第一个参数offset当成pageNum使用
-->
<property name="offsetAsPageNum" value="true"/>
<!--
默认是false
设置为true时,使用RowBounds分页会进行count查询
-->
<property name="rowBoundWithCoun" value="true"/>
<!--
默认是false
设置为true,如果pageSize=0或者RowBounds.limit=0就会查询出所有的结果
相当于没有执行分页查询,返回结果仍是Page类型
-->
<property name="pageSizeZero" value="true"/>
<!--
分页合理化参数,默认是false
设置为true,pageNum<=0时会查询第一页,pageNum>pages(超过总数时)会查询最后一页
-->
<property name="reasonable" value="true"/>
<!--
为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从Map或ServletRequest中根据属性名取值
-->
<property name="params" value="pageNum=start;pageSize=limit;"/>
<!--
默认是false
支持通过Mapper接口参数来传递分页参数
会从查询方法的参数值中,自动根据上面params配置的字段中取值,查找到合适的值时就会自动分页
-->
<property name="supportMethodsArgument" value="true"/>
</plugin>
</plugins>
- 测试
数据库准备
需要创建对应的POJO、DAO接口、Mapper.xml,此处省略
以下为测试代码
@Test
public void test1() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//方式一:
PageHelper.startPage(1,5);
List<Student> all = mapper.findAll();
for (Student student : all) {
System.out.println(student);
}
//方式二:
Page page = PageHelper.startPage(1,5);
mapper.findAll();
for (Object o : page) {
System.out.println(o);
}
sqlSession.close();
}
猜你喜欢
- 2024-10-16 MySQL 使用 limit 分页会导致数据丢失、重复和索引失效
- 2024-10-16 elasticsearch 分页查询 search_after 深分页
- 2024-10-16 SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase
- 2024-10-16 百万数据导出Excel,通过优化深度分页和线程编排,效...
- 2024-10-16 Mongodb 分页查询与排序查询 mongodb排序查询sort
- 2024-10-16 MVC模式下用Servlet和jsp分页的HelloWord
- 2024-10-16 elasticsearch 分页查询scroll 深分页
- 2024-10-16 京东终面:ElasticSearch深度分页如何优化?
- 2024-10-16 spring boot封装通用的查询+分页接口
- 2024-10-16 Elasticsearch 分页查询 from + size 浅分页
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)