超详细—狂神Mybatis笔记

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.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 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
  • 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@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分页

15、使用注解开发

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值