mybatis

Posted syhl

tags:

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

Maybatis是作为封装持久层的半orm(对象关系映射)的框架,是让程序员将精力更多的放入在sql语句中

一、导入jar包

技术图片

 

 

    log4j:为运行日志jar包

 mybatis jar包

 链接数据库的mysqljar包

二、配置xml文件

  使用xml文件主要是可以更好的能够进行对此进行扩容和修改,只需要对xml的文件进行配置和修改,不需要进行对源码的修改,减少了代码的耦合性,大大减少了工作的扩容和修改的难度。

  1、配置mybatis的全局配置文件

    主要配置链接数据库的数据,以及属性的设置,引入mapper xml文件

技术图片

 

     dtd是引入mybatis的约束

 技术图片

 

 

 技术图片

 

 

 此标签是为了引入数据库信息

 

environments标签内主要配置的是数据库信息

mapper标签是引入每个表的mapper信息

   

  2、配置mapper xml文件

    一般一个表对应一个mapper xml文件,一个dao类,一个pojo;mapper xml文件主要是进行sql语句的增删改查,以及对输入,输出值的映射。

技术图片

 

 

 dtd是引入mapper的约束

namespace是命名空间,作用是将sql语句进行空间隔离

mapper中写入增删改查的标签

 

三、增删改查

  在mapper的xml文件中配置增删改查标签,并写入相应的sql语句

 

技术图片

 

 

 使用select标签,id标识这个标签,作用是进行调用的标识;

parameterType 是输入的类型:

  当是基本数据类型时且只有一个时,占位符的接收名可以时任意名字;

  如果是基本数据类型时且多个时,占位符的接收名要与传入参数的名字进行对用,但xml进行解析式进行键值对的形式进行解析,有两种方式解决方法 1、将占位符的接收名命名成系统默认的名字paramet1 .。。。2、使用@Param("")   给基本数据类型命名,或者是非键值对的形式进行命名

   引用 类型时,需要占位符的接收名与传参的Java的属性值名称一致

resultType是输出映射类型

  查询的结果需要进行类型的确认,基本类型和引用类型,引用类型需要返回的字段类型与字段一致

  查询用*号降低数据库的性能,如此需要进行字段名查询,但是字段名的过于冗长,可以进行拼接

技术图片

 

 

 sql里进行字段名的定义

技术图片

 

 

在查询字段名时进include标签 ,根据id的引入字段名

增删改没有返回值,其他与查找类似

技术图片

 

 

 

四、测试

1、加载config全局配置文件

2、生成sqlsesionfactory

3、由sqlsesion工厂生成sqlsesion

4、由sqlsesion进行操作数据库,调用sql语句,(传入参数namespace.id名)

5、如果是对数据库的数据进行改变的操作,需要进行确认的操作。

技术图片

 

 

 注意:在修改数据库时,在mybatis的事务是进行手动提交的,只有在提交事件的以上全部执行成功才会进行事务提交,并数据进行改变,如此是为了避免在同一关联事件中,只执行其中的一个事件,其他事件失败,数据出现的不准确事件,例:在转账的事件中,转账者的钱减少,接受者的钱增加,只有两个同时成功,数据库的才会确认改变,只有一个成功,则不进行提交

 

五、数据库与Java属性的数据不同处理

数据库的命名习惯会出现许多的下划线等命名,在Java中的属性名的命名习惯中不会出现这种命名方式,Java的属性命名习惯是驼峰命名法:第一个单词小写,第二个单词开始首字母大写,;例:userId;如此在进行输入输出映射时会出现无法将值正确的引入到Java属性值中,或者Java的属性值无法将赋给需要查询的条件,出现了parameterMap与resultMap,两个方法类似,我们只说resultMap部分。

 

在标签中定义时,不需要使用resultType,而是使用属性resultMap,其中的值是对应标签resultMap的id,属性type是需要封装数据的全类名,在标签内填写子标签,id标签为主键的标签,column为对应的数据库列名。property对应的是Java的属性名,就是将列名数据封装到属性名中,result标签是除了主键列的其他列,其中属性的作用与id的属性一致

技术图片

 

 

 

 六、多对一或者一对一

在对数据库的数据查询时经常会出现多张表的连表查询,会出现1对1或者多对一时,需要在pojo类中进行属性封装,因为对一,所以是进行另一条数据的封装,对应的是另一张表的pojo类,如此就是定义一个改对象类型并生成set,get方法

两种查询 方式:

  1、连表查询

  进行sql语句的连表查询,返回类型的属性一定为resultMap,进行映射,其他列进行映射与其类似,在进行对象映射时,而封装对象的映射标签是association,其中property属性是指的是Java封装的对象名,JavaType是此对象的全类名,

  标签的子标签的,id与result都是进行列名与属性的映射

  技术图片

 

 

 

2、嵌套查询

  进行分步查询,先进行条件查询,查询结果作为第二个的查询的条件,返回类型的属性一定为resultMap,进行映射,其他列进行映射与其类似,在进行对象映射时,而封装对象的映射标签是association,其中property属性是指的是Java封装的对象名,JavaType是此对象的全类名,column为此次查询的条件列,属性select的属性是要调用查询语句

技术图片

 

 

 

七、一对多,多对多

  在进行数据库查询,会出现先多对多或者一对多时,进行属性封装,需要对多个值或者对象进行封装,需要进行集合的定义。

两种查询 方式:

  1、连表查询

  与1对1相似,主要是对封装集合的映射,resultmap标签定义collection标签,property定义的Java属性名,ofType属性泛型类全路径,标签的子标签的,id与result都是进行列名与属性的映射。

技术图片

 

  2、嵌套查询

  与1对1相似,在collection标签属性column为此次查询的条件列,属性select的属性是要调用查询语句

 

 技术图片

 

 

 

八、基于接口开发

  mybatis的基于接口开发是实现了接口中的方法,所以需要遵守一些实现规则

  1、接口名的全路径要与namespace的全路径一致

  2、定义的增删改查的id要与接口的方法名一致

  3、定义的返回类型要与mapper的结果类型一致

  4、传值类型要与输入类型一致,一般输入类型可以省略,系统可以直接进行传值的解析

在测试时,sqlsession直接调用getmapper方法得到接口的对象,然后由对象进行用方法。

 

九、动态sql语句

  1、if语句

    if标签属性中testt的放入条件判断语句,如果为true执行

  2、where+if语句

    where标签里放入if语句,做用是将首个and或者or进行替换成where,if语句的作用是作为i判断条件语句是否执行

  3、set+if语句

    set标签里放入if语句,作用是将最后的语句的“,”进行删除,if语句的作用是作为i判断条件语句是否执行

  4、choose(when+otherwise)语句

    此语句是作为单选的结果,类似Java的if+else if+else 在choose标签中从上往下执行,执行到条件为true时,执行完成,跳出,不执行下边的语句。

  5、trim语句

    此语句的功能是可以在开始或者结束时的位置进行增加指定字段,也可以将字段的开始或者最后的字段进行删除 

    属性:prefix是在语句开始的开头进行添加

       suffix是在语句的结尾进行添加

       suffixOverrides结尾删除某个字段

       prefixOverrides开头删除某个字段

  注意在trim替换set或者where时,如果不传入条件会出现报错

  6、sql片段在查询时就交代过,在此不在赘述

  7、foreach语句,一般是在一个列名查询,且进行多个时,

    foreach标签中 collection对应的接收的集合名,遍历哪个对象的

    open属性是此遍历开始的需要加入的字段

    separator:遍历后值与值之间的字段

    close:遍历完成后的添加的字段

  技术图片

技术图片

 

 技术图片

 

 十、mybatis generator(mybatis的逆向工程)

    因为pojo,接口,mapper都是基于数据库中的表格进行创建的,所以只要根据数据库,就可以创建出这三种类型,也是是为了简化程序员创建pojo类、接口、以及mapper

 

  1、导入jar包

  技术图片

 

   2、引入xml配置文件

  技术图片

 

 引入约束文件

技术图片

 

 配置数据库相关信息

技术图片

 

 配置pojo类的地址

技术图片

 配置mapper xml文件的地址

技术图片

 

 配置接口的地址

技术图片

 

 表信息

schema:数据库名

tableName:表名

domainObjectName:pojo类名

技术图片

 

 是将复杂的sql语句以及方法不生成

技术图片

 

是生成Java属性名进行驼峰命名方式

<commentGenerator>
  <property name =“suppressAllComments”value =“true”/>
</ commentGenerator>

禁制生成注释

注意:在进行表格命名时尽量不要使用user命名

在进行禁制生成注释时,如果其他数据库有此表名,生成的mapper.xml文件中会生成此数据库的xml文件,会出现xml文件生成多个重复信息

 

在测试类中执行,生成pojo类,mapper,接口

技术图片

 

 十一、分页插件(pagehelper)

  1、引入jar包

技术图片

 

 技术图片

 

 注意jar包的版本的不同会出现版本冲突

  2、xml文件配置

在mybatis的文件配置,引入配置,进行拦截

技术图片

 

 interceptor:为包中的核心类的位置

引入位置要在environments之上

在测试类中直接调用PageHelper类的静态方法startPage,参数是当前页码,显示条数

将查询结果直接放入Pageinfo的构造方法中;

技术图片

 

 十二、其他

  $与#区别

  $相当于Statement,进行sql语句拼接,传参不进行任何修饰,需要进行引号进行修饰,会产生sql注入,一般不适用,但在写入列名时需要使用此占位符

  #相当于PreparedStatement,进行占位符的,传参进行后不需要对占位符进行任何修饰,可以避免sql注入

 

以上是关于mybatis的主要内容,如果未能解决你的问题,请参考以下文章

MybatisMyBatis 注解方式的基本 用法

MybatisMyBatis之缓存

MyBatisMyBatis的增删改查

Mybatismybatis登录实例

MybatisMybatis基础(中)

MybatisMybatis缓存