Mybatis的一些扩展操作
1.日志
入门的时候我们看过config中有settings的设置。其中就有日志有关的设置。
我们可以通过设置这些日志来查看我们程序的详细运行流程
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
1.1日志工厂
第三个字段就是描述的都有那些日志工厂:
- SLF4J
- LOG4J
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING (常用)
- NO_LOGGING
用上面的那个设置来输出一下日志:
这样能够帮助我们更容易的分析出问题.
这里样例为常用的查询所有。
1.2 Log4j
Log4j也是一个常用的日志项目。
- 可以控制日志信息输送的目的是控制台,文件,GUI组件等。
- 我们可以控制每一条日志的输出格式。
- 可以定义每一条日志信息的级别。
- 可以通过配置文件来进行配置而不需要修改其代码。
百度一下就有其详细的使用步骤:
-
导入jar包
<dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
-
在资源目录下创建一个log4j.properties文件
-
设置对应的属性
百度上有现成的,抄一份过来:
我也忘记了从哪找的,应该就是百度百科了.#将等级DEBUG的日志输出到console目的地,console的定义在下面 log4j.rootLogger=DEBUG,console #控制台输出的相关设置 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.org.mybatis=DEBUG log4j.appender.java.sql=DEBUG log4j.appender.java.sql.Statement=DEBUG log4j.appender.java.sql.ResultSet=DEBUG log4j.appender.java.sql.PrepareStatement=DEBUG
-
在输出日志的类中加入相关语句:
static Logger logger = Logger.getLogger(LogDemo.class); //定义属性:LogDemo为相关的类 //在相应的方法中: if (logger.isDebugEnabled()){ logger.debug(“System …..”); }
-
输出查看:直接运行就好了:
2.分页
减少单位时间的数据的处理量,来更好的优化性能。
2.1 Limit分页
语法:
select * from user limit startIndex,pageSize;
这样可以在sql层面上实现分页:
原数据:
User{id=1,name='a',password='1'}
User{id=2,name='b',password='2'}
User{id=3,name='c',password='3'}
User{id=5,name='aa',password='null'}
使用0,2分页:
<select id="getUserList" resultMap="userMap">
select * from user limit 0,2;
</select>
<!--
输出:
User{id=1,name='a',password='1'}
User{id=2,name='b',password='2'}
-->
动态分页的话,传入对应的值就好了。
- 新增一个接口:
//分页查询
List<User> getUserListByLimit(Map<String,Integer> map);
- 配置对应的mapper:
<!--分页查询-->
<select id="getUserListByLimit" parameterType="map" resultMap="userMap">
select * from user limit #{startIndex},#{pageSize};
</select>
- 在测试类中调用:
@Test
public void testAllLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("startIndex",1);
map.put("pageSize",2);
List<User> userList = userMapper.getUserListByLimit(map);
for(User user:userList){
System.out.println(user);
}
sqlSession.close();
}
运行结果:
User{id=2,name='b',password='2'}
User{id=3,name='c',password='3'}
以上的办法本质上还是修改sql来实现分页。在Java中,有着一个类来专门实现分页,那就是RowBounds分页
2.2 RowBounds分页
通过使用方法RowBounds来实现代码层面的分页。
-
新增查询接口:
//分页查询 List<User> getUserListByRowBounds();
-
修改mapper文件:
<!--分页查询--> <select id="getUserListByRowBounds" resultMap="userMap"> select * from user ; </select>
-
测试类中调用:
@Test public void testAllRowBounds(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); RowBounds rowBounds = new RowBounds(1,2); List<User> userList = sqlSession.selectList("com.admin.dao.UserMapper.getUserListByRowBounds",null,rowBounds); for(User user: userList){ System.out.println(user); } sqlSession.close(); }
看一下输出结果:
User{id=2,name='b',password='2'} User{id=3,name='c',password='3'}
这个RowBounds方法非常简单:
主要是sqlSession中有一个重载的方法,可以调用这个类。
不过据说这样操作效率更低。
2.3 更多的分页方式–插件
插件很多,比较出名的比如:PageHelper:https://pagehelper.github.io/
3.Lombok插件
3.1 Lombok插件概述
查看一下官网:https://projectlombok.org/
官网介绍:
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
大概意思就是lombok是一个java库,是一个插件,可以让我们不用再写get,set等方法了。
3.2 Lombok使用
-
IDEA安装插件
setting->Plugins->Lombok
-
导入maven的jar包。
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency>
-
使用。
看一下官方的解释:
看到这么多的注解,其实常用的也就圈出来的几个。
- Data:生成无参构造,get和set,tostring。
- Constructor的有参无参构造。
- 上面的就是我们常用的,getset,tostring的具体了。
3.3测试
在一个实体类中,使用以上注解:
这里只使用一个Data注解,可以看到结果还是很省事的。看一下注解的定义:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Data{
String staticConstructor() default "";
}
可以用在类上,也可以用在变量上。