mybatis

 

mybatis

简介

      apache开源项目(iBatis),2010年改名为mybatis    持久层框架,对jdbc操作数据库的过程进行封装,使开发者只需关注SQL本身

通过xml或注解的方式,将statement(statement、preparedStatement、CallableStatement)配置,通过Java对象和statement中的sql进行映射生成sql语句,最后由mybatis框架执行sql并将结果映射成Java对象返回

 

配置

       SqlMapConfig.xml  全局配置文件,配置mybatis的运行环境等信息

        mapper.xml sql映射文件,配置操作数据库的sql语句,需要在SqlMapConfig.xml中加载。在mapper.xml中书写SQL语句,注意,在服务器的客户端执行通过后在写进文件,修改条件即可

 

 

架构

mybatis_第1张图片

  1.  

       对架构的详细描述

             配置配置文件

             构造SqlSessionFactory即会话工厂

             创建会话(sqlSession),操作数据库需要通过sqlSession进行

             Executor执行器接口操作数据库,Executor接口由两个实现,一个使基本执行器,一个使缓存执行器

             Mapped Statement  mybatis 底层封装对象,它包装了 mybatis 配置信息及 sql 映射信息等。 mapper.xml 文件中一个 sql 对应一个 MappedStatement 对象, sql 的 id 即是 Mapped statement 的 id。

           Mapped Statement 对 sql 执行输入参数进行定义,包括 HashMap、基本类型、 pojo, Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就是 jdbc 编程中对 preparedStatement 设置参数。

           Mapped Statement 对 sql 执行输出结果进行定义,包括 HashMap、基本类型、 pojo, Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至java 对象中,输出结果映射过程相当于 jdbc 编程中对结果的解析处理过程。

 

 

#{}与${}

   #{} 占位符号,可有效防止sql注入,字符串类型自动加引号 简单类型 #{}中可以写value或id 建议能用#{}就不用${}

    ${} 拼接sql串 占位符号,有sql注入风险,字符串类型不加引号 。简单类型 #{}中只能写value 一般用于传递数据库对象,传入表名

 

 

parameterType 和 resultType resultType   输入/输出映射(类型转换) 

      parameterType 输入参数类型

       paremeterMap 输入结果类型

      resultType     输出结果映射

 

selectOne与selectList

        selectOne 查询一条记录,若查询则抛出异常(TooManyResultsException)

        selectList查询一条或多条记录

 

 

mybatis在JDBC编程问题上中的解决方案

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

           将SQL语句配置在xxxmapper.xml中,实现与Java代码分离

           自动将Java对象映射至sql语句,通过statement中的parameterType定义输入参数类型

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

 

 

mybatis核心对象

         SqlSessionFactory接口  SqlSessionFactoryBuilder对象创建,定义了openSession的不同重载方法,不需要每次操纵数据库是都重新创建,最佳使用单例模式

          SqlSession 面向用户的接口,定义数据操作,默认使用DefaultSqlSession实现类 由SqlSessionFactory创建,每个线程都有自己的SqlSession对象,线程不安全,放在方法内最佳,在finally块中关闭

 

 

SalMapConfig.xml配置文件

       properties 属性  引入外部属性配置文件(db.properties)

                 

      typeAliases 类型别名

                 

 

mappers(映射器) 指定Mybatis映射文件的位置

相对于类路径

绝对路径

  绝对路径

mapper类的全路径    mapper接口和mapper映射文件要名称相同,且放到同一个目录下

指定包下的所有映射文件 mapper接口和mapper映射文件要名称相同,且放到同一个目录下 批量添加

 

 

Mapper动态代理方式

     实现原理

               只需编写Mapper接口即可,由Mybtatis框架根据接口定义创建接口的动态代理对象

 

     Mapper接口开发需遵循的规范

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

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

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

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

 

加载Mapper.xml文件

注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

                        注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

 

selectOne和selectList   根据mapper接口的返回值决定调用哪个方法

namespace  建议使用mapper代理方法开发mapper接口,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

 

 

Mapper.xml

定义操作数据库的sql,每个sql是一个statement,mybatis的核心

        parameterType(输入参数)

                          传递简单类型

                          传递pojo对象

                          传递map

                          传递多参数 利用#{index} 索引 从0开始

 

           resultType(输出类型)

                         输出简单类型

                        输出pojo对象

                        输出pojo列表

         //输出 pojo 对象和输出 pojo 列表在 sql 中定义的 resultType 是一样的。

 

           resultMap 指定pojo将查询结构映射为pojo,需要pojo的属性名和sql查询的列名一致方可映射成功。如果 sql 查询字段名和 pojo 的属性名不一致,可以通过 resultMap 将字段名和属性名作一个对应关系 , resultMap 实质上还需要将查询结果映射到 pojo 对象中。

:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段

为复合唯一约束则定义多个

Property:表示对应实体类的属性。

Column:表示 sql 查询出来的字段名。 即数据库表的字段名

Column 和 property 放在一块儿表示将 sql 查询出来的字段映射到指定的pojo 类属性上。

 :普通结果

解决表中类名与实体类中属性不一致的问题

解决映射为复杂类型的 pojo

 

 

动态sql  各种标签方法实现动态拼接 sql。

标签

if 判断 常用条件 !=null&&!=’’

where 自动处理多余的And和OR

set 使用元素组合进行 update 语句动态 SQL 组装时,如果内包含的内容都为空,则会出现 SQL 语法错误

foreach 用于数组和集合的循环遍历

collection:配置的是传递过来的参数类型,它可以是一个 array(数组)、 list(list 集合)、

map 集合的键,或者是 POJO 包装类中数组或集合类型的属性名。

item: 循环中当前的元素

index: 当前元素在集合的位置下标

open:循环开始

close:循环结束

separator:中间分隔符

          注意(collection) 必须指定若传入的是单个参数类型是数组和list时可以分别时array和list

               若传入多个参数,封装成map,属性值为map ,遍历时 index=key, item是map的值

                 若传入参数是POJO包装类,属性值就是该包装类中需要进行遍历的数组或者集合的属性、

 

Sql 片段   Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的,

        

                  and id=#{id}

        

                  and username like '%${username}%'

        

 

 

mapper映射开发步骤:

写sql

验证sql

添加到mapper.xml

定义接口方法

测试方法

 

 

获取插入数据的id

方式一

        

                  select LAST_INSERT_ID()

        

         insert into user(username,pwd,birthday,sex,address)

         values(#{username},#{pwd},#{birthday},#{sex},#{address})

        

方式二

useGeneratedKeys="true">

insert into user(username,birthday,sex,address)

values(#{username},#{birthday},#{sex},#{address})

 

 

SqlSession调用close()后,归还到线程池

jdbc获取的Session调用close()后,是销毁了

 

 

解决表中类名与实体类中属性不一致的问题

SQL语句中设置别名

resultMap  输出结果映射

 

 

多表联查

.vo包  创建对应的类

 

核心

对JDBC的封装

持久层框架

ORM

 

 

工作原理

配置文件 (SqlMapConfig.xml和Mapper.xml)

创建会话工厂 SqlSessionFactory

获取Sql连接  SqlSession

Executor 执行器接口操作数据库

对sql输入和输出参数进行设置

操作数据库

 

与JDBC比较

不同:

        优势

Mybatis优化获取和释放

Mybatis对数据库进行存取操作

Mybatis生成动态sql语句

Mybatis能够对结果集进行映射

        不足

jdbc直接操作底层,效率更高。

访问数据库代码的复杂性和重复性。

 

你可能感兴趣的:(mybatis)