mybatis知识点总结

mybatis

mybatis简介

MyBatis 是一款优秀的持久层框架①它支持自定义 SQL、存储过程以及高级映射。②MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。③MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis核心配置文件

核心配置文件可以通过不同的标签配置mybayis中的许多内容,如外部引入文件,别名机制,设置,配置数据库环境配置mapper等。分别有如下标签:
引入文件 properties
设置 setting
别名机制 typealiases
数据库环境 enviroments
配置mapper mappers

properties标签详解

properties标签主要用于引入外部peoperties文件,使用resource属性引入。
eg:

其主要的应用就是从外部引入搭建数据库所需要的环境在下面使用${}符号直接获取,也可在标签中写

来手动定义属性,但是其优先级不如配置文件高

setting详解

setting标签主要应用于设置mybatis框架的各种配置例如是否开启缓存,是否使用数据库命名方式和驼峰的转化,是否使用日志文件等



typealiases详解

typealiases标签是mybatis中的一个别名机制,主要用于给pojo类写别名。由于没有别名的开发中所有pojo都需要写出其完全限定名,不利于开发现在使用这个机制优化。





其中总共有两个标签package是对一个包中所有类都别名化可以大写也可以小写而typeAlias只对一个类设置别名

enviroments详解

enviroments是对所使用的数据库驱动用户数据库等数据库环境参数的配置。
①其中可以使用多套配置环境使用default来指定enviroment的id确定使用哪一套环境
②transactionManager用于确定使用的是哪个数据库的事务管理器
③dataSource和property就用于设置参数










mappers详解

mappers主要用于配置每个mapper.xml的环境路径
其中mapper标签可以使用class来绑定类(前提是类与xml在同一文件下且同名使用点分割)
也可以使用resource来配置xml路径使用划线搞

接口类和mapper.xml

mybatis的使用主要猪调用接口和mapper.xml来创建mapper使用mapper来做一个数据库操作。需要注意的是每个mapper.xml都需要一个接口类。而且需要将其配置在核心配置文件中

mapper.xml和接口的关系

mapper和接口的关系:
①mapper标签中的namespace属性用于绑定相对应的接口的完全限定名,绑定后相当于该mapper用于实现接口。
②xml中每个标签的id用于绑定接口中方法名,相当于该标签是该接口方法的实现。

增删改查实现

增删改查的实现为:
①在接口中定义增伤改查的方法头
void addBlog(Blog blog);

②xml中根据方法头中的信息使用标签实现方法

insert into blog(id,title,author,create_time,views) values(#{id},#{title},#{author},#{createTime},#{views})

万能的map

向标签中传递参数的方式有三种:
①使用基本数据类型传递参数,可以“#{c参数名}”取出该参数
②使用对象传递参数,使用对象传递参数时,每个对象的每个字段都是数据库中表的一列的映射一一对应,可以直接使用#{属性名}来取出想要的数据,缺点是其每次都要定义一个完整的对象当字段多时费时费力。
③使用map传参,其的存在就是为了解决第二种方式的不足,将对应的参数放入一个map中,将map作为一个参数传递,取参数时只需要使用#{key}就可以取到想要的值

注解增删改查

使用注解也可以不适用xml就实现数据库查询,其相当于使用标签就实现接口中方法头方法。不过只能进行简单的增删改查,不适合用于复杂的功能。
①mybatis提供了一些注解实现接口方法例如Insert,Delete,Update,Select等
@Insert(“select * from student”)
②搭配注解使用的还有一个别名机制,主要是为参数取别名方便注解开发
void addBlog(@Param(“id”)Blog blog);

联表查询

联表查询也称之为多表查询,就是多张表的查询,mybatis使用多表查询主要是sql的一个变化。

select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id

一对多和多对一

一对多和多对一主要涉及到一个表的外键约束,例如一个老师对应多个学生,多个学生对应一个老师。
无论是一对多或者多对一都有两种实现方式一种是子查询,一种是联表查询方式前一种sql简单解析结果集繁琐,后一种是sql比较繁琐解析结果集简单
①一对多
a、一对多创建对象时在老师处创建一个学生集合
xml代码
代码解析
②多对一
a、在学生处创建一个老师对象用于代表老师

<select id="selectAll" resultMap="StudentTeacher">
    select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid = t.id
</select>
<resultMap id="StudentTeacher" type="Student">
    <result property="id" column = "sid"></result>
    <result property="name" column="sname"></result>
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"></result>
    </association>
</resultMap>
<select id="selectStudent" resultMap="StudentTeacher1">
    select * from student
</select>
<select id="selectTeacher" resultType="Teacher">
    select * from teacher
</select>
<resultMap id="StudentTeacher1" type="Student">
    <result property="name" column="name"></result>
    <result property="id" column="id"></result>
    <association property="teacher" column="tid" javaType="Teacher" select="select * from teacher"></association>
</resultMap>

代码解析,其中resultMap标签中id指的是需要解析的结果集,type是需要解析成的类型,其中有几个子标签result,association,和collection分别用于解析基本数据类型,对象类型和集合类型。properties是所需要解析的字段,javatype是需要对应的java类型

定制化sql

定制化sql主要是可以让xml自动拼装sql。其主要内容有如下几个标签。
①if标签用于判断满足条件拼装

title = #{title} ②和标签 这两个标签分别用于补齐select语句中的where和and,set用于补齐update中的set和“,”。这两个标签的父标签为可以定制前置补齐和后置补齐。 ③标签主要用于拼接select语句中满足条件的语句,其使用前置,后置和间隔拼接成一个语句放入sql中的某个位置 #{id}

分页查询

分页查询在mybatis中的实现主要也是sql层面,其目的是一次查询有限条数据避免一次处理太多的查询结果
select * from student limit 0,2
第一个数字是开始第二个数字为查询几条

使用流程

mybatis在配置完成后的使用流程分为下面几步:
①加载核心配置文件的数据流,使用SqlSessionFactoryBuilder来创建sqlsession工厂类核心代码如下:
String resource = “mybatis-config.xml”;
InputStream stream = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(stream);
②使用工厂创建sqlsession代码如下:
essionFactory.openSession(true)
其中true用于设置是否自动提交事务,不写则表示不自动提交事务
③创建mapper
Interface mapper = sqlsession.getMapper(Interface.class)
④方法调用提交事务
mapper.select();
sqlsession.commit()

lombok

lombok是一个简化开发的插件,主要应用于pojo类的简化开发。对它的了解只需要了解其安装和使用不必深究其细节。

lombok的安装

lombok的使用和几个基本的注解

缓存机制

mybatis的缓存机制分为一级缓存和二级缓存。两者作用域和作用机制有所不同。
①什么行为会刷新缓存
手动清除缓存(clearcache);
增删改数据库中的数据;
查询不同条记录
查询不同的mapper
②什么东西适合放在缓存中
经常查询且不经常改变的可以放在缓存中
③缓存执行的先后顺序:用户取数据先去二级缓存中查找,再到一级缓存中查询,如果都查询不到再到数据库中查询

一级缓存

一级缓存是mybatis默认开启的缓存,不需要手动开启,其作用于在sqlsession。
显式开启一级缓存

其作用是告诉阅读代码的人使用了一级缓存

二级缓存

①二级缓存的作用域是mapper,只在一个mapper中有效,需要手动开启(在mapper.xml中开启cache可以在cache中定义一些功能)。
②所有的内容都会放在一级缓存中,当一级缓存关闭,一级缓存中的内容会存入二级缓存

自定义缓存

以ehcache为例子,自定义二级缓存使用自定义缓存的步骤为,先使用maven下载相关jar包,然后去找一个配置文件,最后使用

mybatis的作用原理

①首先需要配置mybatis-config.xml核心配置文件。
②解析文档流通过核心配置文件中的信息s使用sqlsessionfactorybuilder创建一个创建一个sqlsessionfactory(其只用于创建一个sqlsession创建完成后不再需要它,所以可以将其放入一个static块中用于初始化)
③使用sqlsession.opensession()创建一个sqlsession,其中opensession()有多个参数可以通过其设置sqlsession中的一些属性。(在sqlsessionfactory和sqlsession之间还有创建事务管理器transactional,和创建执行器executer两个隐藏的步骤,系统自动定义,如果创建sqlsession失败会回滚回事务管理器transactional)
④创建mapper(mapper是真正用于执行与数据库接触执行sql的,每一个mapper都需要在mybatis-config.xml中配置其路径),在mapper执行完成之后需要使用sqlsessio提交事务事务提交失败也会回滚到事务管理器transactional