1、Mybatis介绍及其环境搭建
1.1 数据持久化概念
数据持久化是将内存中的数据模型转换成存储模型,以及将存储模型转换为内存中的数据模型的同统称。例如,文件的存储、数据的读取等都是数据持久化操作。数据模型可以是任何数据结构或者对象模型,存储模型可以是关系模型、xml、二进制流等。
1.2 Mybatis框架及orm
- Mybatis框架简介
Mybatis是一个开源的数据持久层框架。它内部封装了通过jdbc访问数据库的操作,支持普通的sql查询、存储过程和高级映射,几乎消除了所有的jdbc代码和参数的手工设置以及结果集的检索。Mybatis作为持久层框架,其主要的思想是将sql与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改sql。
Mybatis的前身是ibatis,本身是Apache的一个开源项目,2010年这个项目有Apache Software Foundation 迁移到了 Google Code,并改名为Mybatis。2013年迁移到Github。
Mybatis官网:http://mybatis.org
GitHub:https://github.com/mybatis
- 什么是orm
orm(Object/Relational Mapping)即对象/关系映射,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过javaBean对象去操作数据库表的数据。 - Mybatis是orm解决方案
基于ORM,Mybatis在对象模型和关系数据库的表直接建立了一座桥梁,通过Mybatis建立关系映射,以便捷的实现数据存储、查询、更改和删除等操作。
入门
- 纯java方式引入mybatis
要使用mybatis,只需要将mybatis-x.x.x.jar文件置于classpath中即可。 - 通过maven构建项目
如果使用Maven来构建项目,则需要在pom.xml文件中:添加dependency节点
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
从XML中创建SqlSessionFactory会话工厂
每个基于mybatis的应用都是以一个SqlSessionFactory的实例为中心的。
SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。而SqlSessionFacctoryBuilder则可以从XML配置文件总预先定制的Configuration的实例构建出SqlSessionFactory的实例。
从XML文件总构建SqlSessionFactory的实例非常简单,简历使用类路径下的资源文件进行配置。但是也可以使用任意的输入流实例,保存字符串形式的文件路径或者file://的url形式的文件路径来配置。mybatis包含一个名叫Resources的工具类,它包含一些实用方法,可以从classpath或者其他位置加装资源文件更加容易。
创建SqlSessionFactory的代码
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStr
eam);
SqlSessionFactory的生命周期和作用域
SqlSessionFactory对象一旦创建,就会在整个应用运行过程中始终存在。没有理由去销毁或再创建它,并且在应用中也不建议多次创建SqlSessionFactory。因此SqlSessionFactory的最佳作用域是Application,即随着应用的生命周期一同存在。那么这种“存在于整个应用运行期间,并且同时只存在一个对象实例“的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。
SqlSession的作用域
SqlSession是用于执行持久化操作的对象,类似JDBC中的Connection。它提供了面向数据库执行sql命令的所有方法,可以通过SqlSession实例直接运行已映射的Sql语句。
SqlSession对应着一次数据库会话。由于数据库会话不是永久的因此SqlSession的生命周期也不应该是永久的。
每个线程都有自己的SqlSession实例,SqlSession实例不能被共享,也不是线程安全的。因此最佳的做用域范围是request作用域或者方法体作用域内。
关闭SqlSession是非常重要的。必须需要确保SqlSession在Finally语句块中正常关闭。
XML配置文件中包含了对Mybatis系统的核心设置,包含获取数据库连接实例的数据源和决定事物作用域和控制方式的事物管理器。
XML配置文件:
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>
<environments default="development">
<environment id="development">
<!--事物管理-->
<transactionManager type="JDBC"/>
<!--指定数据库连接池-->
<dataSource type="POOLED">
<!--加载mysql驱动,需要导入mysql驱动jar包-->
<property name="driver" value="${driver}"/>
<!--数据库连接url-->
<property name="url" value="${url}"/>
<!--数据库用户名-->
<property name="username" value="${username}"/>
<!--数据库密码-->
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--指定 mapper接口的xml映射文件-->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
- settiongs元素
settiongs元素的作用是设置一些非常重要的设置选项,用于设置和改变Mybatis运行中的行为。
设置项 | 描述 | 允许空值 |
---|---|---|
cacheEnabled | 对在此配置文件下的所有cache进行全局性开/关设置 | true | false |
lazyLoadingEnabled | 全局性设置懒加载。如果设置为false,则所有相关联的都会被初始化加载 | true | false |
autoMappingBehavior | Mybatis对于resultMap自动映射的匹配级别 | NONE| PARTLAL| FULL |
- typeAliases元素
typeAliases元素的作用是配置类型别名,通过与Mybatis的sql映射文件关联,减少输入多余的完整类名,以减缓操作。
<typeAliases>
</typeAliases>
mapper映射文件
mybatis真正强大之处就在于sql语句的映射,相对于它强大的功能,sql映射文件的配置却非常简单。。
Mapper映射文件的根元素节点,只有一个属性namespace(命名空间)
- 用于区分不同的mapper,全局唯一
- 绑定dao接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,Mybatis会通过接口的完整限定名查找到对应的maper配置来执行sql语句。因此namespace的命名必须与接口同名
命名空间(Namespaces)
namespace=“指定xml文件所有对应的mapper接口”
命名空间可以让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">
<!--指定xml配置文件所对应的接口-->
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
命名解析:为减少输入量,没有把提升对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
-
完全限定名(比如"com.mypackage.MyMapper.selectAllThiongs")将贝直接查找并且找到即用。
-
短名称(比如“selectAllThings”)如果全局唯一也可以作为一个单独的引用。如果不唯一,或者有两个或者两个以上的相同名称,那么使用时就会收到错误报告说短名称是不唯一的,这种情况下就必须使用完全限定名。
-
cache:配置给命名空间引用缓存配置
-
cache-ref:从 其他命名空间引用缓存配置,
-
esultMap:用来描述数据库结果集合对象的对应关系。
-
sql:可以重用的sql块,也可以被其他语句引用。
-
insert:映射插入语句。
-
update:映射更新语句
-
delete:映射删除语句
-
select:映射查询语句
属性
- id:命名空间中唯一的标识符,可以被用来引用这条语句。
- parametrType:表示查询语句传入参数的类型的完全限定名或别名。它支持基础数据类型和复杂数据类型。
别名与java类型映射
别名 | 映射的类型 | 别名 | 映射的类型 |
---|---|---|---|
string | String | double | Double |
byte | Byte | float | Float |
long | Long | boolean | Boolean |
short | Short | date | Date |
int | Integer | map | map |
integer | Integer | hashmap | HashMap |
arraylist | Arraylist | list | List |
- resultType:查询语句返回结果类型的完全限定名或别名。别名的使用方式与parameterType是一样的,
#{属性名}: 取接口方法定义形参所对应的值,相当于partemStatement参数,不会sql注入
${属性名} : 直接获取值,在拼接sql时会sql注入
resultMap元素的属性值和子节点:
- id属性:唯一标识,此id值用于select元素resultMap属性的引用。
- type属性:标识该resultMap的映射结果类型。
- result子节点:用于标识一下简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的值赋值给实体对象的那个属性。
resultMap高级映射 一对多
-
属性
-
id:resultM的唯一标识。
-
type:表示该resultMap的映射结果类型(通常是java实体类)。
-
-
子节点
- id:一般对应数据库中该行的主键id
- result:映射到javaBean的某个“简单类型”属性,如基础数据类型、包装类等。
动态SQL
- if:利用if实现简单的条件选择。
- choose(when,otherwise):相当于java中的switch语句,通常与when和otherwise搭配。
- where:简化sql语句中where的条件判断。
- set:解决动态跟下语句。
- trim:可以灵活地去除多余的关键字。
- foreach:迭代一个集合,通常用于in条件
if标签
<select id="getProductList" resultType="cn.easybuy.entity.Product">
select id,name,description,price,stock,categoryLevel1Id,
categoryLevel2Id,categoryLevel3Id,
fileName,isDelete from easybuy_product where 1=1
<if test="name != null and name != ''">
and name like concat('%',#{name},'%')
</if>
<if test=" categoryId != null and categoryId != ''">
and (categoryLevel1Id = #{categoryId} or categoryLevel2Id= #{categoryId} or categoryLevel3Id= #{categoryId} )
</if>
</select>
trim标签
- prefix:前戳,作用是通过自动识别是否有返回值后,在trim包含的内容上夹上前缀。
- suffix:后缀,作用是trim包含的内容上加上后缀
- prefixOverides:对于trim包含内容的首部进行指定内容的乎略