Mybatis框架是现在大型项目开发必备的一款框架,与Spring,SpringMVC一起并称为ssm,代替了旧版的Spring、SpringMVC、hibernate 的SSh 开发模式,我没有接触hibernate 所以不谈ssh的开发环境
一、ORM
对象关系映射是一种解决对象与关系型数据库(MySQL、Oracle 、SQLServer等)存在的互不匹配的现象技术
或者说ORM通过描述对象和数据之间的映射数据元数据。将java程序中的对象自动持久化到关系型数据库
二、Mybatis的优点
说一下Mybatis这块框架的优点,Mybatis 最大的优点就是让我们开发人员连接数据库对数据库的操作变得简单便捷。
1、SQL语句与代码分离
2、用标签控制动态SQL的拼接
3、结果集与java对象的自动映射
4、编写原生SQL
三、Mybatis的底层实现原理
Mybatishi一个数据持久层框架,在项目开发中主要担任了数据库的连接操作,实现了ORM的思想
可以将查询出来的结果集转换为java对象,也可以将java对象转换为一条数据插入到数据库中。完成和数据库的数据交互。
那么查询的结果集是如何自动转换成java对象?实际使用的反射技术。假设在xxx.mapper文件有一条select,查询之后,列名与属性名要一一对应(可以采用起别名的方式)然后每个列名前添加set,通过method.invoke()调用set方法。给Java对象完成赋值。
那么,java对象是如何转换成一条记录插入到数据中的呢?现在假设xxx.mapper的配置文件中有一条语句是insert。那这条语句需要的只从哪里来呢?在Mybatis的配置文件中有一个属性时parameterType的占位符采用 #{ } ,底层依然采用的是反射机制,其中大括号当中需要提供java对象的属性名,该属性名和get进行拼接得到get方法名,然后通过反射机制获取该get方法,再通过method.invoke()来调用这个get方法,这样就可以获取到对应的属性值,然后传入了SQL语句。
<resultMap id="BaseResultMap" type="com.baidu.p2p.model.loan.BidInfo" >
<!--
WARNING - @mbggenerated
This element is automatically generated by MyBatis Generator, do not modify.
This element was generated on Wed Sep 11 15:05:12 CST 2019.
-->
<id column="id" property="id" jdbcType="INTEGER" />
<result column="loan_id" property="loanId" jdbcType="INTEGER" />
<result column="uid" property="uid" jdbcType="INTEGER" />
<result column="bid_money" property="bidMoney" jdbcType="DOUBLE" />
<result column="bid_time" property="bidTime" jdbcType="TIMESTAMP" />
<result column="bid_status" property="bidStatus" jdbcType="INTEGER" />
</resultMap>
<select id="selectTotalBidMoney" resultType="java.lang.Double">
select sum(bid_money) from b_bid_info
</select>
其实Mybatis设计最牛的地方在于采用JDK动态代理的方式生成DAO接口的实现类,其中Dao接口中的每一个方法都不允许重载 , 因为接口中的每一个方法都对应了映射文件的id值,id值是唯一的,接口类的名字对应了mapper映射文件的,命名空间
<mapper namespace="com.baidu.p2p.mapper.loan.BidInfoMapper" >
以上大概就是我了解的Mybatis的实现原理。
总体而言Mybatis框架使用起来应该是比较简单的,它的作用在于在项目开发中,简化了数据持久层对于数据库访问的难度,简化了我们JDBC访问数据库的冗余代码 , 简化我们访问数据的难度, 让开发大中小型项目难度大大降低