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&amp;useUnicode=true&amp;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.xmlInputStream 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 mapperPUBLIC "-//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 {@Testpublic void Test(){//第一步:获得SqlSession对象SqlSession sqlSession = mybatisUtils.getSqlSession();//第二步:执行sql语句,通过UserDao.class获得其对应的实现类的对象mapperUserDao 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的类型。

测试:

    @Testpublic 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属性值,匹配#{}中的属性,这个设计很方便。

  • 测试:
    @Testpublic 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属性值,匹配#{}中的属性,这个设计很方便。

  • 测试:
    @Testpublic 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 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
  • sqlSession.close();

    这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

  1. 全局只能有一个SqlSessionFactory
  2. 可以创建多个SqlSession(比如每个线程创建一个等)
  3. 同一个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有时候也被称为主配置文件

配置方法:

  1. 在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@1f021e6cResetting 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分页

15、使用注解开发

超详细—狂神Mybatis笔记相关推荐

  1. PHP取经(二)变量、标量、特殊类型、常量——超详细PHP学习笔记

    初学小白超详细PHP学习笔记 定义变量 PHP-变量名的命名规则 变量的数据类型 标量类型--布尔类型 详述数据类型中的整型 标量类型 标量类型-浮点型 标量类型-字符串 当字符串中引号遇到美元咋办? ...

  2. python超详细的常用笔记

    关注微信公众号:(新生程序员教程) 下载python的word笔记,了解更多编程语言和程序员学习网站,学习平台 目录 第1章:Python的基础篇 1.1计算机的组成[了解] 1.2.计算机如何处理程 ...

  3. Redis 超详细版教程笔记

    视频教程:[狂神说Java]Redis最新超详细版教程通俗易懂 视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 目录索引 nosql 阿里巴巴架构演进 ...

  4. JVM-内存与垃圾回收篇!女朋友看了都想当架构师的超详细保姆级笔记!呕心沥血之作!看完还不会你砍我!

    1. JVM与Java体系结构 1.1 Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种 ...

  5. 【狂神Mybatis笔记】配置解析

    核心配置文件:mybatis-config.xml Mybatis的配置文件包含了会影响Mybatis行为的设置和属性信息 环境配置(environments) 要求:学会使用配置多套运行环境 MyB ...

  6. 【狂神MyBatis笔记】map作为参数传递类型进行增删改查模糊查询

    接口中的参数传入map: 实现类的传入参数为map的键的名称,这个键可以自定义名称: 例:根据ID获取用户 接口: //根据ID获取用户User getUserById2(Map<String, ...

  7. 超详细的wireshark笔记(2)-wireshark的使用技巧

    抓包 1.只抓包头 一般能抓到的每个包(称为"帧"更准确,但是出于表达习惯,本书可能会经常用"包"代替"帧"和"分段") ...

  8. Kafka原理--超详细(学习笔记)

    一.概念理解 ​ Kafka 是最初由Linkedin 公司开发,**是一个分布式.支持分区的(patition).多副本的(replica).**基于zookeeper协调的分布式消息系统,它的最大 ...

  9. 【超详细】Mybatis plus 从入门到精通

    mybatis-plus是一款Mybatis增强工具,用于简化开发,提高效率.下文使用缩写mp来简化表示mybatis-plus,本文主要介绍mp搭配SpringBoot的使用. 注:本文使用的mp版 ...

  10. python 大学教授整理_剑桥大学教授用时35天亲自整理,Python超详细的基础笔记

    python简介 python是一种面向对象的解释型计算机程序设计语言,python的是吉多·范罗苏姆(Guido van Rossum)于1989年发明 任何语言都有优缺点,python也不例外,p ...

最新文章

  1. python中的对象拷贝
  2. 【安骑士】安装失败问题分析
  3. mysql error manager,MYSQL Starting MySQL. ERROR! Manager of pid-file quit without updating file
  4. 互联网1分钟 |1113
  5. 干货|如何在无回显时渗透
  6. 百万个小油馕跨越3000公里来支援!西安加油!
  7. java : nio 学习
  8. DIV+CSS_1_样式表的分类
  9. 网络github_GitHub项目awesome-latex-drawing新增内容(四):绘制贝叶斯网络
  10. java可达性_Java 垃圾回收 - 可达性分析算法
  11. ps+背景缩放+内容缩放
  12. C语言中多个 \n 作用
  13. 小武与YOLOv3----优图代码
  14. 创建微信订阅号全攻略
  15. java graphics2d 绘图_java GUI Graphics2D 绘图
  16. python087(文件—文件概念以及文本文件和二进制文件的区别)
  17. 赛效:如何在线给图片加水印
  18. 本地局域网HTTPS解决方案 CA证书
  19. Android自定义-滑动缩放渐变填充曲线折线图表
  20. Statistical Analysis of Network Data with R(第二版) 上机实操 4

热门文章

  1. rust货轮什么时候出现_中国最早的汉字出现于什么时候?
  2. Assuming drive cache: write through ubuntu硬盘内存扩展
  3. Android显示gif格式图片
  4. mysql的user表被清空_不小心删除掉了mysql user表无法登陆进mysql解决方法
  5. GoLang读写数据---上
  6. windows11 笔记本开启热点就断网
  7. Linux-服务器管理操作
  8. GoTop给网站加一个悬挂猫效果上吊猫
  9. 中国轨道交通设备行业建设投资规模及十四五产量趋势研究报告2021-2027年版
  10. 第九十七章 SQL函数 MONTH