MyBatis(1)-- MyBatis介绍

  一、MyBatis优点

  • 不屏蔽SQL,意味着可以更为精确地定位SQL语句,可以对其进行优化和改造,这有利于互联网系统性能的提高,符合互联网需要性能优化的特点。
  • 提供强大、灵活的映射机制,方便Java开发者使用。提供动态SQL的功能,允许我们根据不同条件组装SQL,这个功能远比其他工具或者Java编码的可读性和可维护性高得多,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要求。
  • 在MyBatis中,提供了使用Mapper的接口编程,只要一个接口和一个XML就能创建映射器,进一步简化我们的工作,使得很多框架API在MyBatis中消失,开发者能更集中于业务逻辑。

  

  二、MyBatis核心组件

  

  • SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder模式
  • SqlSessionFactory(工厂接口):依靠它来生成SqlSession,使用的是工厂模式。
  • SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。一般使用MyBatis提供的SQL Mapper接口编程技术,能提高代码的可读性和可维护性。
  • SQL Mapper(映射器):由一个Java接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果。

  三、MyBatis运行流程图

  

  四、搭建MyBatis开发环境

  1.新建MySQL表

mysql> select * from t_role;+----+-------------+--------+| id | role_name   | note   |+----+-------------+--------+|  1 | role_name_1 | note_1 |+----+-------------+--------+1 row in set (0.00 sec)

  2.文件布局

  

  3.SQLSessionFactory(工厂接口)

  构建SQLSessionFactory有两种方法:使用XML构建SqlSessionFactory;使用Java代码构建SqlSessionFactory

  (1)使用XML构建SqlSessionFactory

    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>
  <typeAliases><!-- 别名 -->
      <typeAlias alias="role" type="com.mybatis.pojo.Role"/>
  </typeAliases>
  <!-- 数据库环境 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test?useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="bjtungirc"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 映射文件 -->
  <mappers>
    <mapper resource="com/mybatis/mapper/RoleMapper.xml"/>
    <mapper class="com.mybatis.mapper.RoleMapper2"/>
  </mappers>
</configuration>

  基础配置文件的作用是配置一些最基本的上下文参数和运行环境。

  • <typeAliases>元素定义了一个别名role,它代表着com.mybatis.pojo.Role这个类。这样定义后,就可以在MyBatis上下文中使用别名role去代替全限定名com.mybatis.pojo.Role了。
  • <environments>用来定义数据库环境。<transactionManager>配置事务管理器为JDBC方式,<dataSource>用来配置数据库,其中type="POOLED"代表采用MyBatis内部提供的连接池方式。
  • <mapper>元素代表引入的那些映射器。

  有了基础配置文件,就可以用一段很简短的代码生成SqlSessionFactory了。

  即首先读取mybatis-config.xml,然后通过SqlSessionFactoryBuilder的build方法启用创建SqlSessionFactory。

  采用XML创建的形式,信息在配置文件中,有利于我们日后的维护和修改,避免了重新编译代码,因此推荐这种方式创建SqlSessionFactory。

    // 使用XML构建SQLSessionFactory
    public static SqlSessionFactory getSqlSessionFactory() {
        synchronized (LOCK) {
            if (sqlSessionFactory != null) {
                return sqlSessionFactory;
            }
            String resource = "mybatis-config.xml";
            InputStream inputStream;
            try {
                inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return sqlSessionFactory;
        }
    }

  (2)使用Java代码构建SqlSessionFactory

  使用Java代码创建SqlSessionFactory的代码冗长,如果发生系统修改,那么有可能需要重新编译代码带能继续,所以这不是一个很好的方式。除非有特殊的需求,比如在配置文件中,需要配置加密过的数据库用户名和密码,需要我们在生成SqlSessionFactory前解密为明文的时候,才会考虑使用这种方式。

    // 使用代码创建SQLSessionFactory
    public static SqlSessionFactory getSqlSessionFactory2() {
        synchronized (LOCK) {
            // 数据库连接池信息
            PooledDataSource dataSource = new PooledDataSource();
            dataSource.setDriver("com.mysql.jdbc.Driver");
            dataSource.setUsername("root");
            dataSource.setPassword("bjtungirc");
            dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_test?useSSL=false");
            dataSource.setDefaultAutoCommit(false);
            // 采用MyBatis的JDBC事务方式
            TransactionFactory transactionFactory = new JdbcTransactionFactory();
            Environment environment = new Environment("development", transactionFactory, dataSource);
            // 创建Configuration对象
            Configuration configuration = new Configuration(environment);
            // 注册一个MyBatis上下文别名
            configuration.getTypeAliasRegistry().registerAlias("role", Role.class);
            // 加入一个映射器
            configuration.addMapper(RoleMapper.class);
            configuration.addMapper(RoleMapper2.class);
            // 使用SQLSessionFactoryBuilder构建sqlSessionFactory
            sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(configuration);
            return sqlSessionFactory;
        }
    }

  (3)SqlSessionFactory作为一个单例

  SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为MyBatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个MyBatis的应用之中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不再使用MyBatis应用,所以可以认为SqlSessionFactory的生命周期就等同于MyBatis的应用周期。

  由于SqlSessionFactory是一个对数据库的连接池,所以它占据着数据库的连接资源,如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机的情况,所以在一般的应用中往往希望SqlSessionFactory作为一个单例,让它在应用中被共享。

package com.mybatis.utils;
public class SqlSessionFactoryUtils {

    private final static Class<SqlSessionFactoryUtils> LOCK = SqlSessionFactoryUtils.class;

    private static SqlSessionFactory sqlSessionFactory = null;

    private SqlSessionFactoryUtils() {
    }

    // 使用XML构建SQLSessionFactory
    public static SqlSessionFactory getSqlSessionFactory() {
        synchronized (LOCK) {
       ...         return sqlSessionFactory;
        }
    }

    // 使用代码创建SQLSessionFactory
    public static SqlSessionFactory getSqlSessionFactory2() {
        synchronized (LOCK) {
            // 数据库连接池信息
       ...return sqlSessionFactory;
        }
    }

    public static SqlSession openSqlSession() {
        if (sqlSessionFactory == null) {
            getSqlSessionFactory();
        }
        return sqlSessionFactory.openSession();
    }
}

  SqlSessionFactoryUtils的构造方法中加入了private关键字,使得其他代码不能通过new的方式来创建它。同时加入synchronized关键字加锁,主要是为了防止在多线程中多次实例化SqlSessionFactory对象,从而保证SqlSessionFactory的唯一性。而openSqlSession方法使用迭代来创建SqlSession对象。

  4.SQLSession(会话)

  在MyBatis中有两个实现类,DefaultSqlSession和SqlSessionManager。其中DefaultSqlSession是单线程使用的,而SqlSessionManager是在多线程环境下使用。SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用。它的作用有三个:获取Mapper接口--发送SQL给数据库--控制数据库事务

    private static void testRoleMapper() {
        Logger log = Logger.getLogger(Main.class);
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionFactoryUtils.openSqlSession();
            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Role role = roleMapper.getRole(1L);
            log.info(role.getRoleName());
        } finally {
            // 在finally语句中确保资源被顺利关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

  有了映射器就可以通过SqlSession发送SQL了,有两种方式:一种是通过SqlSession直接发送,另外一种是通过SqlSession获取Mapper接口再发送。

  (1)使用SqlSession直接发送

Role role = (role)sqlSession.selectOne("com.mybatis.mapper.RoleMapper.getRole", 1L);

  selectOne方法表示使用查询并且只返回一个对象,而参数则是一个String对象和一个Object对象。

  (2)使用SqlSession获取Mapper接口再发送

            RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
            Role role = roleMapper.getRole(1L);

  通过SqlSession的getMapper方法来获取一个Mapper接口,就可以调用它的方法了。

  使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高可读性,更能体现业务的逻辑,因此推荐这种方式。

  5.SQL Mapper(映射器)

  映射器是MyBatis中最重要、最复杂的组件,它由一个接口和对应的XML文件(或注解组成)。可以配置下列内容:

  • 描述映射规则
  • 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息
  • 配置缓存
  • 提供动态SQL

  实现映射器有两种方式,即XML文件形式和注解形式。首先定义一个POJO,

package com.mybatis.pojo;

public class Role {

    private Long id;
    private String roleName;
    private String note;

    /** setter and getter **}

  映射器的主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,并定义一些关于缓存等的重要内容。

  而映射器的只是一个接口类,为什么不是实现类,这是因为MyBatis运用了动态代理技术使得接口能够运行起来,MyBatis会为这个接口生成一个代理对象,代理对象回去处理相关的逻辑。

  (1)使用XML实现映射器

    使用XML实现映射器分为两个部分:接口+XML.

package com.mybatis.mapper;import com.mybatis.pojo.Role;

public interface RoleMapper {public Role getRole(Long id);
}

  在使用XML方式创建SqlSessionFactory的配置文件mybatis-config.xml中使用下面的代码引入一个XML文件,

<mapper resource="com/mybatis/mapper/RoleMapper.xml"/>

  在使用Java代码创建SqlSessionFactory的时候,使用下面的语句注册一个mapper

configuration.addMapper(RoleMapper.class);

  RoleMapper.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="com.mybatis.mapper.RoleMapper">

    <select id="getRole" parameterType="long" resultType="role">
        select id,
        role_name as roleName, note from t_role where id = #{id}
    </select>

</mapper>

  其中namespace所对应的是一个接口的全限定名,<select>元素表明这是一条查询语句,而属性id标识了这条SQL,parameterType="long"说明传递给SQL的是一个long型的参数,而resultType="role"说明返回的是一个role类型的返回值,这里的role是mybatis-config.xml中配置的别名,语句中的#{id}表示传递进去的参数。

  (2)使用注解实现映射器

package com.mybatis.mapper;

import org.apache.ibatis.annotations.Select;

import com.mybatis.pojo.Role;

public interface RoleMapper2 {

    @Select("select id, role_name as roleName, note from t_role where id=#{id}")
    public Role getRole(Long id);
}

  在使用XML方式创建SqlSessionFactory的配置文件mybatis-config.xml中使用下面的代码引入一个Class文件,

<mapper class="com.mybatis.mapper.RoleMapper2"/> 

  在使用Java代码创建SqlSessionFactory的时候,使用下面的语句注册一个mapper

configuration.addMapper(RoleMapper2.class);

  6.日志输出环境配置文件log4j.properties

log4j.rootLogger=DEBUG , stdout
log4j.logger.org.mybatis=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n

  配置信息:日志输出级别为DEBUG,并且输出端载体是ConsoleAppender即控制台类型,且输出端载体的界面布局为自定义布局,最后一行是布局的自定义格式。

  

原文地址:https://www.cnblogs.com/BigJunOba/p/9755681.html

时间: 2024-11-14 11:57:22

MyBatis(1)-- MyBatis介绍的相关文章

java 学习笔记--mybatis 三剑客(mybatis)

Java项目中使用Mybatis入门程序 wanna 关注 2017.03.23 14:33* 字数 270 阅读 1243评论 0喜欢 5 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. 欢迎访问本人博客:http://wangnan.tech 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis github https://github.com/mybatis/mybatis-3 MyBa

【Mybatis】MyBatis之Sql配置文件的使用(四)

上一章[Mybatis]MyBatis对表执行CRUD操作(三),已经讲了基本操作,本章介绍Sql配置文件中常用功能 1.插入返回主键 2.参数值的获取方式 3.resultMap使用 插入返回主键 在实际项目中,插入一条数据,id是数据库自动生成的,但是我们插入完数据,往往需要返回数据的id进行使用. 1.在EmployeeMapper.xml映射文件中加入2条sql 1 <!-- parameterType 可写可不写 --> 2 <insert id="insertEmp

【MyBatis】MyBatis之配置讲解

1,MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录. 2,搭建MyBatis框架 首先就是导入MyBatis.jar的jar包,然后把jar包和数据库连接的包放置到项目的lib目录

【mybatis】mybatis数据源源码剖析(JNDI、POOLED、UNPOOLED)

一.概述 二.创建 mybatis数据源的创建过程稍微有些曲折. 1. 数据源的创建过程: 2. mybatis支持哪些数据源,也就是dataSource标签的type属性可以写哪些合法的参数? 弄清楚这些问题,对mybatis的整个解析流程就清楚了,同理可以应用于任何一个配置上的解析上. 从SqlSessionFactoryBuilder开始追溯DataSource的创建.SqlSessionFactoryBuilder中9个构造方法,其中字符流4个构造方法一一对应字节流4个构造方法,都是将m

Hello Mybatis 02 mybatis generator

接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个表blog 1 CREATE TABLE `blog`.`blog` ( 2 `b_id` INT NOT NULL, 3 `b_title` VARCHAR(45) NULL, 4 `b_content` VARCHAR(255) NULL, 5 `user_id` INT NULL, 6 PRI

MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.

MyBatis之MyBatis环境搭建

MyBatis之MyBatis环境搭建 一.MyBatis开发环境搭建 1.引入Jar包 ①MyBatis mybatis-3.4.1.jar ant-1.9.6.jar ant-launcher-1.9.6.jar asm-5.1.jar cglib-3.2.4.jar commons-logging-1.2.jar javassist-3.21.0-GA.jar log4j-1.2.17.jar log4j-api-2.3.jar log4j-core-2.3.jar ognl-3.1.12

Spring+MyBatis实践—MyBatis数据库访问

关于spring整合mybatis的工程配置,已经在Spring+MyBatis实践—工程配置中全部详细列出.在此,记录一下几种通过MyBatis访问数据库的方式. 通过sqlSessionTemplate来进行数据库访问. 通过Dao接口来进行数据库访问. 使用@Select注解形式访问数据库 1.在spring框架中使用mybatis来进行数据操作配置,参考Spring+MyBatis实践—工程配置的spring-datasources.xml文件. 2.Demo1—通过sqlSession

【Mybatis】Mybatis接口编程方式实现增删改查

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 前面一章[Mybatis]Mybatis入门概述及第一个Mybatis实例实现增删改查,已经搭建好了eclipse,mybatis,mysql的环境,并且实现了一个简单的查询.请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句: session.selectOne("com.mucfc.model.EmployeerMapper.findEmployeerByID&qu

【Mybatis】Mybatis入门——Mybatis简介

Mybatis概述 Mybatis是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架. 避免传统JDBC硬编码(将数据库连接信息以及数据库连接池等配置到了xml配置文件中) XML配置或注解 POJO对象和数据库记录直接映射 完善的文档支持 Mybatis前世今生 Apache开源项目:ibatis -ibatis是internet和abatis的组合,是一个基于javach持久层的框架. 2010年→apache software foundation → 迁移 → google co