MyBatis

一、简介

MyBatis支持定制化SQL。SQL全部写在配置文件中,也就是说将与数据库交互的核心SQL,抽取出来,这种方式 与 原生JDBC相比 降低了 耦合。
(1)MyBatis将重要的步骤抽取出来可以人工定制,其他步骤自动化;
(2)重要步骤都是写在配置文件中(利于维护);
(3)完全解决数据库的优化问题;
(4)MyBatis底层就是对JDBC的一个简单封装;
(5)既将Java编码与SQL抽取了出来,还不会失去自动化功能,可以看作是半自动的持久层框架;
(6)轻量级框架

二、使用:

(1)导包:
mybatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j-1.2.17.jar (日志包需要写一个配置文件log4j.xml才能生效,写在源码目录下)

(2)写配置

  • 第一配置文件:称为mybatis的全局配置文件,指导mybatis如何正确运行(指向那个数据库等)
  • 第二个配置文件:编写每一个方法都如何向数据库发送sql语句,如何执行 ,相当于接口的实现类。(sql语句的映射文件)
<?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">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

namespace:名称空间,写接口的全类名,相当于告诉mybatis这个配置文件是实现的哪个接口;
select:用来定义一个查询操作(标签体写SQL语句),id表示对某个方法的实现;
resultType:表示返回值的类型;
#{属性名}:表示取出传递过来的某个参数的值;
这个配置文件需要在mybatis全局配置文件中进行引入mappers标签下 mapper : resource指定文件地址进行引入)。(注册有三种方法,第三部分有说明)

(3)写测试:

  • 根据全局配置文件创建出sqlSessionFactory,负责创建SqlSession对象。(sqlSession表示和数据库的一次会话)
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • 获取和数据库的一次会话:SqlSession session = sqlSessionFactory.openSession();
    openSession(true):可以设置连接为自动提交或者手动提交。
  • 使用sqlSession操作数据库(使用getMapper先获取到dao类的实现类),然后进行操作数据库。
BlogMapper mapper = session.getMapper(BlogMapper.class);

(4)mybatis导入dtd写xml有提示:
配置dtd写xml自动提示

三、全局配置文件:

在书写这些标签的时候是有先后顺序的,如果顺序不对会报错。
1、 properties 属性:引入外部配置文件,与springMVC相同,不过不用写classpath前缀。resource默认从类路径开始;
2、settings 设置:修改mybatis运行时的行为;
3、typeAliases 类型命名:(1)为一个JavaBean(全类名)起别名,别名默认就是类名,配置文件中就可以使用别名了;也可以指定一个新的名字(alias=?);
(2)批量起别名:使用package标签,指定包名,默认别名就是类名(但是,还是推荐写全类名);
4、typeHandlers 类型处理器:MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
5、objectFactory 对象工厂
6、 plugins 插件:
7、environments 环境配置:配置环境们,default表示默认使用哪一个环境。(在需要切换环境的时候,只需要将default设置为某个环境的id即可)。
8、environment 环境变量:每一个environment才是配置一个具体的环境。每一个具体的环境都需要事务管理器和一个数据源;id是当前环境的唯一标识。(事务管理和数据源最后都是有spring来完成)
9、transactionManager 事务管理器
10、dataSource 数据源
11、databaseIdProvider 数据库移植:在environments之后,mappers之前。mybatis用来考虑做数据库移植的。
12、mappers 映射器:写好的sql映射文件需要使用mappers注册进来。
(1)

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

(2)

<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

(3)

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

使用接口类的全类名时,要将接口配置的xml文件放在和dao接口同目录下,并且文件名和接口名一致。
(4)

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

同样要将接口的xml配置文件放在和dao接口同目录下,并且文件名和接口名一致。

四、SQL映射文件:

SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

1、cache – 给定命名空间的缓存配置。

2、cache-ref – 其他命名空间缓存配置的引用。

3、resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

resultMap自定义封装规则:
默认mybatis自动封装结果集;

  • 按照列名(表中的名称)和属性名(sql查询所使用的名称)一一对应的规则;
  • 如果没有一一对应:1)开启驼峰命名法,须满足驼峰命名法的规则。2)起别名

自定义结果集(resultMap):自己定义每一列数据和Javabean的映射规则
在这里插入图片描述
在select标签中引入自定义的映射规则。
在这里插入图片描述
注意:使用 resultMap 或 resultType,但不能同时使用。

4、parameterMap – 已废弃!

老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。

5、sql – 可被其他语句引用的可重用语句块

6、 insert 、update、delete – 映射插入语句

在这里插入图片描述

7、select映射查询语句

在这里插入图片描述
(1)参数的传入类型不同存在的几种现象:
在这里插入图片描述
在这里插入图片描述
也就是说无论传入的是什么参数都要能正确的取出值。

(2)实际上mybatis中,有两种取值方式

  • #{属性名}:是参数的预编译模式,参数的位置都是用?替代,参数后来都是预编译设置进去的,安全。不会有sql注入问题。
  • ${属性名}:不是参数预编译,而是直接和sql语句进行拼串,不安全。
    注意:sql语句只有参数的位置是预编译的;在不支持参数预编译的位置要进行取值就使用${}。

(3)查询进行封装成集合:

  • 查询多条记录封装list,返回值类型写的是list中元素的类型
  • 查询单条记录封装map,返回值类型为map(key为属性【表中的列名】,value为实际的值)
  • 查询多条记录封装map,返回值类型为集合中元素的类型(注意:需要在dao中用@MapKey("")告诉mybatis用哪个字段作为key)

8、联合查询:

(1)association联合查询:一个复杂的类型关联(有外键关联,在JavaBean中表现为JavaBean中有其他javaBean对象);许多结果将包装这种类型。
association表示联合了一个对象
在这里插入图片描述
(2)collection定义集合类型属性
需指定集合中元素的类型。
在这里插入图片描述
(3)使用select属性指定分步查询:
在这里插入图片描述

(4)按需加载和延迟加载:
在这里插入图片描述
在全局配置文件中设置按需加载和延迟加载,开启之后,数据库在使用分步查询时的性能会比较高(只有在需要进行下一步的查询的时候才进行查询)。

五、动态sql:

MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

1、if

动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

其中一些判断的符号要使用转译符。

2、choose (when, otherwise)

3、trim (where, set)

4、foreach

六、缓存机制:

暂时的存储一些数据,加快系统的查询速度。
mybatis缓存机制------> 本质是map,保存了查询出的一些数据。
一级缓存:线程级别的缓存,本地缓存,sqlSession级别的缓存;
二级缓存:全局范围的缓存,除过当前线程,sqlSession能用外其他也可以使用;

1、一级缓存:

首先一级缓存是默认存在的。
机制:只要之前查询过的数据,mybatis就会保存在一个缓存中(Map);下次获取的时候直接从缓存中拿出。

一级缓存失效的几种情况:
(1)不同的sqlSession,使用不同的一级缓存;只有在同一个sqlSession期间查询到的数据会保存在这个sqlSession的缓存中;
(2)同一个方法,不同的参数,由于可能之前没有查询过,所以还会发新的sql;
(3)在这个sqlSession期间执行上任何一次增删改操作,都会将缓存清空;
(4)手动清空了缓存。

2、二级缓存:

二级缓存:namespace级别的缓存(只有在某个dao配置允许使用二级缓存才能够使用二级缓存,每一个dao都有一个namespace名称空间,所以称为namespace级别的缓存)。
二级缓存在sqlSession关闭或提交之后才会生效,一级缓存的数据会放在二级缓存中。mybatis默认不使用二级缓存,在使用的时候要进行配置。

二级缓存使用:
(1)全局配置文件中开启二级缓存:

    <settings>
        <setting name="cacheEnable" value="true"/>
    </settings>

(2)配置某个dao.xml文件,让其使用二级缓存:

<cache></cache>

注意:
(0)使用二级缓存时,dao需要实现序列化接口;
(1)不会出现一级缓存和二级缓存有同一个数据;二级缓存中,一级缓存关闭了就有了;一级缓存中,二级缓存中还没有此数据,如果一级缓存中也没有,就去查数据库,查询的结果放在一级缓存中;
(2)任何时候都是先看二级缓存,在看一级缓存,如果都没有就去查询数据库。

3、缓存有关的属性:

  • select标签的useCache属性:配置这个select是否使用二级缓存。一级缓存一直是使用的。默认为true。
  • sql标签的flushCache属性:增删改操作默认flushCache=true。sql执行以后,会同时清空一级和二级缓存。查询默认flushCache=false。
  • sqlSession.clearCache():只是用来清除一级缓存。

4、整合第三方缓存:

mybatis提供了cache接口以供实现更专业,强大的缓存效果。
整合ehcache:非常专业的Java进程内的缓存框架。dao不用实现序列化接口。
(1)导包:
导入ehcache包,以及整合包,日志包
ehcache-core-2.6.8.jar、mybatis-ehcache-1.0.3.jar
slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.2.jar
(2)编写ehcache.xml配置文件:
文件名叫做ehcache.xml;放在类路径的根目录下;设置缓存工作时的属性。
(3)配置cache标签:
在dao的xml配置文件中配置实现了mybatis缓存接口的全类名。

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

(4)参照缓存:
若想在命名空间中共享相同的缓存配置和实例。可以使用 cache-ref 元素来引用另外一个缓存。
在这里插入图片描述
namespace指定引用哪一个名称空间中的缓存配置。

七、ssm整合:

1、导包:

在这里插入图片描述
AOP核心,IOC核心,springMVC,文件上传下载,jstl核心,日志包,ajax。
在这里插入图片描述
在这里插入图片描述
mybatis-spring-1.3.0.jar:mybatis跟spring整合的包,能够根据配置文件创建sqlSeesionFactory。用此包在spring配置文件中进行配置mybatis操作数据库。

2、写配置:

(1)web.xml配置
(2)spring配置
(3)springmvc配置
(4)mybatis配置
(5)其他配置

整合的关键配置:
在这里插入图片描述

八、Mybatis Generator(MBG):

正向:建表---->Javabean----->Dao----->dao.xml----->xxxx
逆向:逆向分析数据表,自动生成Javabean----->Dao----->dao.xml----->xxxx
MBG:代码生成器,mybatis官方提供的代码生成器,帮我们逆向生成;

(1)需要jar包:mybatis-generator-core-1.3.2.jar
(2)写配置:jdbcConnection指导连接到哪个数据库;javaModelGenerator生成pojo(即JavaBean);sqlMapGenerator指导生成sql映射文件;javaClientGenerator指导生成Dao接口;table指定要逆向生成哪张表(指定表名和对应JavaBean的对象名)。
(3)根据官方提供的Java代码进行逆向生成。

public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
callback, warnings);
myBatisGenerator.generate(null);
}

九、插件pageHelper:

Mybatis-PageHelper
推荐使用maven方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值