Mybatis入门

82 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

Mybatis简介

      Mybatis是一个支持定制化SQL、存储过程以及高级映射的持久化层框架,同时避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。由于Mybatis可以使用简单的XML用于配置和原始映射,将接口和Java的POJO类映射成数据库中的记录,使得开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

Mybatis与JDBC、Hibernate的对比:

JDBC:SQL夹在Java代码块里,耦合度高导致硬编码内伤;维护不易且实际开发需求中sql是有变化的,需要频繁修改的情况多见;要自己创建connection、创建statement、手动设置参数、结果集检索等

Hibernate:Hibernate是一个全自动化的持久化层框架;长难复杂SQL,对于Hibernate而言处理也不容易;内部自动生产的SQL不容易做特殊优化。

Mybatis:对开发人员而言,核心sql需要自己优化;Mybatis是一个半自动化的持久化层框架;Mybatis支持定制化sql、存储过程以及高级映射。

Mybatis入门程序

1. 下载Mybatis核心包

官网地址:mybatis – MyBatis 3 | Getting started

国内镜像地址:mvnrepository.com/artifact/or…

2. 创建工程,引入Mybatis核心包以及工程依赖包

图片1.png

3. 数据库中创建customer表,并在工程中建立与表对象的ORM类

图片2.png

@Setter@Getter
public class Customer {
    private Integer cust_id;
    private String cust_name;
    private String cust_profession;
    private String cust_phone;
    private String email;

    @Override
    public String toString() {
        return "Customer{" +
                "cust_id=" + cust_id +
                ", cust_name='" + cust_name + ''' +
                ", cust_profession='" + cust_profession + ''' +
                ", cust_phone='" + cust_phone + ''' +
                ", email='" + email + ''' +
                '}';
    }
}

4. 创建Mybatis核心配置文件SqlMappingConfig.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="development">
        <environment id="development">
            <!--使用jdbc事务管理-->
            <transactionManager type="JDBC"/>
            <!--配置数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/development"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

5. 创建与表对象的关系映射Mapping文件编写sql语句

<?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="myTest">
    <!--根据id查找用户-->
    <select id="queryCustomerById" parameterType="Integer" resultType="demo1.Customer">
        SELECT * FROM customer WHERE cust_id=#{cust_id}
    </select>
</mapper>

6. 在核心配置文件中引入Mapping

<?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">
            <!--使用jdbc事务管理-->
            <transactionManager type="JDBC"/>
            <!--配置数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/development"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载映射文件-->
    <mappers>
        <mapper resource="demo1/Mapping"/>
    </mappers>
</configuration>

图片4.png

7. 创建工厂,执行sql语句

@Test
public void test() throws IOException {
     // 1、创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    //2、加载SqlMappingConfig配置文件
    InputStream resourceAsStream = Resources.getResourceAsStream("SqlMappingConfig");
    //3、创建SqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
    //4、创建SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //5、执行sql查询
    //第一个参数queryCustomerById为Mapping.xml的statement的id
    //第二个参数1为执行sql需要的参数
    Customer customer = sqlSession.selectOne("queryCustomerById", 1);
    //6、打印结果
    System.out.println(customer);
    //7、关闭连接,释放资源
    sqlSession.close();
}

运行结果

图片3.png

Mybatis核心Api

1. SqlSessionFactoryBuilder

SqlSessionFactoryBuilder用于创建SqlSessionFactory;SqlSessionFactory一旦创建完成就不需要SqlSessionFactoryBuilder了;由于SqlSession是通过SqlSessionFactory创建的,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量

2. SqlSessionFactory

创建SqlSessionFactory的工厂,是一个接口;接口中定义了openSession的不同重载方法;SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。

3. SqlSession

连接到数据库的一个会话;SqlSession中定义了数据库的操作方法;每个线程都应该有它自己的SqlSession实例;SqlSession实例不能共享使用,它也是线程不安全的。所以最佳的使用范围是请求或方法范围,注意:绝对不能将SqlSession实例的引用放到一个类的静态字段或实例字段中

图片5.png

Mybatis架构图