java ORM之Mybatis

本文详细介绍了Mybatis的使用,包括传统JDBC的不足,ORM模型的概念,Mybatis的优势,以及Mybatis的基本构成。重点讲解了Mybatis的创建SqlSessionFactory的两种方式,如何创建SqlSession,配置映射器,以及Mybatis的快速入门和CRUD操作。还探讨了Mybatis的动态代理机制,mybatis-config.xml配置文件的关键部分,并提到了Spring与Mybatis的集成,包括配置SqlSessionFactory、Mapper以及事务管理。
摘要由CSDN通过智能技术生成

参考:

https://blog.csdn.net/hellozpc/article/details/80878563

《深入浅出Mybatis技术》

 

传统JDBC

Java程序都是通过JDBC(java data base connectivity)连接数据库的,这样我们可以通过SQL对数据库编程。比如下面的JDBC的一个demo:JDBCTest.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @author Evan
 */
public class JDBCTest {
    public static void main(String[] args) throws Exception {
        Connection connection = null;
        PreparedStatement prepareStatement = null;
        ResultSet rs = null;

        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获取连接
            String url = "jdbc:mysql://127.0.0.1:3306/ssmdemo?useSSL=false";
            String user = "root";
            String password = "123456";
            connection = DriverManager.getConnection(url, user, password);
            // 获取statement,preparedStatement
            String sql = "select * from tb_user where id=?";
            prepareStatement = connection.prepareStatement(sql);
            // 设置参数
            prepareStatement.setLong(1, 1l);
            // 执行查询
            rs = prepareStatement.executeQuery();
            // 处理结果集
            while (rs.next()) {
                System.out.println(rs.getString("user_name"));
                System.out.println(rs.getString("name"));
                System.out.println(rs.getInt("age"));
                System.out.println(rs.getDate("birthday"));
            }
        } finally {
            // 关闭连接,释放资源
            if (rs != null) {
                rs.close();
            }
            if (prepareStatement != null) {
                prepareStatement.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }
}

从上面的代码我们看出整个JDBC过程可以分为几步:
1、注册驱动和数据库信息。
2、操作Connection,打开Statement对象。
3、通过Statement执行SQL,返回结果ResultSet对象。
4、ResultSet读取数据,(如果需要,还要通过代码转化为具体的POJO对象)。
5、关闭数据库资源。
JDBC编程的使用给我们提供了连接数据库的功能,但是也存在着一些问题:
其一,工作量较大。
其二,我们要对JDBC编程可能产生的异常进行捕捉并正确关闭资源。

ORM模型

由于JDBC存在的缺陷,在实际工作中,我们很少使用JDBC编程,于是有了对象关系映射(Object Relational Mapping,简称ORM)。
ORM模型就是数据库的表和简单的java对象(Plain Ordinary Java Object,简称POJO)的映射关系,它主要解决数据库数据和POJO对象的相互映射。
ORM模型提供了统一的规则使得数据库的数据通过配置便可轻易映射到POJO上。

JAVA中比较常用的ORM框架有Hibernate、Mybatis。
Hibernate作为较为流行的Java ORM框架,是一个全表映射的模型,用户无需自己编写SQL,只需要使用HQL(Hibernate Query Language), 它确实编程容易,需要我们提供映射的规则,完全可以通过IDE生成。此外,它提供了缓存、日志、级联等强大的功能。但是Hibernate的缺陷也十分明显,多表关联复杂SQL,数据系统权限限制、根据条件变化的SQL,存储过程等场景使用Hibernate十分不便,而性能又难以通过SQL优化。所以Hibernate适用于场景不复杂,要求性能不苛刻的时候。
 

Mybatis是一个半自动映射的模型,需要用户自己编写SQL,虽然比Hibernate配置得多,但是它可以配置动态SQL,这就解决了Hibernate的表名根据时间变化,不同的条件下列名不一样的问题。用户可以优化SQL,通过配置决定SQL映射规则,也能支持存储过程,所以对于一些复杂的需要优化性能的SQL,它更加方便。Mybatis还具有自动映射的功能,在注意一些规则的基础上,Mybatis可以完成自动映射,而无需写任何的映射规则,这大大提供了开发效率和灵活性。

Mybatis 介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

Mybatis的基本构成

SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)。
SqlSessionFactory:依靠工厂来生成SqlSession(会话)。
SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper的接口。
SQL Mapper:它是由一个java接口和xml文件(或者注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

1、构建SqlSessionFactory

每个Mybatis的应用都是以SqlSessionFactory的实例为中心的。它可以通过SqlSessionFactoryBuilder获得。MyBatis提供了两种模式去创建SqlSessionFactory:
一是xml配置的方式。常用。
二是代码的方式。

需要注意的是SqlSessionFactory是一个工厂接口而不是实现类。在Mybatis中提供了两个SqlSessionFactory的实现类:DefaultSqlSessionFactory和SqlSessionManager。DefaultSqlSessionFactory常用。

1.1、通过xml方式创建SqlSessionFactory

这里我们需要配置一个简易的xml,包含获取数据库连接实例的数据源(datasource)、决定事务范围和控制方式的事务管理器(TransactionManager)和映射器(SQL Mapper)。

一个简单的xml示例:

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="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mappers/UserMapper.xml"/>
  </mappers>
</configuration>

对上面的配置做一下说明:

  • 上面的配置中,配置了环境内容,它默认使用id是development的环境配置:包含两方面信息:(1)采用JDBC的事务管理模式。(2)数据库的连接信息。
  • 配置了映射器。这里引入了一个xml:mappers/UserMapper.xml,它的作用是提供SQL和SQL对POJO的映射规则定义,Mybatis将解析这个xml,来为我们生成映射器。


下面我们用代码实现下通过这个xml来生成SqlSessionFactory:

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
  new SqlSessionFactoryBuilder().build(inputStream);

从xml构建SqlSessoinFactory非常简单。这里我们创建一个xml文件流,用SqlSessionFactoryBuilder读取xml的信息来创建SqlSession对象。

1.2、使用代码方式创建SqlSessionFactory

如果你喜欢直接从Java而不是XML构建配置,或者创建自己的配置构建器,MyBatis提供了一个完整的配置类Configuration(全限定名:org.apache.ibatis.session.Configuration),它提供了与XML文件相同的所有配置选项。

public static void main(String[] args) {
        //构建数据库连接池
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setDriver("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/sshdemo?useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");

        //构建事务方式
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment =
            new Environment("development", transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(UserMapper.class);
        SqlSessionFactory sqlSessionFactory =
            new SqlSessionFactoryBuilder().build(configuration);

    }


显然用代码方式和用xml方式只是换个方法实现而已,其本质并无不同。但是并不推荐这种方式来实现,因为修改环境的时候,我们需要重新编译代码,不利于维护。
注:在本例中,我们添加了一个mapper类UserMapper。Mapper类是包含SQL映射注释的java类。然而由于java注释的一些限制和Mybatis映射的复杂性,大多数高级映射仍然需要xml映射。由于这个原因,Mybatis将自动查找并加载一个存在的对等的xml文件(在本例中,根据UserMapper.class的类路径和名称加载UserMapper.xml)。

2、创建SqlSession
SqlSession也是一个接口类,Mybatis中它的接口实现类有两个,分别是DefaultSqlSession和SqlSessionManager。SqlSession接口类似于JDBC中的Connection对象,我们需要保证每次用完都关闭它。

        // 获取sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            User user = sqlSession.selectOne("UserMapper.selectUser", 1);
            System.out.println(user);
        } finally {
            sqlSession.close();
        }

SqlSession的用途有两个:
(1)获取映射器,让映射器通过命名空间和方法名(本例就是UserMapper.selectUser)找到对应的SQL,发送给数据库执行后返回结果。
(2)可以用它去执行sql返回结果,同时它也支持事务,通过commit、rollback方法提交或者回滚事务。

3、配置映射器。
映射器是由java接口和xml文件(或者注解)共同组成的,它的作用是:

  • 定义参数类型
  • 描述缓存
  • 描述sql语句
  • 定义查询结果和pojo的映射关系。

一个映射器的实现方式有两种,一种是通过xml文件方式实现,一种是通过代码方式实现。使用xml配置是Mybatis实现mapper的首选方式。它由一个java接口和一个xml组成。
java接口:
User.java

import java.text.SimpleDateFormat;
import java.util.Date;

public class User {
    private String id;
    private String userName;
    private String password;
    private String name;

    public String getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

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

}

UserMapper.xml

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:根标签,namespace:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="UserMapper">
    <!-- statement,内容:sql语句。id:唯一标识,随便写,在同一个命名空间下保持唯一
       resultType:sql语句查询结果集的封装类型,User即为数据库中的表
     -->
    <select id="selectUser" resultType="com.test.mybatis.User">
        select * from User where id = #{id}
    </select>
</mapper>


我们看一下上面的xml做了什么?
(1)首先这个文件我们在mybatis-config.xml的里面配置过的。
(2)定义了一个命名空间为UserMapper的sql mapper。
(3)用一个sql元素定义了一个查询sql,id为selectUser。

 

Mybatis quick Start

这节主要是入门,手把手的配置一个可以允许的实例。

1、数据准备。

创建数据库:CREATE DATABASE ssmdemo;

创建表:tb_user
DROP TABLE IF EXISTS tb_user;
CREATE TABLE tb_user (
id int(11) NOT NULL AUTO_INCREMENT,
user_name varchar(32) DEFAULT NULL,
password varchar(32) DEFAULT NULL,
name varchar(32) DEFAULT NULL,
age int(10) DEFAULT NULL,
sex int(2) DEFAULT NULL,
birthday date DEFAULT NULL,
created datetime DEFAULT NULL,
updated datetime DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据:

INSERT INTO ssmdemo.tb_user (user_name, password, name, age, sex, birthday, created, updated) VALUES ( 'test1', '123456','鹏程','22', '1', '1990-09-02', sysdate(), sysdate());

2、引入依赖:如果你使用Maven,只需将以下依赖项添加到pom.xml:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

3、从XML构建SqlSessionFactory

每个MyBatis应用程序都以SqlSessionFactory的一个实例为中心。可以使用SqlSessionFactoryBuilder获取SqlSessionFactory实例。SqlSessionFactoryBuilder可以从XML配置文件或配置类的自定义准备的实例构建SqlSessionFactory实例。

配置XML文件包含MyBatis系统核心的设置,包括用于获取数据库连接实例的数据源,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值