1-Mybatis基礎

1.Mybatis 快速入門

2.Mybatis 相關API

3.Mybatis 映射配置文件

4.Mybatis 核心配置文件

5.Mybatis 傳統(tǒng)方式實現(xiàn)Dao層

框架介紹

  • 框架就是半成品軟件,我們可以基于這個半成品軟件繼續(xù)開發(fā),完成個性化需求

ORM介紹

  • ORM(Object Relational Mapping): 對象關系映射
  • 指的是持久化數(shù)據和實體對象的映射模式,為了解決面向對象與關系型數(shù)據庫存在的互不匹配的現(xiàn)象的技術
  • 映射規(guī)則
    數(shù)據表-> 類
    表字段-> 類屬性
    表數(shù)據-> 對象

原始JDBC的操作弊端

  • 原始JDBC的操作問題分析
    1.頻繁創(chuàng)建和銷毀數(shù)據庫的連接會造成系統(tǒng)資源浪費從而影響系統(tǒng)性能
    2.SQL語句在代碼中硬編寫,如果要修改sql語句,就需要修改java代碼,造成代碼不易維護
    3.查詢操作時,需要手動將結果集中的數(shù)據結構封裝到實體對象中
    4.增刪改查操作需要參數(shù)時,需要手動將實體對象的數(shù)據設置到sql語句的占位符
  • 原始JDBC的操作問題解決方案
    1.使用數(shù)據庫連接池初始化連接資源
    2.將sql語句抽取到配置文件中,讀取配置文件
    3.使用反射,內省等底層技術,將實體與表進行屬性和字段的自動映射

MyBatis介紹

  • MyBatis是一個優(yōu)秀的基于java的持久層框架,它內部封裝了JDBC,時開發(fā)這只需要關注SQL語句本省,而不需要花費精力去處理加載驅動,創(chuàng)建連接,創(chuàng)建執(zhí)行對象等復雜的操作
  • MyBatis通過XML或注解的方式將要執(zhí)行的各種Statement配置起來,并通過java對象和Statement中SQL的動態(tài)參數(shù)進行映射生成最終要執(zhí)行的SQL語句
  • 最后MyBatis框架執(zhí)行完SQL并將結果映射為Java對象返回.采用ORM思想解決了實體和數(shù)據庫映射的問題,對JDBC進行了封裝,屏蔽了JDBC API底層訪問細節(jié),使我們不用和JDBC API打交道,就可以完成對數(shù)據庫的持久化操作

1.快速入門

1.環(huán)境搭建(創(chuàng)建user數(shù)據表宋雏、編寫Student實體類)
2.編寫StudentMapper映射文件
mapping文件約束頭

<?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">
<?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">
<mapper namespace="StudentMapper">
    <select id="selectAll" resultType="com.itheima.bean.Student">
        SELECT * FROM student
    </select>
</mapper>

3.編寫MyBatisConfig核心文件
核心文件約束頭

<?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">
<?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>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://數(shù)據庫地址/庫名"/>
                <property name="username" value="賬號"/>
                <property name="password" value="密碼"/>
            </dataSource>
        </environment>
    </environments>
<!--加載映射文件-->
    <mappers>
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>
</configuration>

4.編寫測試類

package com.itheima.dao;
import com.itheima.bean.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class StudentTest01 {
    /*
         查詢全部
    */
    @Test
    public void selectAll() throws IOException {
        //1.加載核心配置
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //2.獲取SqlSession工廠對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3.通過SqlSession工廠對象獲取SqlSession對象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.執(zhí)行映射配置文件中的sql語句,并接收結果
        List<Student> list = sqlSession.selectList("StudentMapper.selectAll");
        //5.處理結果
        for (Student student : list) {
            System.out.println(student);
        }
        //6.釋放資源
        sqlSession.close();
        is.close();
    }
}

2.相關API

Resource

  • org,apache.ibatis.io.Resource: 加載資源的工具類
    核心方法:
    返回值: InputStream
    方法名: getResourceAsStream(String fileName)
    說明: 通過類加載器返回指定資源的字節(jié)輸入流

SqlSessionFactoryBuilder

  • org.apache.ibatis.session.SqlSessionFactoryBuilder: 獲取SqlSessionFactory工廠類對象的功能類
    核心方法:
    返回值: SqlSessionFactory
    方法名: build(InputStream is)
    說明: 通過指定資源字節(jié)輸入流獲取SqlSession工廠類對象

SqlSessionFactory

  • org.apache.ibatis.session.SqlSessionFactpory: 獲取SqlSession構架者對象的工廠類接口
    返回值: SqlSession
    方法名: openSession()
    說明: 獲取SqlSession構建者對象,并開啟手動提交事務
    返回值: SqlSession
    方法名: openSession(boolean autoCommit)
    說明: 獲取SqlSession構建者對象,如果參數(shù)為true,則開啟自動提交事務

SqlSession

  • org.apache.ibatis.session.SqlSession: 構建者對象接口,用于執(zhí)行SQL,管理事務,接口代理


    方法列表

3.映射配置文件

  • 映射配置文件包含了數(shù)據和對象之間的映射關系以及要執(zhí)行的SQL語句
  • 1.<mapper>: 核心根標簽
    namespace屬性: 名稱空間
  • 2.<select>: 查詢功能的標簽
  • 4.<insert>: 新增功能標簽
  • 5.<update>: 修改功能標簽
  • 6.<delete>: 刪除功能標簽
    標簽相同屬性
    1.id屬性: 唯一標識,配合命名空間使用
    2.resultType屬性: 指定結果映射對象類型
    3.parameterType屬性: 指定參數(shù)隱射對象類型
  • 7.SQL獲取參數(shù): #{屬性名}

測試單元代碼

package com.itheima.dao;

import com.itheima.bean.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class StudentTest01 {
    /*
         查詢全部
    */
    @Test
    public void selectAll() throws IOException {
        //1.加載核心配置
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //2.獲取SqlSession工廠對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //3.通過SqlSession工廠對象獲取SqlSession對象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.執(zhí)行映射配置文件中的sql語句,并接收結果
        List<Student> list = sqlSession.selectList("StudentMapper.selectAll");
        //5.處理結果
        for (Student student : list) {
            System.out.println(student);
        }
        //6.釋放資源
        sqlSession.close();
        is.close();
    }
    /*
         根據id進行查詢
    */
    @Test
        public  void selectById() throws IOException {
            //加載核心配置文件
            InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //獲取SqlSession工廠對象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠對象獲取SqlSession對象
            SqlSession sqlSession = sqlSessionFactory.openSession();
            //執(zhí)行映射配置文件中的sql語句,并接收結果
            Student stu = sqlSession.selectOne("StudentMapper.selectById", 1);
            //打印結果
            System.out.println(stu);
            //釋放資源
            sqlSession.close();
            is.close();
        }
    /*
         新增學生方法
    */
    @Test
    public  void insert() throws IOException {
        //加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //獲取工廠類對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //通過工廠類對象獲取SqlSession對象
        //SqlSession sqlSession = sqlSessionFactory.openSession();
        //通過給定布爾類型的參數(shù)為true,開啟自動提交事務
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //執(zhí)行映射配置文件中的sql語句,并接收結果
        Student stu = new Student(5, "周期", 77);
        int insert = sqlSession.insert("StudentMapper.insert",stu);
        //對于增刪改,提交事務
        //sqlSession.commit();
        System.out.println(insert);
        //釋放資源
        sqlSession.close();
        is.close();
    }
    /*
         修改學生方法
    */
    @Test
    public  void update() throws IOException {
        //加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //獲取工廠類對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //通過工廠類對象獲取SqlSession對象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //執(zhí)行映射配置文件中的sql語句,并接收結果
        Student stu = new Student(5, "周七", 27);
        int result = sqlSession.update("StudentMapper.update",stu);
        //對于增刪改,提交事務
        sqlSession.commit();
        System.out.println(result);
        //釋放資源
        sqlSession.close();
        is.close();
    }
    /*
         刪除學生方法
    */
    @Test
    public  void delete() throws IOException {
        //加載核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        //獲取工廠類對象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //通過工廠類對象獲取SqlSession對象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //執(zhí)行映射配置文件中的sql語句,并接收結果
        int result = sqlSession.delete("StudentMapper.delete",5);
        //對于增刪改,提交事務
        sqlSession.commit();
        System.out.println(result);
        //釋放資源
        sqlSession.close();
        is.close();
    }
}

映射配置文件

<?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">
<mapper namespace="StudentMapper">
<!--    查詢功能-->
    <select id="selectAll" resultType="com.itheima.bean.Student">
        SELECT * FROM student
    </select>
<!--    根據id查詢-->
    <select id="selectById" resultType="com.itheima.bean.Student" parameterType="java.lang.Integer">
        select * FROM student where id = #{id}
    </select>
<!--    新增功能-->
    <insert id="insert" parameterType="com.itheima.bean.Student">
        insert into student values (#{id},#{name},#{age})
    </insert>
<!--    修改功能-->
    <update id="update" parameterType="com.itheima.bean.Student">
        update student set name=#{name},age=#{age} where id=#{id}
    </update>
<!--    刪除功能-->
    <delete id="delete" parameterType="java.lang.Integer">
        delete from student where id=#{id}
    </delete>
</mapper>

4.核心配置文件

  • 核心配置文件包含了MyBatis最核心的設置和屬性信息,如數(shù)據庫的連接,事務,連接池信息等

對配置文件進行說明

<?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>
<!--    environments配置數(shù)據庫環(huán)境標簽,環(huán)境可以有多個,default屬性指定使用的是哪個-->
<!--    利用environment標簽可以配置多個數(shù)據庫信息標簽如mysql1,mysql2等等,最終使用哪個,要environments 標簽中的 default屬性來選擇-->
    <environments default="mysql">
<!--    environment配置數(shù)據庫信息標簽 id屬性代表唯一的標識-->
        <environment id="mysql">
<!--            transactionManager事務的管理標簽 type屬性,采用JDBC默認的事務-->
            <transactionManager type="JDBC"></transactionManager>
<!--            dataSource數(shù)據源標簽 type屬性 連接池-->
            <dataSource type="POOLED">
<!--                property獲取數(shù)據庫連接的數(shù)據信息標簽-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://IP地址:3306/庫名"/>
                <property name="username" value="用戶"/>
                <property name="password" value="密碼"/>
            </dataSource>
        </environment>
    </environments>

<!--        mappers引入映射配置文件標簽-->
    <mappers>
<!--        mapper 引入指定的映射配置文件 resource屬性: 指定映射配置文件的名稱-->
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>
</configuration>

數(shù)據庫配置文件引入

  • <properties>: 引入數(shù)據庫連接信息配置文件標簽
  • 屬性
    resource: 數(shù)據庫連接配置文件路徑
  • 獲取數(shù)據庫連接參數(shù): ${鍵名}

編寫一個JDBC數(shù)據庫配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://IP地址:3306/數(shù)據庫名
username=用戶
password=密碼

在核心配置文件中引入JDBC數(shù)據庫配置文件,其他配置不變

<!--引入數(shù)據庫連接的配置文件-->
<properties resource="JDBC.properties"/>

<!--property獲取數(shù)據庫連接的數(shù)據信息-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>

核心配置文件-起別名的使用

  • <typeAliases>: 為全類名起別名的父標簽
  • <typeAlias>: 為全類名起別名的子標簽
  • 屬性
    type: 指定全類名
    alias: 指定別名
  • <package>: 為指定包下所有類型起別名的子標簽(別名就是類名)

在核心配置文件<configuration>標簽中添加起別名標簽,其他配置不變

<!--    起別名-->
    <typeAliases>
        <typeAlias type="com.itheima.bean.Student" alias="student"/>
    </typeAliases>

映射配置文件修改 對com.itheima.bean.Student全類名的引用,其他配置文件不變

<?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">
<mapper namespace="StudentMapper">
<!--    查詢功能-->
    <select id="selectAll" resultType="student">
        SELECT * FROM student
    </select>
<!--    根據id查詢-->
    <select id="selectById" resultType="student" parameterType="java.lang.Integer">
        select * FROM student where id = #{id}
    </select>
<!--    新增功能-->
    <insert id="insert" parameterType="student">
        insert into student values (#{id},#{name},#{age})
    </insert>
<!--    修改功能-->
    <update id="update" parameterType="student">
        update student set name=#{name},age=#{age} where id=#{id}
    </update>
<!--    刪除功能-->
    <delete id="delete" parameterType="student">
        delete from student where id=#{id}
    </delete>
</mapper>

常見的自帶的別名


常見自帶別名的包

5.Mybatis 傳統(tǒng)方式實現(xiàn)Dao層

Dao 層傳統(tǒng)實現(xiàn)方式

  • 分層思想: 控制層(controller),業(yè)務層(service),持久層(dao)
  • 調用流程
    控制層->業(yè)務層->持久層->DB
    結構目錄

    1.三個配置文件內容不變
    2.編寫的Student類和之前一樣,成員變量和Mysql的表字段對齊
    3.持久層mapper目錄下的StudentMapperImpl實現(xiàn)類和StudentMapper接口代碼
package com.itheima.mapper;
import com.itheima.bean.Student;
import java.util.List;
/*
    持久層接口
 */
public interface StudentMapper {
    //查詢全部
    public abstract List<Student> selectAll();
    //條件查詢
    public abstract Student selectById(Integer id);
    //新增數(shù)據
    public abstract Integer insert(Student stu);
    //更新全部
    public abstract Integer update(Student stu);
    //刪除全部
    public abstract Integer delete(Integer id);
}
package com.itheima.mapper.impl;

import com.itheima.bean.Student;
import com.itheima.mapper.StudentMapper;
import com.sun.corba.se.impl.resolver.SplitLocalResolverImpl;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/*
    持久層實現(xiàn)類
 */
public class StudentMapperImpl implements StudentMapper {
    //查詢全部
    @Override
    public List<Student> selectAll() {
        InputStream is = null;
        SqlSession sqlSession = null;
        List<Student> list = null;
        try {
            //加載核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //獲取SqlSession工廠對象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠對象獲取SqlSession對象
            sqlSession = sqlSessionFactory.openSession(true);
            //執(zhí)行映射配置文件中的sql語句,并接收結果
            list = sqlSession.selectList("StudentMapper.selectAll");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //釋放資源
            if (sqlSession != null) {
                sqlSession.close();
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回結果
        return list;
    }

    //根據id查詢
    @Override
    public Student selectById(Integer id) {
        InputStream is = null;
        SqlSession sqlSession = null;
        Student stu = null;
        try {
            //加載核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //獲取SqlSession工廠對象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠對象獲取SqlSession對象
            sqlSession = sqlSessionFactory.openSession(true);
            //執(zhí)行映射配置文件中的sql語句,并接收結果
            stu = sqlSession.selectOne("StudentMapper.selectById", id);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //釋放資源
            if (sqlSession != null) {
                sqlSession.close();
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回結果
        return stu;
    }

    //新增數(shù)據
    @Override
    public Integer insert(Student stu) {
        InputStream is = null;
        SqlSession sqlSession = null;
        Integer result = null;
        try {
            //加載核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //獲取SqlSession工廠對象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠對象獲取SqlSession對象
            sqlSession = sqlSessionFactory.openSession(true);
            //執(zhí)行映射配置文件中的sql語句,并接收結果
            result = sqlSession.insert("StudentMapper.insert", stu);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //釋放資源
            if (sqlSession != null) {
                sqlSession.close();
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回結果
        return result;
    }

    //修改數(shù)據
    @Override
    public Integer update(Student stu) {
        InputStream is = null;
        SqlSession sqlSession = null;
        Integer result = null;
        try {
            //加載核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //獲取SqlSession工廠對象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠對象獲取SqlSession對象
            sqlSession = sqlSessionFactory.openSession(true);
            //執(zhí)行映射配置文件中的sql語句,并接收結果
            result = sqlSession.update("StudentMapper.update", stu);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //釋放資源
            if (sqlSession != null) {
                sqlSession.close();
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回結果
        return result;
    }

    //刪除數(shù)據
    @Override
    public Integer delete(Integer id) {
        InputStream is = null;
        SqlSession sqlSession = null;
        Integer result = null;
        try {
            //加載核心配置文件
            is = Resources.getResourceAsStream("MyBatisConfig.xml");
            //獲取SqlSession工廠對象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            //通過工廠對象獲取SqlSession對象
            sqlSession = sqlSessionFactory.openSession(true);
            //執(zhí)行映射配置文件中的sql語句,并接收結果
            result = sqlSession.delete("StudentMapper.delete", id);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //釋放資源
            if (sqlSession != null) {
                sqlSession.close();
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //返回結果
        return result;
    }
}

4.業(yè)務層Service目錄下的StudentServiceImpl實現(xiàn)類和StudentService接口代碼

package com.itheima.service;

import com.itheima.bean.Student;
import java.util.List;

/*
    業(yè)務層接口
 */
public interface StudentService {
    //查詢全部
    public abstract List<Student> selectAll();
    //根據id查詢
    public abstract Student selectById(Integer id);
    //新增數(shù)據
    public abstract Integer insert(Student stu);
    //修改數(shù)據
    public abstract Integer update(Student stu);
    //刪除數(shù)據
    public abstract Integer delete(Integer id);
}
package com.itheima.service.Impl;

import com.itheima.bean.Student;
import com.itheima.mapper.StudentMapper;
import com.itheima.mapper.impl.StudentMapperImpl;
import com.itheima.service.StudentService;
import java.util.List;
/*
    業(yè)務層實現(xiàn)類
 */
public class StudentServiceImpl implements StudentService {
    //創(chuàng)建持久層對象
    private StudentMapper mapper = new StudentMapperImpl();

    @Override
    public List<Student> selectAll() {
        return mapper.selectAll();
    }

    @Override
    public Student selectById(Integer id) {
        return mapper.selectById(id);
    }

    @Override
    public Integer insert(Student stu) {
        return mapper.insert(stu);
    }

    @Override
    public Integer update(Student stu) {
        return mapper.update(stu);
    }

    @Override
    public Integer delete(Integer id) {
        return mapper.delete(id);
    }
}

LOG4J

  • 在日常開發(fā)過程中,排查問題是難免需要輸出MyBatis真正執(zhí)行的SQL語句,參數(shù),結果等信息,我們就可以借助LOG4J的功能來實現(xiàn)執(zhí)行信息的輸出
  • 使用步驟
    1.導入jar包
    2.修改核心配置文件,添加<settings>標簽
<!--    繼承LOG4J日志信息-->
    <settings>
        <setting name="logImpl" value="log4j"/>
    </settings>
核心配置文件報錯

原因: 注意標簽的先后順序<settings>標簽要在<properties>后面,

3.在src下編寫LOG4J配置文件,配置文件為log4j.properties要不然會報錯

# Global Logging configuration
# ERROR WARN INFO DEBUG 
log4j.rootLogger=DEBUG,stdout
# Console output...
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %5p [%t] - %m%n
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末膛薛,一起剝皮案震驚了整個濱河市抡蛙,隨后出現(xiàn)的幾起案子千劈,更是在濱河造成了極大的恐慌寝受,老刑警劉巖讶踪,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿傅,死亡現(xiàn)場離奇詭異,居然都是意外死亡总处,警方通過查閱死者的電腦和手機狈惫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胧谈,你說我怎么就攤上這事忆肾。” “怎么了菱肖?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵客冈,是天一觀的道長。 經常有香客問我稳强,道長场仲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任退疫,我火速辦了婚禮渠缕,結果婚禮上,老公的妹妹穿的比我還像新娘褒繁。我一直安慰自己亦鳞,他們只是感情好,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布棒坏。 她就那樣靜靜地躺著燕差,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坝冕。 梳的紋絲不亂的頭發(fā)上徒探,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音喂窟,去河邊找鬼测暗。 笑死,一個胖子當著我的面吹牛磨澡,可吹牛的內容都是我干的偷溺。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼钱贯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侦另?” 一聲冷哼從身側響起秩命,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎褒傅,沒想到半個月后弃锐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡殿托,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年霹菊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡旋廷,死狀恐怖鸠按,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情饶碘,我是刑警寧澤目尖,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站扎运,受9級特大地震影響瑟曲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜豪治,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一洞拨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧负拟,春花似錦烦衣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涣脚,卻和暖如春示辈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遣蚀。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工矾麻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芭梯。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓险耀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玖喘。 傳聞我的和親對象是個殘疾皇子甩牺,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內容