关于mybatis:MyBatis框架

7次阅读

共计 3470 个字符,预计需要花费 9 分钟才能阅读完成。

MyBatis 简介

MyBatis 是一个优良的长久层框架,它对 jdbc 的操作数据库的过程进行封装,使开发者只须要关注 SQL 自身,而不须要破费精力去解决例如注册驱动、创立 connection、创立 statement、手动设置参数、后果集检索等 jdbc 繁冗的过程代码。
Mybatis 通过 xml 或注解的形式将要执行的各 statement(statement、preparedStatemnt)配置起来,并通过 java 对象和 statement 中的 sql 进行映射生成最终执行的 sql 语句,最初由 mybatis 框架执行 sql 并将后果映射成 java 对象并返回。
总之,Mybatis 对 JDBC 拜访数据库的过程进行了封装,简化了 JDBC 代码,解决 JDBC 将后果集封装为 Java 对象的麻烦。

MyBatis 的劣势

1. 应用传统形式拜访数据库

(1)应用 JDBC 拜访数据库有大量反复代码
(2)JDBC 本身没有连接池,会繁琐的创立连贯和敞开连贯,效率低
(3)SQL 是写死在程序中,一旦批改 SQL,须要对类进行从新编译
(4) 对查问 SQL 执行后返回的 ResultSet 对象,须要手动解决,有时会特地麻烦

2. 应用 MyBatis 框架拜访数据库

(1)MyBatis 对 JDBC 进行了封装,能够简化 JDBC 代码
(2)MyBatis 本身反对连接池(也能够配置其余的连接池),因而能够进步程序的效率
(3)MyBatis 是将 SQL 配置在 mapper 文件中,批改 SQL 只是批改配置文件,类不要编译
(4) 对查问 SQL 执行后返回的 ResultSet 对象,MyBatis 会帮咱们解决,转换成 Java 对象
总之,JDBC 中的所有问题在 MyBatis 框架中简直失去了解决!

MyBatis 架构图剖析

Mybatis 架构图:

(1)mybatis-config.xml 是 MyBatis 的外围配置文件,通过其中的配置能够生成 SqlSessionFactory,也就是 SqlSession 工厂
(2) 基于 SqlSessionFactory 能够生成 SqlSession 对象
(3)SqlSeesion 是个既能够发送 SQL 去执行,并返回后果,相似于 JDBC 中的 Connerction 对象,也就是 MyBatis 中至关重要的一个对象
(4)Executor 是 SqlSession 底层的对象,用于执行 SQL 语句
(5)MapperStatement 对象也是 SqlSession 底层的对象那个,用于接管输出映射(SQL 语句中的参数),以及做输入映射(即 SQL 查问的后果映射成相应的后果)

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">

<!– MyBatis 的全局配置文件 –>
<configuration >

<!-- 1. 配置环境,可配置多个环境(比方:develop 开发、test 测试)-->
<environments default="develop">
    <environment id="develop">
        
        <!-- 1.1. 配置事务管理形式:JDBC/MANAGED
        JDBC:将事务交给 JDBC 治理(举荐)MANAGED:本人治理事务
          -->
        <transactionManager type="JDBC"></transactionManager>
        
        <!-- 1.2. 配置数据源,即连接池 JNDI/POOLED/UNPOOLED
            JNDI:已过期
            POOLED:应用连接池(举荐)UNPOOLED:不应用连接池
         -->
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/yonghedb?characterEncoding=utf-8"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
        </dataSource>
    </environment>
</environments>

<!-- 2. 导入 Mapper 配置文件,如果 mapper 文件有多个,能够通过多个 mapper 标签导入 -->
<mappers>
    <mapper resource="EmpMapper.xml"/>
</mappers>

</configuration>`

MyBatis 中的占位符

在增删改查操作中,SQL 语句中的值是写死在 SQL 语句中,而理论开发中,次处的值往往是用户提交过去的值,因而这里咱们须要将 SQL 中写死的值替换为占位符。
在 mybatis 中占位符有两个,别离是 #{}占位符和 ${}占位符:

**#{}:相当于 JDBC 的问号 (?) 占位符,是为 SQL 语句中的参数进行占位,大部分状况都是应用 #{}占位符;并且#{}占位符是为字符串或者日期类型的值进行占位时,在参数值传过来替换占位符的同时,会进行本义解决 (在字符串或日期类型的值的两边加上单引号);
${}:** 是为 SQL 片段(字符串) 进行展位,将传过来的 SQL 片段间接拼接 ** 在 ${}占位符所在的地位,不会进行任何的转移操作。(因为是间接将参数拼接在 SQL 语句中,因而可能会引发 SQL 注入攻打问题.
须要留神的是:应用 ${}占位符为 SQL 语句中的片段占位时,即便只有一个占位符,须要传的也只有一个参数,也须要将参数进行封装在传递!**

Mapper 接口开发

(一)为什么要应用 Mapper 接口开发?

1. 在测试用例中,在调用 Session 的办法时候,都会传入要调用的 SQL 的 namespace+id 名称,这不是必须的,能够只传入 id 即可。然而如果在 Mybatis 的环境中有多个雷同 id 的映射名称,就会报错,所以,个别状况下,调用办法最好还是应用 namespace+id。
2. 然而,namespace+id 的应用形式很容易报错,因为 String 类型的,没有查看。所以 mybatis 提供了一种十分好的设计形式来防止这种问题,即 Mapper 接口。
** 接口的开发标准:namespace 的值 = 接口的包名 + 类名
留神:**
*1、包名 + 类名 =xxxMapper.xml 中的 namespace 的值
2、接口中办法名 =mapper.xml 中具体的 SQL 语句定义的值
3、办法的返回值和参数要和映射文件中统一(当数据库的字段名和对象的属性名统一时,能够简略属性 resultType。然而数据库中的字段名称和对象中的属性名称不统一时,就须要 resultMap 属性)*

 public List<User>  all();    // 这是接口中的办法

(二)MyBatis 怎么做的?

@Test
 public void testMapper(){SqlSession session = MyBatisUtil.openSession();
      try{UserMapper mapper = session.getMapper(UserMapper.class);     System.out.println(mapper.getClass().getName());
      }finally{session.close();
      }
 }

打印后果:$Proxy4
很简略,mybatis 为接口做了一个动静代理。在执行 UserMapper 接口下面的办法时,参考接口的群路径名,即可找到对应的 UserMapper.xml,在执行接口下面的每一个参数的时候,实际上就是执行 namespace+id,mybatis 在依据定义的办法的元素,抉择调用适合的 session 的办法来执行,并传入参数就能够。
应用 Mapper 接口的形式,在 Spring+MyBatis 也十分不便。因为咱们能够间接把 Mapper 接口看成 dao 接口了。

(三)接口开发的三个特点

1、Mapper 接口的办法名和 mapper.xml 中定义 sql 的 id 值雷同
2、Mapper 接口的办法接口的参数类型和 mapper.xml 定义的 sql 的 parameterType 类型雷同
3、Mapper 接口办法的返回值类型和 mapper.xml 中定义的 sql 的 resultType 的类型雷同

正文完
 0