ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MyBatis

2021-01-28 09:03:41  阅读:190  来源: 互联网

标签:配置文件 作用域 创建 mybatis SqlSession SQL MyBatis


MyBatis 学习笔记

简介

什么是Mybatis

MyBatis 是一款优秀的持久层框架,是Apache的一个Java开源项目 ,它支持自定义 SQL、存储过程以及高级映射, 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO为数据库中的记录。

  • 原名 iBatis,在由 Apache 迁移到了谷歌,更名为 MyBatis。因此,MyBatis 指的就是 iBatis 3.x 后的版本
  • 采用 ORM(Object Relational Mapping,对象关系映射)思想实现的持久化层框架。而之前学习的 JDBC 只是一种规范,JdbcTemplate 和 DBUtil 都是简单封装了 JDBC 的工具类

Mybatis和Hibernate的关联

  1. Hibernate是全自动全映射的ORM框架,使用HQL来定制SQL;而Mybatis是半自动的
  2. Hibernate会自动映射对象属性和数据库字段,自动生产SQL语句,供直接调用,但同样因为此,Hibernate难以优化SQL,且学习HQL的成本较高
  3. Mybatis以配置文件或注解的方式编写SQL,仅封装了预编译、设置参数、执行SQL、封装结果等操作, 只需要掌握 SQL 和 MyBatis 相关配置就可以使用,学习成本相对更低

入门

安装

目前Mybatis能够在githup上直接下载

https://github.com/mybatis/mybatis-3/releases

要使用Mybatis只需要将 mybatis-xxx.jar 文件置于类路径(classpath)中即可。

maven依赖如下(除了mybatis外,还需要导入和数据库版本适配的驱动包)

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

<!-- database connector  -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

构建全局配置文件

创建 mybatis-config.xml 配置文件,一般直接置于resource目录下。

该文件包含了对Mybatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)、决定事务作用域和控制方式的事务管理器(TransactionManager)。

首先简单配置如下:

<?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>
    <!-- 和spring整合后 environments配置将废除 -->
    <!--环境配置,可以配置多个,根据id选择默认环境 -->
  <environments default="development">
    <environment id="development">
        <!-- 使用JDBC事务管理 -->
      <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>
    <!-- 配置文件映射,指定配置文件的位置,每个mapper都需要在核心配置文件中注册后才可使用 -->
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>
  • environment 元素体中包含了事务管理和连接池的配置
  • mappers元素则包含了一组映射器(mapper),这些映射器的 XML文件包含了SQL代码和映射定义信息

通过配置文件构建Utils类

每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为核心的。
而SqlSessionFactory的实例则可以通过SqlSessionFactoryBuilder获得。
而SqlSessionFactoryBuilder则可以从XML配置文件中构建

示例代码如下:

public class MybatisUtils {
    // 声明静态属性
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            // 获取核心配置文件路径
            String resource = "mybatis-config.xml";
            // 封装为字节流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 创建根据核心文件创建对象
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取SqlSession对象
     */
    public static SqlSession getSqlSession() {
       	// 根据工厂类创建SqlSession对象并返回
        return sqlSessionFactory.openSession();
    }

创建测试类

创建POJO对象

public class User {
    private int id;
    private String name;
    private String pwd;
    
    /**
    *  加上对应的构造方法、getters&setters、toString()
    */
}

创建持久层接口

public interface UserMapper {
    User getUserById(int id);
}

创建对应的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">
<!-- namespace 命名空间,绑定一个对应的 Mapper 接口,且为全限定类名 -->
<mapper namespace="com.kuang.dao.UserMapper">
	<!-- id 为指定接口的方法,parameterType为传入参数类型,resultType为返回值类型 -->
    <select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User">
        select * from user user where id = #{id}
    </select>
    
</mapper>

在核心配置文件中注册

<mappers>
    <mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>

测试

使用Junit进行测试

@Test
public void test3() {
    // 调用自己编写的工具类获取SqlSession对象
	SqlSession sqlSession = MybatisUtils.getSqlSession();
    // 传入接口的字节码文件,创建代理对象
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
	// 执行方法,并传入参数
    User u = userMapper.getUserById(1);
	// 打印
    System.out.println(u);
    // 释放资源
    sqlSession.close();
}

详解

具体步骤如下:

  1. 通过字节流加载 核心配置文件(即 mybatis-config.xml)
  2. 使用SqlSessionFactoryBuilder读取输入流,并创建处SqlSessionFactory
  3. 使用SqlSessionFactory创建SqlSession
  4. 使用SqlSession创建代理对象(即 mapper)
  5. 通过代理对象调用方法并获取查询结果
  6. 释放资源

和传统JDBC写法比较

MyBatis JDBC
连接池技术管理 手动地、频繁地创建和释放连接,浪费系统资源
SQL和代码分离,易于维护 SQL经常变动,字符串拼接繁琐且容易出错
自动将java对象映射到sql语句,自动实现结果封装 SQL语句的set内容、where条件都不一定,参数个数不明确,十分麻烦,且需要手动遍历封装

作用域和生命周期

SqlSessionFactoryBuilder

  • 这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory后就不需要它了
  • 最佳作用域是方法作用域(局部方法作用域)
  • 没必要长期保留该对象,以保证所有的XML解析资源可以被释放

SqlSessionFactory

  • 一旦被创建就应该在应用运行期间一直存在,不应该重复创建
  • 最佳作用域是应用作用域,可使用单例模式或静态单例模式创造

SqlSession

  • SqlSession的实例不是线程安全的,因此不能共享,即每个线程都应该有一个它自己的SqlSession实例
  • 它的最佳作用域是请求或方法作用域,绝不能将SqlSession实例的引用放在一个类的静态域或实例变量
  • 对SqlSession的关闭很重要,应该把关闭操作放到 finally块中,或者使用 try-with-source 方法获取

映射器实例

  • 映射器是一些绑定映射语句的接口,接口实例从SqlSession中获得

  • 合适的作用域是方法作用域,即映射器应该在调用它们的方法中被获取,使用完毕后即丢弃

标签:配置文件,作用域,创建,mybatis,SqlSession,SQL,MyBatis
来源: https://www.cnblogs.com/zhaochuming/p/14337952.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有