深入浅出mybatis学习笔记

来源:互联网 发布:java 前端分页代码 编辑:程序博客网 时间:2024/06/16 09:48

ORM(对象关系映射)模型就是数据库的表和简单java对象(POJO)的映射关系模型。
Hibernate的缺点:
全表映射带来的不便,比如更新时需要发送所有的字段。
无法根据不同的条件组建不同的SQL。
对多表关联和复杂sql查询支持较差。
不能有效支持存储过程。
HQL性能较差。
mybatis相对Hibernate的缺点:
需要提供映射规则和sql,工作量大一点。
Hibernate提供更为强大的缓存,日志和级联。
mybatis的核心组件:
SqlSessionFactoryBuilder:根据配置信息或代码生成SqlSessionFactory,生命周期存在于方法的局部。
SqlSessionFactory:依靠工厂来生产SqlSession。存在于mybatis应用的整个生命周期中,单例模式创建。
SqlSession:相当于JDBC的一个Connection对象,是一个既可以发送sql去执行并返回结果,也可以获取mapper的接口。存在于请求数据库处理事务的过程中
sql Mapper:有java接口和xml文件构成,负责发送sql去执行,并返回结果。存在于一个SqlSession事务方法之内。
别名(typeAliases)是一个指代的名称,类限定名过长的时候,用一个简短的名称去指代它。mybatis的源码org.apache.ibatis.type.TypeAliasRegistry中可以看到自定义注册的信息,这些可以运用于resultType中。
typeHandler(类型处理器):常用的配置为java类型(javaType)、JDBC类型(jdbcType)。作用为将参数从javaType转换为jdbcType,或者是从数据库取出结果时把jdbcType转化为javaType。
ObjectFactory:mybatis在构建一个结果返回时,会使用ObjectFactory去构建POJO,一般使用默认的ObjectFactory即可。
mybatis是针对映射器构造的SQL构建的轻量级框架,并通过配置生成对应的javaBean返回给调用者,配置主要的便是映射器。
映射器主要元素:
1、select

<select id = "getRole" resultType="map">    select id,role_name from table where id = #{id}</select>

2、insert
insert会在执行插入之后返回一个整数,表示插入后操作的记录数。keyProperty属性表明哪个列作为属性的主键,但是不能和keyColumn(指明第几列是主键,接受整形参数)共用。

<insert id = "insertRole">    insert into table(role_name,role_age) values(#{roleName}, #{roleAge})</insert>

3、update
执行后返回一个整数,标出执行后影响的总记录条数。

<update id = "updateRole">    update table set role_name=#{roleName} where id=#{id}</update>

4、delete
执行后返回一个整数,标出执行后影响的总记录条数。

<delete id = "deleteRole">    delete from table where id = #{id}</delete>

5、sql
可以定义一串sql语句的组成部分,其它语句通过引用来使用它。

<sql id = "role_column">    id,role_name,role_age</sql><select id = "getRole" resultType = "map">    select <include refid="role_coulumn"/> from table where id=#{id}</select>

动态SQL
1、if元素

<select id="findRole" resultType="map">    select role_name from student where 1=1    <if test="roleClass!= null">    and class=#{roleClass}    </if></select>

2、where元素
上面一个例子使用到了1=1这样的条件,目的是让sql语句不报错。但是使用where也能达到同样的效果。

<select id="findRole" resultType="map">    select role_name from student    <where>        <if test="roleClass!= null">        and class=#{roleClass}        </if>    </where></select>

3、foreach元素
foreach是一个循环语句,作用是来遍历集合。

<select id="findByName" resultType="map">    select * from student where name in    <foreach item="name" index="index" collection="List"open="(" separator="," close=")">        #{sex}    </foreach></select>

4、bind元素
bind可用于模糊查询的时候,不用考虑使用的是什么类型的数据库。

<select id="findRole" resultType="map">    <bind name="hello" value="'%' + roleName + '%'"/>    select * from student where role_name like #{hello}</select>

多个like条件的时候只需要定义多个bind就行。

mybatis解析和运行原理
Mapper是一个接口,那么它是怎么运行的?这里用到了动态代理,动态代理分为两种:一种是jdk反射机制提供的代理,另一种是CGLIB代理。两者的区别是jdk提供的代理必须要提供接口,而CGLIB不用。

SqlSession下的四大对象
1、Executor代表执行器,调度StatementHandler、ParamerHandler、ResultHandler来执行对应的sql。执行器一共有三种,simple(默认的执行器),reuse(执行器重用的预处理语句),batch(执行器重用语句和批量更新,主要用于批量更新)

2、StatementHandler(数据库回话器)作用是使用数据库的Statement执行操作,是四大对象的核心,起到承上启下的作用。一样分为三种,SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler。主要包含三个方法,prepare,parameterize和query。

3、ParamerHandler(参数处理器)用于sql对参数的处理。主要方法是setParameters方法。

4、ResultHandler(结果处理器)进行最后的数据集的封装和返回处理。主要方法是handleOutputParameters方法。

一条查询sql的执行过程,Executor会调用StatementHandler的prepare方法预编译sql语句,同时设置一些基本运行的参数,然后用parameterize方法启用ParamerHandler设置参数,完成预编译,跟着就是执行查询,最后用ResultHandler封装结果给调用者。

Spring主要由IOC(反转控制)和AOP(面向切面编程)构成。
Spring中的IOC注入方式分为下面几种:
1、构造方法注入
2、setter注入
3、接口注入
4、注解注入
IOC由反射实现,AOP由动态代理实现,在mybatis-Spring技术中,AOP最大的用处就是事务的控制。
事务隔离级别:脏读、读写提交、可重复读,序列化。
脏读(读未提交)是指一个事务能够读取另一个事务未提交的数据。

读写提交不能读取未提交的事务,但是这样也会有问题,如果A、B同时使用一个账户消费,B读取时发现余额足够,但是之后A立马提交了消费申请,B再进行消费时,发现余额不足。

可重复读可以解决读写提交的问题,但是同时会带来幻读。A、B同时使用一个账户,A打印账单前查询消费记录总的是1000元,但是在账单打印出来前,B消费了500元,之后打印出来的就是1500元,这就会让A认为出现了500元虚假记录。

序列化可以解决上述的所有问题,所有的操作都是按照顺序执行。
一般而言,性能从脏读,读写提交,可重复读,序列话是直线下降的,更多的时候使用读写提交就行了。
@Controller注解类为控制器
@RequestMapping匹配路径,进入相应的类和方法。
@ResponseBody标注把结果转化为JSON
Spring中使用注解@Repository表示DAO层。

对于文件的操作,数据库中通过BLOB字段进行支持。
现在感觉还有很多不懂得地方,待以后完善。

原创粉丝点击