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 into table(role_name,role_age) values(#{roleName}, #{roleAge})
3、update
执行后返回一个整数,标出执行后影响的总记录条数。
update table set role_name=#{roleName} where id=#{id}
4、delete
执行后返回一个整数,标出执行后影响的总记录条数。
<delete id = "deleteRole">
delete from table where id = #{id}
delete>
5、sql
可以定义一串sql语句的组成部分,其它语句通过引用来使用它。
id = "role_column">
id,role_name,role_age
动态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">
"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字段进行支持。
现在感觉还有很多不懂得地方,待以后完善。