mybatis介绍

    MyBatis 本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。

    MyBatis是一个持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。

    Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

jdbc问题总结如下:

1.数据库连接创建、释放频繁造成系统资源浪费

2.Sql语句在代码中硬编码

3.占位符号传参数存在硬编码,当条件变更,或者占位符顺序发生改变

4.对结果集解析存在硬编码(查询列名)

Mybatis架构


                                    mybatis原理及介绍

SqlMapConfig.xml是mybatis 的核心配置文件

mapper.xml文件即sql映射文件,此文件需要在SqlMapConfig.xml中加载。

通过以上的两个配置文件会产生一个SqlSessionFactory即会话工厂

会话工厂创建sqlSession即会话,sqlSession来操作数据库

在sqlsession对象中有Executor和Mapped Statement

Executor它是sqlsession对象中SQL语句的执行者,Executor对象中放着mapped statement

sql语句放在mapped statement里的pojo对象中(sql语句的字段拆开放在pojo的字段中),最后由executor执行

MappedStatement中还有一个输入与输出映射,就是给sql语句占位符中入参塞入对象(这些对象可以是pojo、map、基础数据类型)

 Mybatis解决jdbc编程的问题

1、  数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

2、  Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:sql语句是写在配置文件中,将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3、  向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

4、  对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

mybatis与hibernate不同

Mybatis和hibernate不同,它不完全是一个ORM框架(不用自己编写sql语句,面向对象方式进行映射),因为MyBatis需要程序员自己编写Sql语句

 Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

 Hibernate对象/关系映射能力强,数据库无关性好,自动生成sql语句。对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。

总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

Mapper动态代理方式  

 开发规范

       Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象。

Mapper接口开发需要遵循以下规范:

1、  Mapper.xml文件中的namespace与mapper接口的类路径相同。

2、  Mapper接口方法名和Mapper.xml中定义的每个statement的id相同

3、  Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

4、  Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同


1、输入映射和输出映射

a)      输入参数映射

b)      返回值映射

2、动态sql

a)      If标签

b)      Where标签

c)       Sql片段

d)      Foreach标签

3、关联查询

a)      一对一关联

b)      一对多关联

4、Mybatis整合spring

a)      如何整合spring

b)      使用原始的方式开发dao

c)       使用Mapper接口动态代理

















相关文章: