mybatis是一个开源的数据持久层框架
ORM(Object/Relational Mapping)即对象/关系映射,是一种数据持久化技术
mybatis优点:
(1)与jdbc相比减少了50%以上的代码量
(2)MyBatis是最简单的持久化框架,小巧并且简单易学
(3)MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化并可重用
(4)提供xml标签,支持编写动态SQL语句
(5)提供映射标签,支持对象与数据库的ORM字段关系映射
代码中通过流的方式读取mybatis的配置文件,
private static SqlSessionFactory sqlSessionFactory;
static{
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
InputStream inputStream= Resources.getResourceAsStream("sqlMapConfig.xml");
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//获得数据库有连接
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
//关闭数据库连接
public static void closeSqlSession(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
定义映射器:编写接口mapper和配置文件mapper.xml并且要放在同一个包下面,具体的配置规则在下面的代码中体现。
在mybatis的配置文件中SqlMapConfig.xml中引入mapper.xml
SQL映射文件的顶级元素配置:
(1)mapper:映射文件的根元素节点,只有一个属性namespace(命名空间),作用:
<1>用于区分不同的mapper,全局唯一
<2>绑定DAO接口,即面向接口编程。当namespace绑定某一个接口之后们可以不用写该接口的实现类,MyBatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL 语句。因此namespace的命名必须要跟接口同名
(2)cache:配置给定命名空间的缓存
(3)cache-ref:从其他命名空间引用缓存配置
(4)resultMap:用来描述数据库结果集和对象的对应关系
(5)sql:可以重用的SQL块,也可以被其他语句引用
(6)insert:映射插入语句
(7)update:映射更新语句
(8)delete:映射删除语句
(9)select:映射查询语句
例:
<select id="接口" resultType="返回类型">
SELECT * FROM 表名
</select>
(1)id:命名空间唯一的标识符
(2)resultType:查询语句返回结果类型的完全限定名或别名
resultType和resultType关联和区别:
(1)、resultType直接表示返回类型,包括基础数据类型和复杂数据类型
(2)、resultMap则是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上,它的应用场景一般是:数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果。
<--
在Mybatis的select中,resultType和resultMap本质上是一样的,都是Map数据结构。但需要明确一点:resultType属性和resultMap属性绝对不能同时存在,只能二者选其一使用
-->
例:
<insert id="接口" parameterType="返回">
INSERT INTO 表名 (列名,列名,列名,列名)
VALUES(#{值},#{值},#{值},#{值})
</insert>
(1)id:是命名空间中唯一的标识符
(2)parameterType:是传入参数的类型的完全限定名或别名
<--
对于增删改查(insert、update、delete)这类数据库更新操作,注意两点:
(1)该类型的操作本身默认返回执行SQL影响的行数,所以DAO层的接口方法的返回值一般设置为int类型。最好不要返回boolean类型。
(2)inser、update、delete元素中均没有resultType属性,只有查询操作需要对返回结果类型(resultType/resultMap)进行相应地指定
-->
<--
association:映射到javaBeand的某个“”“复杂类型”属性 注:association仅处理一对一的关联关系
属性:
(1)javaType:完整java类名或者别名。若映射到一个javaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为
(2)property:映射数据库列的实体对象的属性
子元素:
(1)id:
(2)result:
<1>property:映射数据列的实体对象的属性
<2>column:数据列名或别名
collection元素的作用和association元素的作用差不多,也是映射到JavaBean的某个“复杂类型”属性,只不过这个属性是一个集合列表 ,处理一对多关系
属性:
(1)ofType:完整Java类名或者别名,即集合所包含的类型
(2)property:映射数据库列的实体对象的属性
根据不同的入参类型,该属性值亦不同:
<1>若入参对象为一个List实例,collection属性值为list
<2>若入参对象为一个数组,collection属性值为array
<3>若入参对象为多个,就需要把它们封装为一个Map进行处理
-->
动态SQL元素:
(1)if:利用if实现简单的条件选择
(2)choose(when,otherwise):相当于java中的switch语句,通常与when和otherwise搭配
(3)where:简化SQL语句中where的条件判断
(4)set:解决动态更新语句
(5)trim:可以灵活地去除多余的关键字
(6)foreach:迭代一个集合,通常用于in条件
例:
<select id="接口" resultType="返回类型">
SELECT * FROM smbms_bill WHERE providerId IN
<foreach collection="array" item="temp" open="(" close=")" separator=",">
#{temp}
</foreach>
</select>
<select id="query2" resultType="SMBMS_BILL">
SELECT * FROM smbms_bill
<trim prefix="where" prefixOverrides="and | or">
providerId IN
<if test="providerId!=null and provider!=0">
<foreach collection="providerId" item="temp" open="(" close=")" separator=",">
#{temp}
</foreach>
</if>
<if test="billCode!=null and billCode!=''">
and billCode LIKE concat('%',#{billCode},'%')
</if>
</trim>
</select>
<!--
prefix:前缀
prefixOverrides:重写前缀
foreach:循环传入的集合参数
collection:传入的集合的变量名称
item:每次循环将循环出的数据放入这个变量中
open:循环开始拼接的字符串
close:循环结束拼接的字符串
separator:循环中拼接的分隔符
-->
MyBytatis分页:
(1)使用聚合函数count()获得总记录数
(2)通过limit(起始位置<下标从零开始>,页面容量<页码从1开始>)
计算:起始位置下标=(页码-1)X 页面容量