一、准备工作

  1、创建数据库和表信息

DROP DATABASE IF EXISTS mybatis;
CREATE DATABASE mybatis;

DROP TABLE IF EXISTS tbl_employee;

CREATE TABLE IF NOT EXISTS tbl_employee (
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(255),
    gender CHAR(1),
    email VARCHAR(255)
)

INSERT INTO tbl_employee(`id`, `last_name`, `gender`, `email`) VALUES(1, 'Tom', 0, 'tom@126.com');

 

  2、加入依赖

 1       <dependency>
 2             <groupId>org.mybatis</groupId>
 3             <artifactId>mybatis</artifactId>
 4             <version>3.4.1</version>
 5         </dependency>
 6         <dependency>
 7             <groupId>mysql</groupId>
 8             <artifactId>mysql-connector-java</artifactId>
 9             <version>5.1.47</version>
10         </dependency>
11         <dependency>
12             <groupId>log4j</groupId>
13             <artifactId>log4j</artifactId>
14             <version>1.2.17</version>
15         </dependency>
16         <dependency>
17             <groupId>junit</groupId>
18             <artifactId>junit</artifactId>
19             <version>4.12</version>
20         </dependency>

 

  3、创建对应的 JavaBean

  4、添加 log4j 的配置文件,方便观看输出日志信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd  HH:mm:ss,SSS} %m  (%F:%L) \n"/>
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

 

 

二、使用 MyBatis 操作数据库

  1、创建 mybatis 全局配置文件

    MyBatis 的全局配置文件包含了影响 MyBatis 行为甚深的设置( settings)和属性( properties)信息、如数据库连接池信息等。指导着MyBatis进行工作。我们可以参照官方文件的配置示例。

 

    创建mybatis的核心(全局)配置文件mybatis-config.xml,并配置(用于连接数据库)参考 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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 写好的 SQL 映射文件一定要注册到全局配置文件中   -->
    <mappers>
        <mapper resource="EmpMapper.xml"/>
    </mappers>
</configuration>

 

  2、创建 sql 映射文件

    映射文件的作用就相当于是定义Dao接口的实现类如何工作。这也是我们使用MyBatis时编写的最多的文件。

    创建映射文件XxxMapper.xml,并配置(用于操作数据库)参考 MyBatis 的官方手册
<?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="EmpMapper">
<!--
    namespace:名称空间
    id:唯一标识
    resultType:返回值类型
    #{id} 从传递过来的参数中取出id值
-->
    <select id="selectEmp" resultType="com.njf.mybatis.bean.Employee">
        select id, last_name lastName, email, gender from tbl_employee where id = #{id}
    </select>

</mapper>

 

  3、测试

     @Test
     public void test1() throws IOException {
          //1、获取 sqlSessionFactory 工厂
          String resource = "mybatis-config.xml";
          InputStream inputStream = Resources.getResourceAsStream(resource);
          SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

          //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
          //  sql的唯一标识:statement Unique identifier matching the statement to use.
          //  执行SQL要用的参数:parameter A parameter object to pass to the statement.
          SqlSession sqlSession = sqlSessionFactory.openSession();

          try {
         //根据方法 id 进行操作 Employee emp
= sqlSession.selectOne("EmpMapper.selectEmp", 1); System.out.println(emp); } finally { sqlSession.close(); } }

 

    运行结果:

 

  4、小结

    (1)根据xml配置文件(全局配置文件)创建一个 SqlSessionFactory 对象数据源一些运行环境的配置信息;

    (2)SQL 映射文件,配置了每一个 SQL,以及 SQL 的封装规则等;

    (3)将SQL映射文件注册在全局配置文件中

    (4)操作步骤:

      ① 根据全局配置文件得到 sqlSessionFactory;

      ② 使用sqlSession工程,获取到 sqlSession 对象使用他来执行增删改查,一个 sqlSession 就是代表和数据库的一次会话,用完关闭;

      ③ 使用 SQL 的唯一标识来告诉 MyBatis 执行那个 SQL,SQL都在保存在 SQL 映射文件中;

 

三、面向接口编程

  1、创建一个接口

public interface EmployeeMapper {

    public Employee getEmpById(Integer id);
}

 

  2、根据接口创建 mapper 文件,并进行绑定

<?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="com.njf.mybatis.dao.EmployeeMapper">
<!--
    namespace:名称空间,指定为接口的全类名
    id:唯一标识,方法名
    resultType:返回值类型
    #{id} 从传递过来的参数中取出id值
-->

    <select id="getEmpById" resultType="com.njf.mybatis.bean.Employee">
        select id, last_name lastName, email, gender from tbl_employee where id = #{id}
    </select>

</mapper>

 

  注意:一定要完成两个绑定
            (1)Mapper 接口与 Mapper 映射文件的绑定,在 Mapper 映射文件中的 <mapper> 标签中的 namespace 中必须指定 Mapper 接口的全类名
            (2)Mapper 映射文件中的增删改查标签的 id 必须指定 Mapper 接口中的方法名;

 

  3、在全局配置文件中注册 mapper 配置文件

<mappers>
    <mapper resource="EmpMapper.xml"/>
    <mapper resource="EmployeeMapper.xml"/>
</mappers>

 

  4、测试

public SqlSessionFactory getsqlSessionFactory() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    return sqlSessionFactory;
}

@Test
public void test2() throws IOException {
    //1、获取 sqlSessionFactory
    SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();

    //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
    SqlSession sqlSession = sqlSessionFactory.openSession();

    try {
       //3、获取接口的实现类对象
       /**
        * 推荐使用
        * 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法,会通过动态代理动态生成UserMapper的代理实现类
        */
       EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
       System.out.println(employeeMapper);
       System.out.println(employeeMapper.getClass());
       Employee emp = employeeMapper.getEmpById(1);
       System.out.println(emp);
    } finally {
       sqlSession.close();
    }
}

 

    运行结果:

    可以看到是由 MyBatis 生成接口的代理对象来执行 SQL的。

    

    SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。
 

四、使用步骤

  (1)添加相关的依赖

  (2)创建 MyBatis 的核心(全局)配置文件 mybatis-config.xml 并配置(用于连接数据库)

  (3)创建mapper接口

  (4)创建SQL映射文件XxxMapper.xml,并配置每一个SQL语句(用于操作数据库)

      实现两个绑定:

      ① 接口全限定名要和映射文件的namespace保持一致;

      ② 接口中方法名和SQL语句的id保持一致;

  (5)将SQL映射文件注册在全局配置文件中;

  (6)获取mybatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类;

  (7)测试使用

    ① 根据全局配置文件得到 SqlSessionFactory;

    ② 使用sqlSession工厂,获取到sqlSession对象使用它来执行增删改查,一个sqlSession就是代表和数据库的一次会话,用完关闭。

    ③ 使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。

 

五、小结

  1、面向接口编程

原生:          Dao           ========>     DaoImpl
 Mybatis:    Mapper     ========>      xxxMapper.xml

  2、SqlSession 代表和数据库的一次会话,用完必须关闭。

  3、SqlSession 和 Connection 一样都是非线程安全的,因此是不能被共享的。每次使用都应该去获取新的对象,所以不能声明为私有的成员变量(注意)。 SqlSession每次使用完成后需要正确关闭,这个关闭操作是必须的。

  4、SqlSession可以直接调用方法的 id 进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作;

  5、mapper 接口没有实现类,但是 Mybatis 会为这个接口生成一个代理对象,将接口和xml进行绑定。

EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);

  

  6、两个重要的配置文件:

    ① Mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息;

    ② Sql映射文件:保存了每一个sql语句的映射信息,将SQL抽取出来;

 

 

 

 
posted on 2021-09-02 19:27  格物致知_Tony  阅读(109)  评论(0编辑  收藏  举报

目录导航