java-mybaits-00102-mybatis框架原理

Posted 木子旭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-mybaits-00102-mybatis框架原理相关的知识,希望对你有一定的参考价值。

一、原理概述

1、mybatis是什么?

  mybatis是一个持久层的框架,是apache下的顶级项目。是一个不完全的ORM框架。
  mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
  mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
  mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
  MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
  Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。 

2、mybatis和hibernate本质区别和应用场景

  hibernate

    是一个标准ORM框架(对象关系映射)。入门门槛较高的,不需要程序写sql,sql语句自动生成了。
    对sql语句进行优化、修改比较困难的。
   应用场景:
          适用与需求变化不多的中小型项目,比如:后台管理系统,erp、orm、oa。。   

  mybatis

    专注是sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全 的ORM框架,虽然程序员自己写sql,mybatis 也可以实现映射(输入映射、输出映射)。
  应用场景:
    适用与需求变化较多的项目,比如:互联网项目。
 
  注:企业进行技术选型,以低成本 高回报作为技术选型的原则,根据项目组的技术力量进行选择。

3、mybatis框架

  

  

  1. mybatis配置
    SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
    mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  1. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  2. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。建议sqlSession应用场合在方法体内。
  3. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  4. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  5. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  6. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

4、Mybatis解决jdbc编程的问题

1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
 
二、SqlMapConfig.xml全局配置文件
 
2.1、配置中的内容和顺序如下: 

properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)

2.2、properties(属性)  
 
SqlMapConfig.xml可以引用java属性文件中的配置信息如下:
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

SqlMapConfig.xml引用如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 是用resource属性加载外部配置文件 -->
    <properties resource="db.properties">
       <!-- 在properties内部用property定义属性 -->
       <!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
       <property name="jdbc.username" value="root123" />
       <property name="jdbc.password" value="root123" />
    </properties>
<!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
       <environment id="development">
           <!-- 使用jdbc事务管理 -->
           <transactionManager type="JDBC" />
           <!-- 数据库连接池 -->
           <dataSource type="POOLED">
              <property name="driver" value="${jdbc.driver}" />
              <property name="url" value="${jdbc.url}" />
              <property name="username" value="${jdbc.username}" />
              <property name="password" value="${jdbc.password}" />
           </dataSource>
       </environment>
    </environments>
 
    <!-- 加载映射文件 -->
    <mappers>
       <mapper resource="sqlmap/User.xml" />
       <mapper resource="mapper/UserMapper.xml" />
    </mappers>
</configuration>
注意: MyBatis 将按照下面的顺序来加载属性:
u  在 properties 元素体内定义的属性首先被读取。
u  然后会读取properties 元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
2.3、typeAliases(类型别名)
 
别名
映射的类型
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short
Short
int
Integer
integer
Integer
double
Double
float
Float
boolean
Boolean
date
Date
decimal
BigDecimal
bigdecimal
BigDecimal
map
Map
自定义别名:
在SqlMapConfig.xml中配置如下:
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 是用resource属性加载外部配置文件 -->
    <properties resource="db.properties">
       <!-- 在properties内部用property定义属性 -->
       <property name="jdbc.username" value="root123" />
       <property name="jdbc.password" value="root123" />
    </properties>
 
    <typeAliases>
       <!-- 单个别名定义 -->
       <typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
       <!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
       <package name="cn.itcast.mybatis.pojo" />
       <package name="其它包" />
    </typeAliases>
 
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
       <environment id="development">
           <!-- 使用jdbc事务管理 -->
           <transactionManager type="JDBC" />
           <!-- 数据库连接池 -->
           <dataSource type="POOLED">
              <property name="driver" value="${jdbc.driver}" />
              <property name="url" value="${jdbc.url}" />
              <property name="username" value="${jdbc.username}" />
              <property name="password" value="${jdbc.password}" />
           </dataSource>
       </environment>
    </environments>
 
    <!-- 加载映射文件 -->
    <mappers>
       <mapper resource="sqlmap/User.xml" />
       <mapper resource="mapper/UserMapper.xml" />
    </mappers>
</configuration>

 

在mapper.xml配置文件中,就可以使用设置的别名了
别名大小写不敏感

2.4、 mappers(映射器)
Mapper配置的几种方法:
1、 <mapper resource=" " />
使用相对于类路径的资源(现在的使用方式)
如:<mapper resource="sqlmap/User.xml" />
 
2、<mapper class=" " />
使用mapper接口类路径
如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
 
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
 
3、<package name=""/>

注册指定包下的所有mapper接口
如:<package name="cn.itcast.mybatis.mapper"/>
注意:此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。

 
 
 
 
 
 
 
 
开机
 

以上是关于java-mybaits-00102-mybatis框架原理的主要内容,如果未能解决你的问题,请参考以下文章