Mybatis的 resultmap collection 标签嵌套查询(select)跨不同xml的写法

业务需求:手机商城分页获取商品的全部规格信息和规格的全部选项值。

手机规格类名称:GoodsSpecification

规格选项值类名称:GoodsSpecificationOption

Mapper接口名称:
规格接口:AdminGoodsSpecificationMapper

规格选项接口:AdminGoodsSpecificationOptionMapper

mapper.xml文件:

规格接口映射xml文件:AdminGoodsSpecificationMapper.xml

规格选项接口映射xml文件:AdminGoodsSpecificationOptionMapper.xml

springbootTest测试类:

控制台打印结果:

总结:

collection标签中的select属性填写对应接口的包路径+方法名即可跨xml

0

mybatis里设置事务自动提交

+2

MyBatis动态SQL

1.MyBatis动态SQL简介

MyBatis 功能强大,动态 SQL就是其一大特性,即拼接SQL字符串。使用过 JDBC 的同学应该有所体会,根据不同条件拼接 SQL 语句非常痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

2.动态SQL标签:if,choose (when, otherwise),trim (where, set),foreach

2.1 if标签:

注:if标签一般用于非空验证,如上例,若id为空,if标签里的代码,将不会执行,反之,则会执行。

2.2 choose(when,otherwise)标签:

注:choose(when,otherwise)标签相当于switch(case,default) ,如上例,若title 为空,when标签里的代码,将不会执行,默认执行otherwise标签里面的代码。

2.3  trim(where,set)标签:

注:假设上例传入的username,password不为空,代码就可以运行成功!但朋友们可能有疑问了,实际上执行的sql语句是什么呢?其实,sql为:select * from user where username=? and password=? 朋友们是否发现,where标签代替了sql中where关键字,但if中的and不见了。其实where标签可以自动去除是“AND”或“OR”开头的sql中的“AND”或“OR”关键字。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制sql,实现where标签的效果。代码如下:

set标签,代码如下:

注:set标签功能和where标签差不多,set标签代替了sql中set关键字,set标签可以自动去除sql中的多余的“,”

同理,trim标签也可以实现set标签的功能

2.4 foreach标签:foreach标签实现批量删除,

注:foreach标签可迭代任何对象(如列表、集合等)和任何的字典或者数组对象传递给foreach作为集合参数,当使用可迭代对象或者数组时,index是当前迭代的次数,item的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。collection标签可以填(’list’,’array’,’map’)。

foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名;

index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置;

open表示该语句以什么开始,

separator表示在每次进行迭代之间以什么符号作为分隔符;

close表示以什么结束。

3.bind

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

4.Multi-db vendor support

一个配置了“_databaseId”变量的 databaseIdProvider 对于动态代码来说是可用的,这样就可以根据不同的数据库厂商构建特定的语句。比如下面的例子:

动态 SQL 中可插拔的脚本语言
MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL 查询。

可以通过实现下面接口的方式来插入一种语言:

一旦有了自定义的语言驱动,你就可以在 mybatis-config.xml 文件中将它设置为默认语言:

除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang 属性来完成:

或者在你正在使用的映射中加上注解 @Lang 来完成:

注意 可以将 Apache Velocity 作为动态语言来使用,更多细节请参考 MyBatis-Velocity 项目。

0

Mybatis批量删除实现

Mybatis批量删除实现,本例是以曾经一个项目力的设备操作为例。

1.首先是 EquipmentMapper 接口

2.然后是 EquipmentMapper.xml

+1

JPA是什么?为什么使用JPA? JPA和Hibernate关系

JPA是什么?

JPA全称为Java Persistence API ,Java持久化API是Sun公司在java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

为什么使用JPA?

JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:

1 标准化

JPA 是 JCP 组织发布的Java EE标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。

2 对容器级特性的支持

JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

3 简单易用,集成方便

JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。

4 可媲美JDBC的查询能力

JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是hibernateHQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。

5 支持面向对象的高级特性

JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。http://791202.com/

JPA和Hibernate关系

Jpa是一种规范,而Hibernate是它的一种实现;

如果hibernate认为JPA的注解够用,就直接用。否则会弄一个自己的出来作为补充;

JPA的注解已经是hibernate的核心,hibernate只提供了一些补充。

0

如何在Eclipse中导入hibernate.cfg.xml自动提示功能需要的DTD文件?

今天在写Hibernate的时候,添加了配置文件后,发现hibernate.cfg.xml没有提示功能。这是因为没有设置DTD文件的问题,不是同一个版本的。重新导入了DTD文件就好了。同样的情况下,可以通过导入DTD的文件实现自动提示功能。

如下图

具体给 hibernate.cfg.xml 配置文件增加自动提示操作步骤

1、打开Eclipse,依次选择【window】->【preference】->【xml】->【xml catalog】

2、选中 user specified entried,选择左边【Add..】按钮,依次填写三项操作

  1. location:选本地hibernate-mapping-3.0.dtd所在路径。这个文件在hibernate文件中,需要我们下载加压好的。(例如,我使用的是hibernate-release-4.1.1.Final版本,路径是:D:\Hibernate\hibernate-release-4.1.1.Final\project\hibernate-core\src\main\resources\org\hibernate。 )
  2. Key type:URI。在type一定要选URI。
  3. Key:http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd。可以在dtd文件里找到,key就将hibernate配置文件中的dtd文件粘上去就可以了。或者直接贴这个也行。

3、关闭配置文件,重新打开即可。如果不行检查一下XML文件的打开方式。选择【XML Editor】

自动提示效果

0

Eclipse里Spring MVC4+Spring 4+Mybatis3+junit4+Maven3.0 整合搭建

创建maven工程

点击Eclipse菜单栏File->New->Ohter->Maven->选择项目目录->next->选择项目类型

搜索web,创建项目->next

填写groupId和artifact Id->finish

项目配置

右击项目-new

创建如下几个文件

配置build path

分别修改输出路径为

  • src/main/resources对应target/classes
  • src/main/java对应target/classes
  • src/test/resources对应target/test-classes
  • src/test/java对应target/test-classes

设置JDK版本

设置部署程序集(Web Deployment Assembly)

把两个test目录去掉!!!

到此项目算是部署完成了。

spring mvc+spring+mybatis配置

pom.xml文件

web.xml

dispatcher-servlet.xml

applicationContext-bean.xml

mybaitis.xml

单元测试代码

0

SpringBoot里MyBatis打印SQL语句到控制台的方法总结

一、在log4j里配置

将log4j运行级别调到DEBUG,添加如下配置

二、在mybatis.config.xml里配置

若在SpringBoot中,可以修改application.yml文件达到同样效果

0

MyBatis批量插入insert方法总结

一、使用mybatis foreach标签

foreach主要用在构建in条件中,它可以在SQL语句中迭代一个集合。

foreach元素的属性主要有:item、index、collection、open、separator、close。

item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了

演示代码:

这种方式是使用foreach标签进行sql执行语句的拼接以达到批量插入的操作,但此方式有限制,那就是不同的数据库服务器可执行的sql长度是不同的,处理大批量的数据时需慎用这种方式。

二、mybatis的ExecutorType.BATCH

Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql,而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优。但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的。

2.1 将插入语句改为单条插入

2.2 然后使用for循环反复执行

在获取SqlSession时修改执行器为BATCH类型即可。

2.3 SqlSessionTemplate配置

0