亲宝软件园·资讯

展开

MyBatis数据持久化框架

人气:0

一、MyBatis是什么

1.1、概述

Mybatis是一个优秀的开源、轻量级持久层框架,它对JDBC操作数据库的过程进行封装,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,使开发者只需要关注sql本身。

我们原来使用JDBC操作数据库,需要手动的写代码去注册驱动、获取connection、获取statement等等,现在Mybaits帮助我们把这些事情做了,我们只需要关注我们的业务sql即可,这样可以提高我们的开发效率。

MyBatis属于半自动的ORM框架

MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立mapping映射关系,是一种半自动化的 ORM 实现。其封装性低于 Hibernate,但性能优秀、小巧、简单易学、应用广泛。

1.2、什么是持久化

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。

1.3、什么是ORM

ORM(Object Relational Mapping,对象关系映射)是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过 JavaBean 对象去操作数据库表中的数据。

1.4、MyBatis主要内容

MyBatis 前身为 iBatis,2002 年由 Clinton Begin 发布。2010 年从 Apache 迁移到 Google,并改名为 MyBatis,2013 年又迁移到了 Github。

MyBatis 的主要思想是将程序中的大量 SQL 语句剥离出来,使用 XML 文件或注解的方式实现 SQL 的灵活配置,将 SQL 语句与程序代码分离,在不修改程序代码的情况下,直接在配置文件中修改 SQL 语句。MyBatis与其它持久性框架最大的不同是,MyBatis 强调使用 SQL,而其它框架(例如 Hibernate)通常使用自定义查询语言,即 HQL(Hibernate查询语言)或EJB QL(Enterprise JavaBeans查询语言)。

1.5、优点

MyBatis是免费且开源的。

与 JDBC 相比,减少了 50% 以上的代码量。

MyBatis是最简单的持久化框架,体积小巧并且学习门槛低。

MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于同一管理和优化,提高了代码的可重用性。

提供 XML 标签,支持编写动态 SQL语句。

提供映射标签,支持实体对象与数据库的表字段关系映射。

1.6、缺点

编写 SQL语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

二、MyBatis架构

2.1、mybatis所依赖的jar包

lib 文件夹下的 jar 文件是 MyBatis的依赖包(mybatis-3.5.10.jar是MyBatis的核心包)

将需要的核心包全部添加进项目构建路径中

2.2、MyBatis准备工作

①创建数据库表结构

②创建实体类

在 src 目录下创建一个名为com.my.entity 的包,在该包中创建实体类 Website。

package com.my.entity;
 
import java.util.Date;
 
//网站信息实体类
public class Website {
    private int id;
    private String name;
    private String url;
    private int age;
    private String country;
    private Date createtime;
    
    @Override
    public String toString() {
        return "Website [id=" + id + ", name=" + name + ", url=" + url + ", age=" + age + ", country=" + country
                + ", createtime=" + createtime + "]";
    }
 
    
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public Date getCreatetime() {
        return createtime;
    }
    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
    
    
}

注意:在类中声明的属性名称与数据表 website 的字段名称,保持完全一致。

③ SQL映射文件(在 src 目录下创建 com.my.mapper 包,在该包下创建映射文件 WebsiteMapper.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">
 
<!-- SQL映射文件:配置执行的SQL语句 -->
<mapper namespace="com.my.mapper.WebsiteMapper">
        <!-- 添加操作的SQL映射 -->
        <insert id = "insertNewWebsite"  parameterType="com.my.entity.Website">
            insert into website(name,url,age,country)values(#{name},#{url},#{age},#{country})
        </insert>
          <!-- 查询所有网站信息 -->
          <select id="selectWebsiteList"   resultType="com.my.entity.Website">
                  select * from website
          </select>
</mapper>

上述代码中,<mapper> 元素是配置文件的根元素,它包含了 namespace属性,该属性值通常设置为“包名+SQL映射文件名”,用于指定唯一的命名空间。
子元素 <select>、<insert> 中的信息用于执行查询、添加操作。

在定义的 SQL语句中,“#{}”表示一个占位符,相当于“?”,而“#{name}”表示该占位符用于接收参数中的名称为 name的参数值。

④核心配置文件

MyBatis 核心配置文件主要用于配置数据库连接和 MyBatis运行时所需的各种特性,包含了设置和影响 MyBatis 行为的属性。

在 src 目录下创建 MyBatis的核心配置文件 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>
      <!-- 框架参数 -->
    <settings>
      <!-- 配置日志为LOG4J -->  
      <setting name="logImpl" value="LOG4J" />
    </settings>
  
    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用JDBC的事务管理 -->
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <!-- MySQL数据库驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <!-- 连接数据库的URL -->
                <property name="url"
                    value="jdbc:mysql://localhost:3306/my_bank?charset=utf8mb4&amp;useSSL=false&amp;useTimezone=true&amp;serverTimezone=GMT%2B8" />
                <property name="username" value="xxxx" />
                <property name="password" value="xxxxxx" />
            </dataSource>
        </environment>
    </environments>
  
    <!-- 将mapper文件加入到配置文件中 -->
    <mappers>
        <mapper resource="com/my/mapper/EarthquakeMapper.xml" />
    </mappers>
</configuration>

⑤日志文件

 MyBatis 默认使用 log4j 输出日志信息,如果开发者需要查看控制台输出的 SQL 语句,可以在 classpath 路径下配置其日志文件。在 mybatisDemo 的 src 目录下创建 log4j.properties 文件

# Global logging configuration
log4j.rootLogger=ERROR,stdout
 
# MyBatis logging configuration...
log4j.logger.com.apesource=DEBUG
 
# 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

三、MyBatis 核心对象

MyBatis 的核心接口和类包括:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。

使用步骤:

1首先,获取 SqlSessionFactoryBuilder对象,可以根据 XML 配置文件或者 Configuration 类的实例构建该对象。

2其次,通过 SqlSessionFactoryBuilder对象来获取 SqlSessionFactory 对象。

3最后,获取 SqlSessionFactory 对象之后,就可以进一步获取 SqlSession 实例。SqlSession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法,用该实例可以直接执行已映射的 SQL 语句。

核心对象的生命周期和作用域

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例。

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是"应用作用域"。即随着应用程序的生命周期一直存在。这种“存在于整个应用运行期间,并且只存在一个对象实例”。例如使用单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

将其代入实例中封装为MyBatis工具类和实

工具类

package com.my.dao;
 
import java.io.IOException;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 
public class MybatisDBUtils {
    private static SqlSessionFactory factory = null;
    static {
        try {
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static SqlSession getSqlSession() {
        SqlSession session = null;
        if(factory != null) {
            session = factory.openSession();
        }
        return session;
    }
 
}

实现类

public class Test04 {
    public static void main(String[] args) {
        //每1000条执行一次批处理,并获取主键回填
        try (SqlSession sqlSession = MybatisDBUtils.getBatchSqlSession()) {
            WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class);
            
            for(int i = 1;i <= 10;i++) {
              Website website = new Website("神码搜索","www.shenma.com",((int)(Math.random()*10)),"CN");
        }
    }
}

加载全部内容

相关教程
猜你喜欢
用户评论