MyBatis初体验

2019-10-20 00:00:00 mybatis 初体验

一、MyBatis

1、简介

  曾命名IBatis(老版本), 交给Google维护后,改名为MyBatis(新版本)。
学习文档:
  https://mybatis.org/mybatis-3/zh/index.html

2、作用:

  封装了JDBC操作,简化数据库访问代码。
封装功能:
(1)封装了获取连接,执行SQL语句,释放连接。
(2)封装了SQL参数设置。例如:insert into emp (name,age) values(#{name}, #{age})
(3)封装了记录映射成实体对象的过程。
注:

  实体类属性名与查询结果集ResultSet中的列名(并不一定是数据库中表的列名,而是取出时的列名、或者叫别名)要保持一致。

3、如何使用

step1:导入相关jar包(mybatis包 + 数据库驱动包)。
step2:编写mybatis配置的xml文件。用于指定数据库连接参数和SQL定义文件的位置。
step3:编写相关实体类(以及接口类)。
step4:编写sql语句的xml文件。用于定义SQL语句。
step5:使用SqlSession对象执行SQL操作(SqlSession 操作 是非线程安全的)。

4、最基本的使用方式

step1:导包。

《MyBatis初体验》

 

 

 

step2:编写mybatis配置的xml文件。

【config/mybatis-config.xml】

<?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="environment">
        <environment id="environment">
            <transactionManager type="JDBC"/>
            <!-- MyBatis自带连接池,只需配置数据库连接的一些数据即可
                       此处以MySql为例。
                   -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载SQL定义文件,需要修改
        若有多个SQL定义文件,可以使用<mapper />标签追加。
          文件路径中存在.的话,使用/分割
     -->
    <mappers>
        <mapper resource="config/EmpMapper.xml"/>
    </mappers>
</configuration>

 

step3:编写相关实体类对象。

【entity.Employee.java】

package entity;

import java.io.Serializable;

/**
 * 实体类
 */
public class Employee implements Serializable{
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}

 

step4:编写sql语句的xml文件。

【config/EmpMapper.xml】

<?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="mybatisDemo.entity.Employee">
    <!--
        namespace 指命名空间
        id 指的是sql语句唯一表示
        resultType 指的是sql的返回类型(使用全类名表示)
        #{id}  表示接收参数,相当于占位符,(可使用 ${id},其将数据直接显示在sql语句中)
    -->
    <select id="selectEmp" resultType="entity.Employee">
        select * from emp where id = #{id}
    </select>
</mapper>

 

step5:使用SqlSession对象执行SQL操作。

【test.Demo.java】

package test;

import entity.Employee;
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;

public class Demo {

    @Test
    public void test() throws IOException {
        // step1:读取配置文件
        String resource = "config/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // step2:创建一个 SqlSessionFactory 的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // step3:获取一个 SqlSession 的实例
        SqlSession session = sqlSessionFactory.openSession();
        try{
           // 根据唯一的sql id 定位到sql语句。
            Employee employee = session.selectOne("selectEmp", 1);
            System.out.println(employee);
        }finally {
            // step4:关闭 SqlSession 实例
            session.close();
        }
    }
}

 

step6:测试截图

《MyBatis初体验》

 

 

 

5、接口式编程

(1)定义一个接口,里面定义一系列方法,并将这些方法与 sql 语句的xml文件 进行映射。
(2)其中 方法名为 xml 文件中 的 唯一id标识, 并使用 resultType、resultMap 来定义返回值类型。
(3)与基本的方式相比,增加了个 接口类,映射到 sql 的 xml 文件(通过命名空间 namespace 来映射接口,id 为 接口的方法名),并通过接口类来进行sql的调用。
step1:导包

《MyBatis初体验》

 

 

 

step2:编写mybatis配置的xml文件。

【config/mybatis-config.xml】

<?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="environment">
        <environment id="environment">
            <transactionManager type="JDBC"/>
            <!-- MyBatis自带连接池,只需配置数据库连接的一些数据即可
                       此处以MySql为例。
                   -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/lyh?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载SQL定义文件,需要修改
        若有多个SQL定义文件,可以使用<mapper />标签追加。
          文件路径中存在.的话,使用/分割
     -->
    <mappers>
        <mapper resource="config/EmpMapper.xml"/>
    </mappers>
</configuration>

 

step3:编写相关实体类对象。

【entity.Employee.java】

package entity;

import java.io.Serializable;

/**
 * 实体类
 */
public class Employee implements Serializable{
    private Integer id;
    private String name;
    private Double salary;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}

 

step4:定义接口类

【mapper.EmpMapper.java】

package mapper;

import entity.Employee;

/**
 * 接口式编程,定义一系列方法,并根据方法映射到sql 的xml 文件中。
 */
public interface EmpMapper {
    public Employee getEmp(Integer id);
}

 

step5:编写sql语句的xml文件。

<?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="mapper.EmpMapper">
    <!--
        namespace 指命名空间,用于指明接口类的位置
        id 指的是sql语句唯一表示,为接口类中的方法
        resultType 指的是sql的返回类型(使用全类名表示)
        #{id}  表示接收参数,相当于占位符,(可使用 ${id},其将数据直接显示在sql语句中)
    -->
    <select id="getEmp" resultType="entity.Employee">
        select * from emp where id = #{id}
    </select>
</mapper>

 

step6:使用SqlSession对象执行SQL操作。

【test.Demo.java】

package test;

import entity.Employee;
import mapper.EmpMapper;
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;

public class Demo {

    @Test
    public void test() throws IOException {
        // step1:读取配置文件
        String resource = "config/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // step2:创建一个 SqlSessionFactory 的对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // step3:获取一个 SqlSession 的实例
        SqlSession session = sqlSessionFactory.openSession();
        try{
            // 获取接口类的对象(内部为接口类自动创建代理对象)
            EmpMapper empMapper = session.getMapper(EmpMapper.class);
            // 通过方法调用sql
            Employee employee = empMapper.getEmp(1);
            System.out.println(employee);
        }finally {
            // step4:关闭 SqlSession 实例
            session.close();
        }
    }
}

 

step7:测试截图

《MyBatis初体验》

 

 

 

二、全局配置文件

  用于 mybatis 的配置。

1、environments

  用于设置开发环境。每个<environment>标签可以设置一个开发环境。使用 default可以切换环境。

【environment内部的标签】
    transactionManager: 用于指定事务管理器。type="[JDBC|MANAGED]"
    dataSource:用于指定数据源。type="[UNPOOLED|POOLED|JNDI]"
    
【举例:】
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url"
                      value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
    <environment id="provided">
        <transactionManager type="MANAGED"/>
        <dataSource type="UNPOOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url"
                      value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

 

2、properties

  用于引入外部资源文件。比如 数据库的配置信息 放在 (.properties) 文件中。可以通过 <properties> 将 该文件引入。

【属性:】
    url:引入网络路径 或者 磁盘下的路径 下的文件
    resource: 引入当前项目类路径下的文件
    
引入文件后,使用 ${} 来取出 文件的内容。

 

对上例接口式编程进行部分修改。
(1)增加一个 config/db.properties,用于保存数据库连接信息。
(2)使用 <properties> 标签引入 db.properties 文件, 并使用 ${} 来取出 文件的内容。

《MyBatis初体验》

 

 

【db.properties】
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/lyh?useUnicode=true&characterEncoding=utf8
jdbc.username = root
jdbc.password = 123456


【config/mybatis-config.xml】
<?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>
    <properties resource="config/db.properties"></properties>

    <environments default="environment">
        <environment id="environment">
            <transactionManager type="JDBC"/>
            <!-- MyBatis自带连接池,只需配置数据库连接的一些数据即可
                       此处以MySql为例。
                   -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url"
                          value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载SQL定义文件,需要修改
        若有多个SQL定义文件,可以使用<mapper />标签追加。
          文件路径中存在.的话,使用/分割
     -->
    <mappers>
        <mapper resource="config/EmpMapper.xml"/>
    </mappers>
</configuration>

 

3、settings

  用于修改 mybatis 的默认设置。

【setting属性:】
    name:要修改的配置的名字
    value:要修改的配置的值

 

《MyBatis初体验》

 

 

(1)比如开启 驼峰命名映射规则(mapUnderscoreToCamelCase)。
  默认情况下,数据库里的数据,无法自动转换驼峰命名,获取不到值。

《MyBatis初体验》

 

 

开启驼峰命名映射规则后,可以获取到值。

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

《MyBatis初体验》

 

 

4、databaseIdProvider

  用于支持不同的数据库。

【在全局配置文件中,添加以下信息:】
    name指的是不同的数据库,value指的是别名。
<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="MySQL" value="mysql"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>


【在sql的xml文件中,使用databaseId来区别数据库】
<select id="getEmp" resultType="entity.Employee" databaseId="mysql">
    select * from emp where id = #{id}
</select>
<select id="getEmp" resultType="entity.Employee" databaseId="oracle">
    select * from emp where id = #{id}
</select>

 

5、mappers

  用于配置sql映射文件的读取位置。

(1)使用 <mapper> 标签来定义 sql 的xml文件。
【属性:】
    url:引入网络路径 或者 磁盘下的路径 下的文件
    resource: 引入当前项目类路径下的文件
    class: 用于引入接口类(使用时需要将 xml 与 接口类 放在同一个包下)。
    
(2)使用 <package> 标签来 批量定义映射器。
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

org.mybatis.builder 包下所有接口皆被定义为映射器,
若使用 sql的xml配置文件,则需将配置文件与 接口同名 且置于同一包下。
若使用 注解,则无需编写 sql语句 的 xml 配置文件。

注:

  使用class 属性时,可以在接口上使用 注解标记,并直接定义sql 语句(此时不需要sql的配置文件)。

《MyBatis初体验》

 

相关文章