利用MyBatis实现条件查询的方法汇总

SQL映射文件

Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处。

它的功能强大,SQL映射文件的配置却比较简单。

使用SQL映射文件可以减少50%以上的代码量。

Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能,下面是SQL映射文件的几个顶级元素配置

1、mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespace绑定某个接口之后,就可以不写该接口的实现类,因为mybatis会根据接口的完整名称来找到对应的mapper配置来执行SQL语句。因此namespace的命名必须跟你设置的接口同名比如

2.cache:配置给命名空间的缓存

<!-- cache配置 -->
<cache
	eviction="FIFO"
 	flushInterval="60000"
 size="512"
 	readOnly="true" />

在mapper文件配置支持cache后如果需要对个别查询进行调整,可以单独设置cache,代码如下

	<select id="selectTest" resultType="int" useCache="true">
  select id from text where id = 1
 </select>

由于Mybatis框架不擅长缓存查询结果数据集,所以不对它进一步了解,所以采用OSCahe,Memcached等专门的缓存服务器做更为合理。

3.cache-ref:从其他命名空间引用缓存

4.resultMap:用于描述数据库结果集合对应关系

5.SQL:可以重用的SQL 块,也可以被其他语句引用

6.insert:映射插入语句

7.delete:映射删除语句

8.update:映射更新语句

9.映射查询语句

使用SELECT完成单条件查询

Select 元素的属性 id 命名空间中唯一的标识符,可以被用来引用这条语句

ParameterType 表示查询语句传入参数的类型的完全限定名或别名,它支持基础数据类型和复杂数据类型

除了内建的类型别名外,还可以为自定义的类设置别名,该表格只列出了部分映射,其他的别名请参考mybatis的帮助文档,ResultType 查询语句返回结果类型的完全限定名或别名。别名的使用方式与parameterType是一样的

<select id="selectTest" resultType="User" parameterType="string">
  select * from text where name = #{name}
 </select>

这是一个 id为 selectTest的SQL映射语句 ,它的参数类型为 string 也可为复杂类型,返回值是 User类型,如果使用类 做返回值的话 类中的字段设置的和数据库表的字段一致,这样可以使数据库和类中的属性自动匹配以便开发(注意如果数据库表和实体类的属性命名不一样则需要手动配置),参数类型为 #{参数名} 它会告诉Mybatis生成PreparedStatement参数 ,对于JDBC该参数会被识别成 ? 若采用JDBC来实现代码如下:

String sql = "select * from text where name = ? ";
PreparedStatement ps = new PreparedStatement(sql);
ps.setString(1,name);

由此看出,Mybatis可以节省大量的代码,如果想完成复杂一些的查询或者让配置文件更简洁些,这就需要了解select元素的属性和mybatis配置文件的属性,
介绍属性:

  • id:命名空间中的唯一标识符,可以被用来引用这条语句
  • parameterType:表示查询语句传入的参数的类型的完全限定名或别名
  • resultType:查询语句返回结果类型的完全限定名或别名

使用SELECT完成多条查询

上面只是对一个表进行查询,但是在实际操作中查询数据会有多条件,

结果也会有各种类型。

<!-- 设置resultMap的映射 -->
<resultMap id="TestMap" type="text">
	<id property="id" column="id" />
	<reuslt property="name" column="name" />
	<!-- 比如text类中有个 List<User> 的属性
	则需要使用该该标签绑定User表
	如果只是 User类型的参数的话使用 association 标签
	他们两个标签的属性差不多只,是association是javaType来指定类型
	而collection使用的是ofType来指定类型,
	多表查询时最好给每个id设置别名,以免插入到其他的id
	-->
	<collection property="userList" ofType="User">
		<id property="id" column="u_id" />
		<result property="UserName" column="UserName" />
		<result property="password" column="password" />
	</collection>
</reusltMap>
<!-- 设置多表查询 -->
<select id="textList" resultMap="TestMap" parameterType="Integer">
	select t.*,u.id = u_id,u.UserName,u.password
	from text as t,User as u where t.id = u.id and t.id = #{id}
</select>

注意Mybatis传入参数类型可以是Java基本数据类型,但是只适用于一个参数的情况通过#{参数名}即可获取传入的值,如果多参入参,需要复杂数据类型来支持,包括java实体类,Map,通过#{属性名}或#{Map 的 key}来获取传入的参数值。

使用resultMap完成查询结果的展现

在Mybatis中使用resultType做自动映射,一定要注意:字段名和实体类的属性名一致,若不一致,则需要给数据库字段 as 起别名,保证别名与属性名一致,我们还可以使用resultMap做自定义结果映射,字段名可以不一致,并且还可以指定要显示的列,比较灵活,应用也广泛,推荐使用第二种方式来做结果映射。

<resultMap type = "实体类或基本数据,他们的别名" id = "userList">
	<result property="id" column="对应数据库的id" />
	<result property="name" column="对应数据库的name" />
	<result property="password" column="对应数据库的password" />
	<result property="age" column="对应数据库的age" />
</resultMap>

resultMap元素用来描述如何将结果集映射到Java对象,此处使用reusltMap对列表展示所需的必要字段来进行自由映射,resultMap元素的属性值和子节点

  • id 属性:唯一标识,此id用于select元素resultMap属性引用
  • type 属性: 表示该resultMap的映射结果类型
  • result子节点:用于表示一些简单的属性 ,其中column 属性表示从数据库中查询的字段名,property 则表示查询出来的字段对应的值赋给实体对象的哪个属性
属性 说明
resultType resultType直接表示返回值类型,包括基础数据类型和复杂数据类型
resultMap resultMap则是对外部resultMao定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap
resultType和resultMap的关联 在Mybatis进行查询映射的时候,其实查询出来的每个字段值都放在一个对应的Map里面,其中关键字是字段名,值是其对应的值,当select元素提供的返回值属性是resultType的时候,Mybatis会将Map里面的键值对取出赋给resultType所指定对象的属性,(即调用对应对象的属性的setter方法进行填充), 注意在Mybatis的select元素中resultType 和resultMap本质是一样的,都是Map数据结构,但需要明确的一点他们是不能同时存在的,只能二选一。
resultMap的自动映射级别 在Mybatis中,使用resultMap能够进行自动映射匹配的前提是字段名和属性名需要一致,在默认映射级别(PARTIAL)情况下,若一致,即使没有做属性名和字段名的匹配,也可以在后台获取到未匹配过的属性值,若不一致,且在resultMap里没有做映射,那么无法在后台获取并输出

事务开启回滚

在使用 sqlsessionFactory获取sqlsession时给openSession(boolean)带有参数表示事务是否提交 ,不带参数不开启事务

Sqlsession = factory.opSession(false);//true 为自动提交事务

commit 提交方法

Sqlsession.commit();//提交事务

rollback回滚

Sqlsession.rollback();//回滚事务

使用INSERT完成增加操作

Mybatis实现增加操作,使用的是insert 元素来映射插入语句,操作方法很简单,先向接口定义一个方法 比如   int add(User user);

然后我们在SQL映射文件中定义一个insert节点

<!-- 增加用户 -->
<insert parameterType="User">
	insert user into(userName,password)
	values(#{userName},#{password})
</insert>

insert 的属性

  • id :与 select元素的id一样,是命名空间中唯一的标识码,可以被引用这条语句
  • parameterType :与select元素的parameterType一样,是传入的参数的类型完全限定名,别名和select元素的解释一致

对于增删改(insert,delete,update),这类数据库更新操作,需要注意:

1.该类型的操作本身默认返回默认返回执行SQL影响的行数,所以DAO层接口方法的方法值最好为int,不要为boolean类型

2.insert,delete,update元素中均没有resultType属性,只有查询需要对返回结果类型(resultType,resultMap)进行相应的指定

使用update完成修改操作

Mybatis 实现修改操作,使用的是 update元素来映射修改语句,具体用法和insert类似

<!-- 修改用户 -->
<update parameterType="User">
	update user set userName = #{userName} ,password =#{password}
	where id = #{id}
</update >

@Param注解实现多参数入参

假如我需要删除 删除 姓名 为 李XX 的数据 当数据库有很多个同名的数据 所以需要其他的条件来 确认删除那个李XX 数据 但我们 直接使用一个类对象作为参数的话,有点多余,因为我们只需要2个条件,就ok了,当由于它的参数类型时采用map的方式只有一个参数时可直接 #{任意名}来使用,但有多个参数的时候就不行了 所以这时需要@Param注解

/**
*我们需要接口方法的参数里面添加@Param注解
**/
 int update(@Param("id") int id,@Param("name") String name);

而我们在 SQL映射文件中使用参数:

<update >
	update user set userName = #{name}
	where id = #{id}
</update >

使用delete完成删除操作

Mybatis 实现删除操作,是通过使用delete元素来映射删除语句的,具体用法和update ,insert 类似

	int deleteUser(@Param("id") Integer id);

delete元素映射

<delete parameterType="Integer">
	delete from user where id = #{id}
</delete>

association

association 映射到JavaBean的某个 ‘复杂类型' 属性 比如JavaBean类,即JavaBean 内部嵌入了一个复杂数据类型(JavaBean)属性,这种情况就属于复杂类型的关联,但是需要注意:association 仅处理一对一的关联关系

实体类

class User{
	private int id;
	private String name;
	private String password;
	private text userText;
	//省略getter和setter方法
}

我们使用association来映射 User 的text属性

<resultMap type = "User" >
	<result property="id" column="id" />
	<result property="name" column="name" />
	<result property="password" column="password" />
	<association property="userText" javaType="Text">
		<id property="id" cloumn="t_id"/>
		<result property="tname" column="tname" />
		<result property="text" column="text" />
	</association>
</resultMap>

association 的属性

属性 说明
javaType 完整的Java类名或者别名,若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为
property 映射数据库列的实体对象的属性
resultMap 用于引用外部的resultMap映射

resultMap 引用外部 resultMap

<resultMap type = "User" >
	<result property="id" column="id" />
	<result property="name" column="name" />
	<result property="password" column="password" />
	<association property="userText" javaType="Text" resultMap="TextEntity" />
</resultMap>
<resultMap type = "Text" >
		<id property="id" cloumn="t_id"/>
		<result property="tname" column="tname" />
		<result property="text" column="text" />
</resultMap>

association处理一对一的关联关系,那么对于一对多的关联关系的处理这就需要用到collection元素来实现了

collection

collection 元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个复杂类型 属性,只不过这个属性是一个集合列表,即 JavaBean内部嵌套一个复杂数据类型(集合)属性,和使用association元素一样,我们使用嵌套查询,或者从连接中嵌套结果集
实体类

class User{
	private int id;
	private String name;
	private String password;
	private List<text> userText;
	//省略getter和setter方法
}

我们在接口中添加 一个方法

	public List<User> getUserIDListBy(@Param("id") Integer userid);

使用 collection实现结果映射

<resultMap type = "User" >
	<result property="id" column="id" />
	<result property="name" column="name" />
	<result property="password" column="password" />
	<collection property="userText" ofType="Text">
		<id property="id" cloumn="t_id"/>
		<result property="tname" column="tname" />
		<result property="text" column="text" />
	</collection>
</resultMap>

collection 的属性

属性 说明
ofType 完整的Java类名或者别名,若映射到一个JavaBean,则MyBatis通常会自行检测到其类型;若映射到一个HashMap,则应该明确指定javaType,来确保所需行为
property 映射数据库列的实体对象的属性
resultMap 用于引用外部的resultMap映射

collection 引用外部映射和association引用基本一致

<resultMap type = "User" >
	<result property="id" column="id" />
	<result property="name" column="name" />
	<result property="password" column="password" />
	<collection property="userText" ofType="Text" resultMap="textList" />
</resultMap>
<resultMap type = "Text" >
		<id property="id" cloumn="t_id"/>
		<result property="tname" column="tname" />
		<result property="text" column="text" />
</resultMap>

resultMap自动映射级别

设置 reultMap的自动映射级别我们需要在mybatis的核心配置文件中设置

<settings>
<!-- 设置resultMap的自动映射级别为FULL(自动匹配所有) -->
	<setting name="autoMappingBehavior" value="FULL"/>
</settings>
属性 说明
NONE 禁止自动匹配
PARTIAL(默认) 自动匹配所有的属性,但有内部嵌套的(association和collection)的除外
FULL 自动匹配所有

在使用时 如果没有设置映射级别,对于复杂类型他们是不会自动匹配的,需要手动匹配,复杂类型需要自己对association和collection的进行设置

总结

MyBatis的SQL映射文件提供 select,insert,update,delete等元素来实现SQL语句的映射

SQL映射文件的根节点是mapper元素,需要指定namespace来区别其他的mapper,保证全局唯一,并且其名称必须和接口同名,作用是绑定接口,即面向接口编程

关于MyBatis的SQL语句参数入参,对于经基础数据类型的参数数据,使用@Param注解来实现 ,复杂类型的参数直接入参即可

resultMap的association和collection都可以实现高级映射

SQL 映射文件的select的返回结果类型的映射可以使用resultMap和resultType,但它们不能同时使用

到此这篇关于利用MyBatis实现条件查询的文章就介绍到这了,更多相关MyBatis实现条件查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用MyBatis进行不同条件的like模糊查询的方法

    之前一直是用MyBatis进行SQL查询时,一般都是用Generator逆向生产的代码来进行查询. 现在遇到了一个业务问题,我们需要进行对不同的条件分别进行模糊查询,首先我想到的就是根据对需要进行模糊查询的字段进行判断,然后调用Example的方式进行查询条件的注入. 对于String类型的数据可以有Like查询这个方法,但是Integer或者Long这种数据类型的话就没有了,得需要自己动手写. 但是呢,我利用Generator生成的代码Example方式进行模糊查询时确无法实现,原因不太清楚,

  • Mybatis 条件查询 批量增删改查功能

    模糊查询: @Select({ "SELECT * FROM account where account like CONCAT('%',#{query},'%') or email like CONCAT('%',#{query},'%')" }) Account findAccountByAccountOrMail(@Param("query") String query); 批量添加: @Insert({ "<script>"

  • mybatis collection 多条件查询的实现方法

    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过. 说下自己的理解,就是一个主查询结果集里面嵌套了子查询的结果集,可以是多个子查询,每个子查询的条件从主查询结果集中获取,返回值各自定义.collection 标签的property是主查询里面集合的名字,如果有多个就再写个collection,column是子查询参数,单参数直接写主查询结合返回结果,例如直接写上us

  • 利用MyBatis实现条件查询的方法汇总

    SQL映射文件 Mybatis真正强大的是在于它的SQL映射语句,也是它的流弊之处. 它的功能强大,SQL映射文件的配置却比较简单. 使用SQL映射文件可以减少50%以上的代码量. Mybatis专注于SQL,对于开发人员来说可极大限度地进行SQL调优,以保证性能,下面是SQL映射文件的几个顶级元素配置 1.mapper 它是映射文件的根节点,只有一个属性就是 namespace(命名空间)它的作用是区分不同的mapper,里面的参数是全局唯一的,绑定DAO层接口,即面向接口编程 namespa

  • MyBatis带参查询的方法详解

    #{}占位符 类似于jdbc中通过PreparedStatement进行操作的方式, 会将sql语句中需要参数的位置使用?进行占位,后续由传进来的参数进行参数的绑定.?处绑定的都是值,不能指定表的列,转换成sql时表名会被当成字符串,会出错,防止sql注入. select username,age,password from 'tb_user' 简单类型参数 简单类型指的是: 基本数据类型, 包装类型, String, java.sql.*.当参数是简单类型时, MyBatis会忽略SQL语句中

  • MyBatis SELECT基本查询实现方法详解

    1.返回一个LIST <!-- public List<Employee> getEmpsByLastNameLike(String lastName); --> <!--resultType:如果返回的是一个集合,要写集合中元素的类型 --> <select id="getEmpsByLastNameLike" resultType="com.atguigu.mybatis.bean.Employee"> selec

  • 利用Shell解析处理XML的方法汇总

    前言 前几天在干活的时候遇到一个需要解析处理xml文件的一个需求,当时考虑到逻辑比较复杂,因此用java慢慢搞了搞.不过这个需求经常会变,每次变化之后都要重新找到jar包的代码,改了之后还要替换原来的jar包,一来不方便修改,二来不方便统一保存代码,三来也不方便查看jar包的功能. 其实对于这种比较灵活的功能,最方便高效的做法是采用一些脚本语言,比如python,ruby等等,开发效率高,而且也能处理一些复杂逻辑.但是由于种种原因,工作中有的机器没有安装这些语言的解释器.因此不得已,研究了一波用

  • MySQL中使用case when 语句实现多条件查询的方法

    举例如下: 数据表为DemoTable,字段有id, condition1,condition2,condition3,condition4,condition5 要求是查询DemoTable中,condition1,condition2,condition3,condition4,condition5五个字段中符合任意两个或两个以上的条件的内容. 可使用case when来实现这个条件,需要嵌套子查询语句 sql语句代码示例如下: 复制代码 代码如下: SELECT * FROM DemoTa

  • php通过数组实现多条件查询实现方法(字符串分割)

    复制代码 代码如下: <?php $keyword="asp php,jsp"; $keyword=str_replace(" "," ",$keyword); $keyword=str_replace(" ",",",$keyword); $keyarr=explode(',',$keyword); for($index=0;$index<count($keyarr);$index++) {

  • MyBatis中多条件查询商品的三种方法及区别

    目录 一.Sql语句设置多个参数有几种方式 二.代码附上 一.Sql语句设置多个参数有几种方式 1.散装参数:需要使用@Param标记Sql语句中占位符处的名称例如 #{name} 2.实体类封装参数 只需要保证Sql中的参数名和实体类属性名对应上,即可设置成功BrandMapper.xml中的SQL语句不用动,把TestBrandMapper中的代码修改即可 3.Map集合 只需要保证Sql中的参数名和Map集合的键的名称对应上,即可设置成功.BrandMapper.xml中Sql语句不用改

  • Mybatis Criteria使用and和or进行联合条件查询的操作方法

    之前用Mybatis框架反向的实体,还有实体里面的Example,之前只是知道Example里面放的是条件查询的方法,可以一直不知道怎么用,到今天才开始知道怎么简单的用.在我们前台查询的时候会有许多的条件传过来:先看个例子: public List<Contact> searchByExample(Contact contact) { System.out.println("searchByExampleContact"); ContactExample example =

  • mybatis plus实现条件查询

    目录 一.wapper介绍 二.常用的条件方法 1. gt 表示 > 2. le 表示 <= 3. lt 表示 < 4. isNull 表示 查询值为null 5. isNotNull 表示 查询值为不为null 6. eq 表示 = 7. ne 表示 != 8. between 表示 在范围之间,包含边界值 9. notBetween 表示 在范围之外,不含边界值 10. notBetween 表示 在范围之外,不含边界值 11. allEq 多条件查询 12. .链式编程,多条件查询

  • Mybatis中的Criteria条件查询方式

    Mybatis Criteria条件查询 Criterion Criterion是最基本,最底层的Where条件,用于字段级的筛选. Criteria Criteria包含一个Cretiron的集合,每一个Criteria对象内包含的Cretiron之间是由AND连接的,是逻辑与的关系. 其它 Example类的distinct字段用于指定DISTINCT查询. orderByClause字段用于指定ORDER BY条件,这个条件没有构造方法,直接通过传递字符串值指定. 代码示例 import

随机推荐