mybatis中文手册:mybatis – MyBatis 3 | 简介
思路:搭建环境,导入Mybatis—>编写代码—>测试
1、搭建环境
1.1 创建数据库mybatis和user表
CREATE DATABASE `mybatis`; USE `mybatis`; CREATE TABLE `user`( `id` INT(20) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, `pwd` VARCHAR(30) DEFAULT NULL, PRIMARY KEY(`id`) )ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `user`(`id`,`name`,`pwd`) VALUES (1,'狂神','13456'), (2,'张三','12345'), (3,'李四','12346');
1.2新建java项目
- 注意因为我们要用maven仓库,所以要创建maven项目
- groupid和artifactId被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到maven本地仓库去,你想要找到你的项目就必须根据这两个id去查找。
groupId和artifactId是maven管理项目包时用作区分的字段,就像是地图上的坐标。
artifactId:artifactId一般是项目名或者模块名。
groupId:groupId分为几个字段,例如cn.com.fullstack,前面的com叫【域】,后面的是你自己起的域名。
groupId一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为org、com、cn等等许多,其中org为非营利组织,com为商业组织。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org(因为tomcat是非营利项目),公司名称是apache,artigactId是tomcat。
- 注意这里一定要用自己安装的maven路径。
- 一开始IDEA会默认使用Bundled(Maven 3),这个是直接把下载的jar包放在c盘的。
- 删除src文件
- 新建一个Module,注意新建这个module仍然选Maven项目,我在这里命名为mybatis-01
1.3 导入依赖
- 在pom.xml中导入以下依赖,如框A所示。
- 导入依赖后,在框B中会提示是否要import,点击import changes。然后就可以在IDEA右侧的Maven Projects中的Dependencies中发现引入了这些依赖。
<!--导入依赖--> <dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
什么是dependency?
- 用了Maven,所需的JAR包就不能再像往常一样,自己找到并下载下来,用IDE导进去就完事了,Maven用了一个项目依赖 (Dependency)的概念,用俗话说,就是我的项目需要用你这个jar包,就称之为我的项目依赖你这个包,换句话说,你这个JAR包就是我这个项目的Dependency。
- 就比如我已经在github中下载了mybatis,但是我在我的maven项目中并没有用我下载的这个mybatis的jar包,而是通过添加依赖的方式,让maven帮我下载。
删除src,自己新建一个module的好处?
- 在新建的mybatis-01的module中的pom.xml里会自动创建一个<parent></parent>,表明此module的父工程为com.hanT.Mybatis。因此在父工程pom.xml中导入的依赖就不用在子module中导入了。
- 同时在父工程的pom.xml中会生成一个<module></module>:代表它的子module
1.4 编写mybatis核心配置文件
- 来自:mybatis中文文档(这个文档的网页已收藏,重要!)
- 在module :mybatis01-src-main-resource中创建一个file文件:mybatis-config.xml
- 将黄框内复制进这个xml文件,删除<mappers></mappers>,并修改(填写)四个<property>标签(跟数据库相关的):
<property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/>
- 改为:
<property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="4.233928"/>
- 这里的driver为驱动,username和password为数据库的账户和密码。
1.5 连接MySQL数据库中的database:mybatis
- 点击IDEA右侧的DataBase后点击这个 + 号
- 选择Data Source — MySQL,进入后输入MySQL的账户名和密码,点击Test Connection。
- successful后点击Schemas
- 选择所需的mybatis这个database后点OK
1.6 编写mybatis工具类
- 先在mybatis01这个module的src-main-java中new 一个package:com.hanT.utils
- 在utils这个子包中new一个class:命名为mybatisUtils
public class mybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; //对应resources下的mybatis-config.xml InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ SqlSession sqlSession = sqlSessionFactory.openSession(); return sqlSession; } }
2、编写代码
- User为实体类
public class User {
//注意这三个属性一定要与数据库中user表的字段一致
private int id;
private String name;
private String pwd;
public User(){
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
- UserDao接口
public interface UserDao {
public List<User> getUserList();
}
- UserMapper.xml:相当于替代了UserDao接口的实现类
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace是与之绑定的Dao层(Mapper层)接口,原理相当于实现了此UserDao接口-->
<mapper namespace="com.hanT.dao.UserDao">
<!--id对应接口中的方法名,resultType为返回结果的类型,要用类的全限定名-->
<select id="getUserList" resultType="com.hanT.pojo.User">
select * from mybatis.user
</select>
</mapper>
3、测试代码以及可能会遇到的问题
- 在src.test下创建com.hanT.UserDaoTest进行测试
public class UserDaoTest {
@Test
public void Test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = mybatisUtils.getSqlSession();
//第二步:执行sql语句,通过UserDao.class获得其对应的实现类的对象mapper
UserDao mapper = sqlSession.getMapper(UserDao.class);
//第三步:通过mapper执行其getUserList()方法
List<User> userList = mapper.getUserList();
for(User user:userList){
System.out.println(user);
}
sqlSession.close();//用完后记者关闭session
}
}
错误1:绑定异常
- 原因是UserMapper.xml中的<mapper>没有在核心配置文件mybatis-config.xml中绑定。
- 解决办法是在核心配置文件mybatis-config.xml中加入以下代码:
<mappers> <mapper resource="com/hanT/dao/UserMapper.xml"/> </mappers>
错误2:初始化异常
- 原因是无法识别到com/hanT/dao/UserMapper.xml这个配置文件
- 解决办法是,在project工程和mybatis01模块的pom.xml文件都加上以下代码:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
4、mybatis实现CRUD(增删改查)
4.1 <select>
- 在UserMapper.xml中加入一个新的标签:
<select id="getUserById" resultType="com.hanT.pojo.User" parameterType="int"> select * from mybatis.user where id = #{id}; </select>
- select标签中各个属性的含义:
id:对应接口中的方法名 resultType:查询语句返回结果集的返回值类型(注意就算是以集合形式返回值,也要写集合中存储的具体类型) parameterType:参数类型,即查询参数#{id}中id的类型。
测试:
@Test public void Test2(){ SqlSession sqlSession = mybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); User user = mapper.getUserById(1); System.out.println(user); sqlSession.close();//用完后记者关闭session }
4.2 <insert>
- 首先在UserDao接口中添加新方法:
//3、插入新用户 void addUser(User user);
- 在UserMapper.xml中添加<insert>标签:
<insert id="addUser" parameterType="com.hanT.pojo.User"> insert into mybatis.user (id, name, pwd) values(#{id},#{name},#{pwd}); </insert>
这段sql中,mybatis框架会自动根据传入的User对象的id name pwd属性值,匹配#{}中的属性,这个设计很方便。
- 测试:
@Test public void Test3(){ SqlSession sqlSession = mybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.addUser(new User(4,"hantong","125478")); sqlSession.commit();//提交事务操作** sqlSession.close(); }
一定要注意的是:增、删、改要先提交事务再关闭session。也就是说要先
sqlSession.commit();
否则不会提交成功,user表中会看不到新插入的记录。
4.3 <update>
- 首先在UserDao接口中添加新方法:
//3、插入新用户 void addUser(User user);
- 在UserMapper.xml中添加<update>标签:
<update id="updateUser" parameterType="com.hanT.pojo.User"> update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id}; </update>
update mybatis.user set name=#{name},pwd=#{pwd} where id = #{id};
这段sql中,mybatis框架会自动根据传入的User对象的id name pwd属性值,匹配#{}中的属性,这个设计很方便。
- 测试:
@Test public void Test4(){ SqlSession sqlSession = mybatisUtils.getSqlSession(); UserDao mapper = sqlSession.getMapper(UserDao.class); mapper.updateUser(new User(4,"韩统","123456")); sqlSession.commit();//提交事务操作** sqlSession.close(); }
5、体会java反射在mybatis框架中的作用
5.1 由类名的字符串反射得到该类的class对象
//反射代码
Class clazz = Class.forName("com.hanT.pojo.User");
<!--UserMapper.xml代码-->
<mapper namespace="com.hanT.dao.UserDao">
<select id="getUserList" resultType="com.hanT.pojo.User">
select * from mybatis.user;
</select>
</mapper>
- 在 <mapper namespace="com.hanT.dao.UserDao">和resultType="com.hanT.pojo.User"中,框架就是通过反射,把类名的字符串反射得到该类的class对象。
5.2 由方法名和属性名的字符串反射得到此方法、属性的对象
//反射代码
Method method = clazz.getDeclaredMethod("getUserById");
Field field = clazz.getDeclaredField("id");
<!--UserMapper.xml代码-->
<mapper namespace="com.hanT.dao.UserDao">
<select id="getUserById" resultType="com.hanT.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id};
</select>
</mapper>
- 而且反射的牛逼之处在于私有的属性和方法一样可以获取到,例如User的id等属性都是私有的
6、mybatis配置优化
6.1 mybatis配置之属性优化
- 在原工程Mybatis下新建一个新module:mybatis02
- 并把mybatis01的文件复制到mybatis02中
目标:优化核心配置文件中的这一部分:
- 在resource目录下新建配置文件db.properties
- 注意在properties文件下要把url的转译符号 amp; 去掉。
- 在 核心配置文件<configuration>标签下引入<properties>:代表在核心配置文件中引入该外部配置文件。然后修改第二个黄色框内的内容。
<properties resource="db.properties"/>
- 注意在<configuration>中的各个子标签是必须按顺序的!!
- <configuration>中标签的顺序为:
1 properties 2 settintg 3 typeAliases 4 typeHandlers 5 objectFactory 6 objectWrapperFactory 7 reflectorFactory 8 plugins 9 environments 10 databaseIdProvider 11 mappers
- ${}不是#{},我就是因为写错导致报错:找不到driver
6.2 mybatis配置之别名优化
类型别名(<typeAliases>):类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
- 在核心配置文件中加入<typeAliases>标签:这里表示为全限定名com.hanT.pojo.User起别名为User
<typeAliases>
<typeAlias type="com.hanT.pojo.User" alias="User"/>
</typeAliases>
- 为com.hanT.pojo.User起别名后,在UserMapper.xml文件中的黄色框内就可以直接使用"User"
还可以通过扫描包的方式来起别名:
7、映射器(<mappers>)
我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:///
形式的 URL),或类名和包名等。例如下面四种方式:
<!-- 使用相对于类路径的资源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
- 目前使用过的是第一种方式:下图
简而言之,<mappers>在这里的作用就是将UserDao和UserMapper.xml文件绑定到一起。
8、作用域(Scope)和生命周期
执行流程:
- 作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
- 一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。
SqlSessionFactory:
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。
- 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式,保证全局只有一份变量。
- 说白了SqlSessionFactory可以看做一个连接池。
SqlSession:
- 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
-
这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。sqlSession.close();
- 全局只能有一个SqlSessionFactory
- 可以创建多个SqlSession(比如每个线程创建一个等)
- 同一个SqlSession可以创建多个Mapper,每个Mapper用来执行一个数据库语句
9、ResultMap(结果集映射)
——解决类的属性名和数据库字段名不一致的问题
之前属性名和数据库字段名要求必须保持一致:
- 假如现在User的属性名改为:其中UserName和password与数据库中字段不一致。
- 此时就需要修改UserMapper.xml文件
- 原先的UserMapper.xml文件<select>标签是这么写的:
<select id="getUserById" resultType="User">
select * from mybatis.user where id = #{id};
</select>
- 修改后:
<!--结果集映射-->
<resultMap id="my_Map" type="User">
<!--column(列):数据库表中的字段,property(属性):实体类的属性-->
<result column="pwd" property="password"/>
<result column="name" property="UserName"/>
</resultMap>
<select id="getUserById" resultMap="my_Map">
select * from mybatis.user where id = #{id};
</select>
1、需要新增<resultMap>标签 2、<resultMap>的属性id与<select>中的属性resultMap一致,代表二者是关联的 3、<resultMap>的属性type代表是哪个实体类的映射 4、column(列):数据库表中的字段,property(属性):实体类的属性
10、mybatis日志
- 日志需要在核心配置文件mybatis-config.xml中配置
- mybatis-config.xml有时候也被称为主配置文件
配置方法:
- 在mybatis-config.xml中的<configuration>中加入子标签<settings>(注意标签顺序,<settings>必须在<properties>和<typeAliases>之间)
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
-
value="STDOUT_LOGGING" 代表指定 MyBatis 所用日志的具体实现
-
name="logImpl" 表示此设置用来设置日志
运行UserDaoTest的Test1(), 控制台日志输出为:
D:\JDK8\bin\java -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=57888:D:\IntelliJ IDEA 2017.3.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar;D:\IntelliJ IDEA 2017.3.1\plugins\junit\lib\junit-rt.jar;D:\IntelliJ IDEA 2017.3.1\plugins\junit\lib\junit5-rt.jar;D:\JDK8\jre\lib\charsets.jar;D:\JDK8\jre\lib\deploy.jar;D:\JDK8\jre\lib\ext\access-bridge-64.jar;D:\JDK8\jre\lib\ext\cldrdata.jar;D:\JDK8\jre\lib\ext\dnsns.jar;D:\JDK8\jre\lib\ext\jaccess.jar;D:\JDK8\jre\lib\ext\jfxrt.jar;D:\JDK8\jre\lib\ext\localedata.jar;D:\JDK8\jre\lib\ext\nashorn.jar;D:\JDK8\jre\lib\ext\sunec.jar;D:\JDK8\jre\lib\ext\sunjce_provider.jar;D:\JDK8\jre\lib\ext\sunmscapi.jar;D:\JDK8\jre\lib\ext\sunpkcs11.jar;D:\JDK8\jre\lib\ext\zipfs.jar;D:\JDK8\jre\lib\javaws.jar;D:\JDK8\jre\lib\jce.jar;D:\JDK8\jre\lib\jfr.jar;D:\JDK8\jre\lib\jfxswt.jar;D:\JDK8\jre\lib\jsse.jar;D:\JDK8\jre\lib\management-agent.jar;D:\JDK8\jre\lib\plugin.jar;D:\JDK8\jre\lib\resources.jar;D:\JDK8\jre\lib\rt.jar;D:\IntelliJ IDEA 2017.3.1\Mybatis\mybatis02\target\test-classes;D:\IntelliJ IDEA 2017.3.1\Mybatis\mybatis02\target\classes;C:\Users\86131\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;C:\Users\86131\.m2\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;C:\Users\86131\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\86131\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.hanT.UserDaoTest.UserDaoTest,Test1
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1920387277.
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
==> Preparing: select * from mybatis.user;
==> Parameters:
<== Columns: id, name, pwd
<== Row: 1, 狂神, 13456
<== Row: 2, 张三, 12345
<== Row: 3, 李四, 12346
<== Row: 4, 韩统, 123456
<== Row: 5, 大头, 555555
<== Total: 5
com.hanT.pojo.User@24b1d79b
com.hanT.pojo.User@68ceda24
com.hanT.pojo.User@281e3708
com.hanT.pojo.User@35a50a4c
com.hanT.pojo.User@1f021e6c
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
Returned connection 1920387277 to pool.
Process finished with exit code 0
日志分析(见注释):
Opening JDBC Connection //打开jdbc连接
Created connection 1920387277. //创建新的连接对象
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd] //关闭自动提交功能
==> Preparing: select * from mybatis.user; //SQL语句
==> Parameters: //表示本SQL无参数
// 查询结果
<== Columns: id, name, pwd
<== Row: 1, 狂神, 13456
<== Row: 2, 张三, 12345
<== Row: 3, 李四, 12346
<== Row: 4, 韩统, 123456
<== Row: 5, 大头, 555555
<== Total: 5
//控制台输出
com.hanT.pojo.User@24b1d79b
com.hanT.pojo.User@68ceda24
com.hanT.pojo.User@281e3708
com.hanT.pojo.User@35a50a4c
com.hanT.pojo.User@1f021e6c
Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd]
Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7276c8cd] //关闭JDBC连接
Returned connection 1920387277 to pool. //将连接放回数据库连接池
11、1-10章mybatis结构总结(重要!!)
12、log4j
12.1 什么是log4j
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件;
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
- 最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
12.2 如何使用log4j
- 首先导入log4j的包
- 百度搜索 “log4j maven”,找到想要版本的对应的依赖xml配置代码:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- 在模块module02的pom.xml文件中插入:
- (注意要加上父标签<dependencies><dependencies/>)
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
- 在模块module02的resources文件下新建file:log4j.properties,这个配置文件就是用来控制log4j日志。(具体可CSDN搜一下“log4j配置文件详解”)
- log4j.properties示例:
log4j.rootLogger=DEBUG, console, dailyFile, im
log4j.additivity.org.apache=true
# 控制台(console)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 日志文件(logFile)
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=D:/logs/log.log4j
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 回滚文件(rollingFile)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.Threshold=DEBUG
log4j.appender.rollingFile.ImmediateFlush=true
log4j.appender.rollingFile.Append=true
log4j.appender.rollingFile.File=D:/logs/log.log4j
log4j.appender.rollingFile.MaxFileSize=200KB
log4j.appender.rollingFile.MaxBackupIndex=50
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 定期回滚日志文件(dailyFile)
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.Threshold=DEBUG
log4j.appender.dailyFile.ImmediateFlush=true
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.File=D:/logs/log.log4j
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 应用于Socket
log4j.appender.socket=org.apache.log4j.RollingFileAppender
log4j.appender.socket.RemoteHost=localhost
log4j.appender.socket.Port=5001
log4j.appender.socket.LocationInfo=true
# Set up for Log Factor 5
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 发送日志到指定邮件
log4j.appender.mail=org.apache.log4j.net.SMTPAppender
log4j.appender.mail.Threshold=FATAL
log4j.appender.mail.BufferSize=10
log4j.appender.mail.From = xxx@mail.com
log4j.appender.mail.SMTPHost=mail.com
log4j.appender.mail.Subject=Log4J Message
log4j.appender.mail.To= xxx@mail.com
log4j.appender.mail.layout=org.apache.log4j.PatternLayout
log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 应用于数据库
log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
log4j.appender.database.driver=com.mysql.jdbc.Driver
log4j.appender.database.user=root
log4j.appender.database.password=
log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
log4j.appender.database.layout=org.apache.log4j.PatternLayout
log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
# 自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
- 最后需要在mybatis-config.xml中配置
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
13、使用limit分页查询
略
14、RowBounds分页
略