MyBatis简单了解及使用

时间:2022-06-01 17:59:08

 

基本了解

什么是MyBatis?
        MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。        为了解决Hibernate的不足,一个半自动映射的框架MyBatis应运而生。
MyBatis做了什么?
        封装JDBC操作封装JDBC操作        利用反射打通Java类与SQL语句之间的相互转换
历史:
        Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 并且改名为Mybatis,2013年11月迁移到Github,目前mybaits是由Github维护的。
Mybatis的简单配置
    在新建的project的src目录下,新建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration SYSTEM "http://mybatis.org/dtd/mybatis-3-config.dtd" PUBLIC "-//mybatis.org//DTD Config 3.0//EN">
-<configuration>
-<settings>
<setting value="true" name="mapUnderscoreToCamelCase"/>
<setting value="true" name="lazyLoadingEnabled"/>
</settings>
-<typeAliases>
<typeAlias alias="Employee" type="com.test.entity.Employee"/>
<typeAlias alias="Customer" type="com.test.entity.Customer"/>
</typeAliases>
-<environments default="local">
-<environment id="local">
<transactionManager type="JDBC"/>
-<dataSource type="POOLED">
<property value="com.mysql.jdbc.Driver" name="driver"/>
<property value="jdbc:mysql://localhost:3306/orcl" name="url"/>
<property value="username" name="username"/>
<property value="password" name="password"/>
</dataSource>
</environment>
</environments>
-<mappers>
<mapper resource="com/test/data/employee-mapper.xml"/>
<mapper resource="com/test/data/customer-mapper.xml"/>
</mappers>
</configuration>
</textarea>


settings :定义mybatis的一些全局设置
typeAlias :定义java类型的别名
environments :主要用于配置数据源 
mappers :mapper文件用于定义sql语句,以及与其对应的entity 

Mybatis的使用
配置Maven,pom.xml
配置mybatis-config.xml文件。
创建出SqlSessionFactory(建造者模式,单例模式)
准备好实体类,mapper配置文件
可以在Service层写代码了

说到这里,应该提到MyBatis的逆向工程。逆向工程使用起来也极为简单。一共有三个文件。我会上传到资源里面去。

https://download.csdn.net/download/wuzhixiu007/10445170

逆向工程使用步骤:
1:修改generator.xml文件
2:在generator.xml文件路径中进入dos系统,
复制java -jar mybatis-generator-core-1.3.5.jar -configfile generator.xml –overwrite
回车。

Mybatis的框架

MyBatis简单了解及使用

在框架支撑层还有事务控制和缓存机制,这里就不多做赘述了。

Mybatis的核心组件

SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能;
Executor:MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护;
StatementHandler:封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合;
ParameterHandler:负责对用户传递的参数转换成JDBC Statement 所需要的参数;
ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换;
MappedStatement:MappedStatement维护了一条<select|update|delete|insert>节点的封装, 
SqlSource:负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回。
BoundSql:表示动态生成的SQL语句以及相应的参数信息;

Configuration:MyBatis所有的配置信息都维持在Configuration对象之中。

Mybatis的优劣

优点:
1. 与JDBC相比,减少了50%以上的代码量。
2. MyBatis是最简单的持久化框架,小巧并且简单易学。
3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。
4. 提供XML标签,支持编写动态SQL语句。
5. 提供映射标签,支持对象与数据库的ORM字段关系映射。
缺点:
1. SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

总结起来
优点:封装少,高性能,易维护,可优化,小巧简单。

缺点:依赖数据库,工作量略大。

FAQ

1. #{} 和${}的区别?

    #{}是预编译处理,${}是字符串替换。
    Mybatis在处理#{}时,会将sql中的#{}替换为?号;
     Mybatis在处理${}时,就是把${}替换成变量的值。 
    使用#{}可以有效的防止SQL注入,提高系统安全性。

2.mapper中如何传递多个参数?

    使用 @param 注解。

3.当实体类中的属性名和表中的字段名不一样?

     通过在查询的sql语句中定义字段名的别名

     通过<resultMap>来映射字段名和实体类属性名的一一对应的关系

4.如何执行批量操作?

以删除为例:

<delete id="removeBatch" parameterType="int"> 
delete from submit where submit_id IN 
<foreach collection="array" index="index" item="item" open="(" separator="," close=")"> 
	#{item} 

</foreach> 

item:集合中每一个元素进行迭代时的别名。
index:指定一个名字,用于表示每次迭代过程中,每次迭代到的位置。 
open:表示该语句以什么开始。
separator:每次进行迭代的分隔符。
close:表示以什么结束。

collection属性的值必须指定: 
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list;
2.如果传入的是单参数且参数类型是一个array数组的时候,collection属性值为array; 
3.如果传入多个参数,需要将其封装成一个Map。