MyBatis学习总结(4)— LOG4J日志、分页、注解
1. LOG4J
log for java :Java的日志
Log4j 是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
-
Log4j依赖
pom.xml
中添加,<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
log4j的配置文件
log4j.properties
固定文件,### Log4j配置 ### #定义log4j的输出级别和输出目的地(目的地可以自定义名称,和后面的对应) #[ level ] , appenderName1 , appenderName2 log4j.rootLogger=DEBUG,console,file #-----------------------------------# #1 定义日志输出目的地为控制台 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG ####可以灵活地指定日志输出格式,下面一行是指定具体的格式 ### #%c: 输出日志信息所属的类目,通常就是所在类的全名 #%m: 输出代码中指定的消息,产生的日志具体信息 #%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行 log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #-----------------------------------# #2 文件大小到达指定尺寸的时候产生一个新的文件 log4j.appender.file = org.apache.log4j.RollingFileAppender #日志文件输出目录 log4j.appender.file.File=log/info.log #定义文件最大大小 log4j.appender.file.MaxFileSize=10mb ###输出日志信息### #最低级别 log4j.appender.file.Threshold=ERROR log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #-----------------------------------# #3 druid log4j.logger.druid.sql=INFO log4j.logger.druid.sql.DataSource=info log4j.logger.druid.sql.Connection=info log4j.logger.druid.sql.Statement=info log4j.logger.druid.sql.ResultSet=info #4 mybatis 显示SQL语句部分 log4j.logger.org.mybatis=DEBUG #log4j.logger.cn.tibet.cas.dao=DEBUG #log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG #log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG #log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG #log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
Mybatis的日志实现:
-
1、默认的日志实现
mybatis核心配置文件中添加,
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
示例:查询数据库信息
-
2、log4j 日志实现
-
导包,pom.xml中dependency
-
log4j.properties
配置文件 -
mybatis 核心配置文件中添加配置
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
示例:查询数据库信息
-
2. 分页的实现
mysql的分页语句
select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默认是0开始
# pageSize :页面大小
# 如何计算出当前页面
currentPage = (currentPage-1)* pageSize
2.1. 使用limit实现分页【掌握】
-
1.编写dao接口。
UserMapper接口
//查询全部用户实现分页 List<User> selectUserByLimit(Map<String,Integer> map);
-
2.mapper映射文件,
UserMapper.xml
【参数我们可以使用map封装,方便参数传递】
<!--mapper标签的namespace对应Mapper接口的类--> <mapper namespace="org.xiao.dao.UserMapper"> <select id="selectUserByLimit" parameterType="Map" resultType="User"> select * from mybatis.user limit #{startIndex},#{pageSize} </select> </mapper>
-
3.测试
模拟分页数据:currentPage,pageSize
public class UserMapperTest { @Test public void selectUserByLimit(){ SqlSession sqlSession = MyBatisUtils.getSqlSessionFactory().openSession(); //准备数据 int currentPage = 2; //当前页面 int pageSize =2; //页面大小 Map<String, Integer> map = new HashMap<String, Integer>(); map.put("startIndex",(currentPage-1)*pageSize); map.put("pageSize",pageSize); //测试 Object mapper = sqlSession.getMapper(UserMapper.class); //List<User> users = mapper.selectUserByLimit(map); List<User> users = ((UserMapper) mapper).selectUserByLimit(map); for (User user : users) { System.out.println(user); } sqlSession.close(); } }
-
结果:
2.2 使用RowBounds实现分页(了解)
-
写接口
//查询全部用户实现分页使用RowBounds List<User> selectUserByRowBounds();
-
写Mapper映射文件
<select id="selectUserByRowBounds" resultType="User"> select * from mybatis.user </select>
-
编写测试代码
@Test public void selectUserByRowBounds(){ //创建sqlSession SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); int currentPage = 2; //当前页 int pageSize = 2; //页面大小 RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize); //注意点;使用RowBounds就不能使用getMapper了 //selectList: 接收一个List //selectMap: 接收一个Map //selectOne : 接收只有一个对象的时候 List<User> users = sqlSession.selectList("com.kuang.dao.UserDao.selectUserByRowBounds", null, rowBounds); for (User user : users) { System.out.println(user); } }
limit 和 rowBounds区别
- rowBounds 本质就是封装了limit
- limit 是在SQL层面实现分页
- rowBounds 在代码层面实现分页
3. 使用注解开发
早期的,mybatis都是使用xml进行配置的,直到注解的出现,注解可以替代一些xml中的配置。
连xml配置都不要了!
CRUD的注解:
@insert()
@delete()
@update()
@select()
思考?我们之前的代码,还能在优化吗?
日志,工具类,配置文件,别名… 事务
mybaits开发人员也想到了,有一个构造器,可以实现事务自动提交。
openSession(true); //openSession构造器如果参数为true,则事务会自动提交。我们就不用每次都commit;
3.1 优化项目
事务优化:自动提交事务 在MyBatisUtils.java中添加事务自动提交的方法。
//获得一个带事务自动提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
//自动提交事务
return sqlSessionFactory.openSession(true);
}
别名优化:pojo包下类自动设置别名.
<!--配置别名-->
<typeAliases>
<!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
<package name="com.kuang.pojo"/>
</typeAliases>
mapper映射文件路径修改
<mappers>
<!--class对应的是一个接口类-->
<!--resource对应的是一个接口类的映射文件-->
<mapper class="com.kuang.dao.UserDao"/>
</mappers>
3.2使用注解进行开发
-
项目结构
-
UserMapper.java
package org.xiao2.dao; import org.apache.ibatis.annotations.*; import org.xiao2.pojo.User; import java.util.List; public interface UserMapper { //查询全部用户 @Select("select * from user") List<User> getUserList(); //通过ID查询用户 @Select("select * from user where id = #{id}") User getUserById(@Param("id") int id); //添加用户 @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})") int addUser(User user); //修改用户信息 @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}") int updateUser(User user); //删除用户 @Delete("delete from user where id =#{uid}") int deleteUser(@Param("uid") int id); }
-
mybatis核心配置文件
<?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> <!--配置文件修改--> <properties resource="database.properties"/> <!--配置log4j 日志--> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <!--; 配置别名 ;--> <typeAliases> <!--<!–<!–配置指定类的别名–>–>--> <typeAlias type="org.xiao2.pojo.User" alias="User"/> <!--别名优化:pojo包下类自动设置别名--> <package name="org.xiao2.pojo"/> </typeAliases> <!--配置环境,这里可以有多套环境 default代表默认的是那一套--> <environments default="development"> <!--配置一套环境 id .环境的名字--> <environment id="development"> <!--transactionManager:事务管理,type:jdbc--> <transactionManager type="JDBC"/> <!--dataSource 数据源--> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--映射文件路径修改--> <mappers> <!--class对应的是一个接口类--> <!--resource对应的是一个接口类的映射文件--> <mapper class="org.xiao2.dao.UserMapper"/> </mappers> </configuration>
-
测试类
package org.xiao2.dao; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import org.xiao2.pojo.User; import org.xiao2.utils.MyBatisUtils; import java.util.List; public class UserDaoTest { @Test public void getUserList(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); //带自动提交事务 UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } sqlSession.close(); } @Test public void getUserById(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close();//关闭sqlSession; } @Test public void addUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(5, "阿猫", "like-dog"); int i = mapper.addUser(user); System.out.println(i); sqlSession.close();//关闭sqlSession; } @Test public void updateUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务 UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(5, "阿狗", "like-cat"); int i = mapper.updateUser(user); System.out.println(i); sqlSession.close();//关闭sqlSession; } @Test public void deleteUser(){ SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务 UserMapper mapper = sqlSession.getMapper(UserMapper.class); int i = mapper.deleteUser(5); System.out.println(i); sqlSession.close();//关闭sqlSession; } }
注意事项
- 开启事务自动提交了
- @param参数尽量都写上,如果有多个参数,就必须填写。