初始MyBatis
1.框架的概念
- 框架(Framework)是一个可重用的公式结构的半成品
2.主流框架的介绍
-
Struts 2框架
Struts 2 以WebWork优秀的设计思想为核心,吸收力Struts框架的部分优点,提供了一个更加整洁的基于MVC设计模式实现的Web应用程序框架
-
Hibernate框架
Hibernate是一个优秀的持久化框架,负责简化将对象数据保存到数据库中,或从数据库中读取数据并封装到对象的工作
-
Spring框架
Spring也是一个开源框架,它是一个轻量级的框架,渗透了JavaEE技术的方方面面
-
SpringMVC框架
SpringMVC是Spring框架的构建Web应用程序的全功能MVC模块,属于SpringFramework的后续产品,已经融合在Spring Web Flow里面,是结构最清晰的MVC Model2的实现
-
MyBatis框架
MyBatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现
3.MyBatis框架及ORM
-
MyBatis框架简介
MyBatis是一个开源的数据持久层框架 ,它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询,存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索
-
什么是ORM
ORM(Object/Relation Mapping)即对象/关系映射,是一种数据持久化技术
4.MyBatis框架的优点缺点及其适用场合
-
MyBatis框架的优点
(1)与JDBC相比,减少了50%以上的代码量
(2)MyBatis是最简单的持久化框架,小巧并且简单易学
(3)MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任 何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度, 便于统一管理和优化,并可重用
(4)提供XML标签,支持编写动态SQL语句
(5)提供映射标签,支持对象与数据库的ORM字段关系映射
-
MyBatis框架的缺点
(1)SQL语句的编写工作量大,对开发人员编写SQL语句的功底有一定 要求
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据 库
-
Mybatis框架适用场合
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,对性能要求很高,或者需求变化较多的项目。
5.MyBatis的基本要素-核心对象
- 核心接口和类
- MyBatis核心配置文件(mybatis-config.xml)
- SQL映射文件(mapper.xml)
5.1 SqlSessionFactoryBuilder的作用
- build(Reader rader,String environment,Properties properties)
- build(InputStream inputStream ,String environment,Properties properties)
- build(Configuration config)
5.2 SqlSessionFactoryBuilder 的生命周期和作用域
SqlSessionFactoryBuilder 的最大特点是:用过即丢。
5.3 SqlSessionFactory的作用
SqlSessionFactory简单的理解就是创建SqlSession实例的工厂
5.4 SqlSeesionFactory 的生命周期和作用域
SqlSeesionFactory 对象一旦创建,就会在整个应用运行过程中始终存在
5.5 SqlSession的作用
SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection
5.6 SqlSession的生命周期和作用域
SqlSession对应着一次数据库会话,由于数据库会话不是永久的,因此 SqlSession的生命周期也不应该是永久的
6.MyBatis的基本要素-核心配置文件
6.1 MyBatis-config.xml文件结构
-
properties元素
描述的都是外部化,可替代的属性
1.database.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/smbms user=root password=root使用 2.mybatis-config.xml部分内容 <!--引入 database.properties 文件--> <properties resouces="database.properties"/> <dataSouces type="POOLED"> <property name="driver" value="${driver}"> <property name="url" value="${url}"> <property name="username" value="${user}"> <property name="password"value="${password}"> </dataSouces>
-
settings元素
设置项 描述 允许值 默认值 cacheEnabled 对在此配置文件下的所有cache进行全局开/关设置 true/false true lazyLoadingEnabled 全局性设置懒加载,如果设为fasle,则所有相关联的都会被初始化加载 true/false true autoMappingBehavior MyBatis对于resultMap自动映射的匹配级别 NONE|PARTIAL|FULL PAPTIAL -
typeAliases元素
typeAliases元素的作用是配置类型别名,通过与MyBatis的SQL映射文件 相关联,减少输入多余的完整类名,以简化操作
-
environments元素
MyBatis可以配置多套运行环境,如开发环境,测试环境,生产环境等,我们就可以灵活选择不同的配置,从而将SQL映射应用到不同的数据库环境上
-
mapper元素
mapper:映射器,用来定义SQL的映射语句,我们只需要告诉MyBatis去哪里找到这些SQL语句,即去哪里找相应的SQL映射文件。
SQL映射文件
1.使用MyBatis实现条件查询
1.1 SQL映射文件
- mapper:映射文件的根元素节点,只有一个属性namespace
- cache:配置给定命名空间的缓存
- cache-ref:从其他命名空间引用缓存配置
- resultMap:用来描述数据库结果集和对象的对应关系
- sql:可以重来的SQL块,也可以被其他语句引用
- insert:映射插入语句
- update:映射更新语句
- delete:映射删除语句
- select:映射查询语句
1.2 使用select完成单条件查询
与查询对应的select元素是使用MyBatis时最常用的元素,
-
id:命名空间中唯一的标识符,可以被用来引用这条语句
-
parameterType:表示查询语句传入参数的类型的完全限定名或别名
别名 映射的类型 别名 映射的类型 string String double Double byte Byte float Float long Long bollean Bollean short Short date Date int Integer map Map integer Integer hashmap HashMap arraylist ArrayList list List -
resultType:查询语句返回结果类型的完全限定名或别名
1.3 使用resultMap 完成查询结果的展现
resultMap元素的属性值和子节点
-
id属性:唯一标识,此id值用于select元素resultMap属性的引用
-
type属性:表示该resultMap的映射结果类型
-
result 子节点:用于标识一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的值赋给实体对象的哪个属性
1.resultType 直接表示返回类型,包括基础数据类型和复杂数据类型
2.resultMap 是对应外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上
3.resultType和resultMap的关联 在MyBatis进行查询映射的时候,其实查询出来的每个字段值都放在一个对应的Map里面,其中键是字段名,值则是其对应的值
4.resultMap的自动映射级别为了自由灵活地控制映射结果,达到只关心的属性进行赋值填充的目的
1.4使用@param注解实现多参数入参
直接进行多参数入参即可,代码可读性高,可清晰地看出这个接口方法所需的参数是什么,当方法参数有多个时,每个参数目前都需要增加@param注解
public int updatePwd(@param("id")Integer id,@param("userPassword")String pwd);
2.使用resultMap实现高级结果映射
1.属性
- id:resultMap的唯一标识
- type:表示该resultMap的映射结果类型
2.子节点
- id:一般对应数据库中该行的主键id,设置此项可以提升MyBatis性能
- result:映射到JavaBean的某个"简单类型"属性,如基础数据类型,包装类等
2.1 association
映射到JavaBean的某个"复杂类型"属性,比如JavaBean类,即JavaBean内部嵌套一个复杂数据类型属性,这种情况就属于复杂类型的关联
-
javaType:完整java类名或者别名
-
property:映射数据库列的实体对象的属性
asscoication的子元素
-
property:映射数据库列的实体对象的属性
-
column:数据库列名或别名
2.2 collection
-
collection元素的作用和association元素的作用差不多一样,事实上,他们非常类似,也是映射到JavaBean的某个"复杂类型"属性,只不过这个属性是一个集合复杂数据类型属性列表,即JavaBean内部嵌套一个
-
ofType:完整Java类名或者别名,即集合所包含的类型
-
property:映射数据库列的实体对象的属性
3.resultMap自动映射级别和MyBatis缓存
3.1 resultMap自动映射级别
- NONE:禁止自动匹配
- PARTIAL(默认):自动匹配所有属性,有内部嵌套(association,collection)的除外
- FULL:自动匹配所有
3.2 MyBatis缓存
-
一级缓存
一级级缓存是基于PerpetualCache的HashMap本地缓存,作用范围为seesion域内,当session flush或者chose之后,该session中所有cache就会被清空
-
二级缓存
二级缓存就是global caching,它超出范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心配置文件settings设置即可
-
二级缓存的配置
(1)MyBatis的全局cache配置,需要在mybatis-config.xml的settings中设置,代码如下
<settings> <setting name="cacheEnabled" value="true"/> </settings>
(2)在mapper文件中设置缓存,默认情况下是没有开启缓存的
<mapper namespace="cn.smbms.dao.user.UserMapper"> <!-- cache配置 --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> ..... </mapper>
动态SQL
1.使用动态SQL完成多条件查询
- if:利用if实现简单的条件选择
- choose:相当于Java中的switch语句,通常when和otherwise搭配
- where:简化SQL语句中where的条件判断
- set:解决动态更新语句
- trim:可以灵活地去除多余的关键字
- foreach:迭代一个集合,通常用于in条件
1.1 使用if+trim实现多条件查询
- prefix:前缀,作用是通过自动识别是否有返回值后,在trim包含的内容上加上前缀,如where
- suffix:后缀,作用是trim包含内容上加上后缀
- prefixOverrides:对于trim包含内容的首部进行指定内容的忽略
- suffixOverrides:对于trim包含内容的首尾部进行指定内容的忽略
2.使用froeach完成复杂查询
2.1MyBatis入参为数组类型的froeach迭代
- item:表示集合中每一个元素进行迭代时的别名
- index:指定一个名称,用于表示在迭代过程中,每次迭代到的位置
- open:表示该语句以书面开始(既然是in条件语句,所以必须以"("开始)
- separator:表示在每次记性迭代之间以符号作为分隔符(既然是in条件语句,所以必然以","作为分隔符)
- close:表示该语句以什么结束(既然是in条件语句,所以必然是以")"结束)
- collection:最关键并最容易出错的属性,需格外注意,该属性必须指定,不同情况下,该属性的值不一样的
2.2 MyBis入参为List类型的foreach迭代
List<User> userList = new ArrayList<>(User);
List<Integer> roleList = new ArrayList<Integer>();
roleList.add(2);
roleList.add(3);
userList=sqlSession.getMapper(UsreMapper.class).
getUserByRoleId_foreach_array(roleIds);
2.3 MyBatis 入参为Map类型的froeach迭代
List<Integer> roleList = new ArrayList<Integer>();
roleList.add(2);
roleList.add(3);
Map<String,Object> roleMap = new HasMap<String,Object>();
roleMap.put("rKey",roleList);
2.4 choose(when,otherwise)
对于某些查询需求,虽有多个查询条件,但是我们不想应有所有的条件,只想选择其中一中情况下的查询结果
- when元素:当其test属性中条件满足的时候,就会输出when元素中的内容
- otherwise元素:当when中的所有条件都不满足的时候,就会自动输出otherwise元素的内容
3.MyBatis实现分页功能
1.UserMapper.java
/**
* 查询用户列表(分页显示)
* @param userName
* @param roleId
* @param currentPageNo
* @param pageSize
* @return
*/
List<User> getUserList(@Param("userName") String userName,
@Param("roleId") Integer roleId,
@Param("from") Integer currentPageNo,
@Param("pageSize") Integer pageSize);
2.UserMapper.xml
<select id="getUserList" resultMap="userList">
select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole=r.id
<if test="userRole !=null">
and u.userRole=#{userRole}
</if>
<if test="userName !=null and userName!=''">
and userName like CONCAT('%',#{userName},'%')
order by creationDate desc limit #{from},#{pageSize}
</if>
</select>
3.test测试
public void testGetUserList1(){
SqlSession sqlSession = null;
List<User> userList = new ArrayList<User>();
try {
sqlSession= MyBatisUtil.createSqlSession();
String userName="";
Integer roleId=null;
Integer pageSize=5;
Integer currentPageNo=0;
userList=sqlSession.getMapper(UserMapper.class).getUserList(userName,roleId,currentPageNo,pageSize);
}catch (Exception e){
e.printStackTrace();
}finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
System.out.println("UserList.size------>"+userList.size());
for (User user:userList){
System.out.println("testGetUserList==========> id:"+user.getId()+
"and userCode:"+user.getUserCode()+
"and usreName:"+user.getUserName()+
"and userRole:"+user.getUserRole()+
"and userRoleName:"+user.getAge()+
"and gender"+user.getGender()+
"and creationDate:"+new SimpleDateFormat("yyyy-MM-dd").format(user.getCreationDate()));
}
}