适合使用返回值是自定义实体类的状况java
映射实体类的数据类型sql
id:resultMap的惟一标识数据库
column: 库表的字段名缓存
property: 实体类里的属性名安全
resultType能够直接返回给出的返回值类型,好比String、int、Map,等等,其中返回List也是将返回类型定义为Map,而后mybatis会自动将这些map放在一个List中,resultType还能够是一个对象mybatis
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:当前库表映射文件的命名空间,惟一的不能重复 -->
<mapper namespace="com.hao947.sql.mapper.PersonMapper">
<!-- type:映射实体类的数据类型 id:resultMap的惟一标识 -->
<resultMap type="person" id="BaseResultMap">
<!-- column:库表的字段名 property:实体类里的属性名 -->
<id column="person_id" property="personId" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<result column="person_addr" property="personAddr" />
<result column="birthday" property="birthday" />
</resultMap>
<!--id:当前sql的惟一标识
parameterType:输入参数的数据类型
resultType:返回值的数据类型
#{}:用来接受参数的,若是是传递一个参数#{id}内容任意,若是是多个参数就有必定的规则,采用的是预编译的形式select
* from person p where p.id = ? ,安全性很高 -->
<!-- sql语句返回值类型使用resultMap -->
<select id="selectPersonById" parameterType="java.lang.Integer"
resultMap="BaseResultMap">
select * from person p where p.person_id = #{id}
</select>
<!-- resultMap:适合使用返回值是自定义实体类的状况
resultType:适合使用返回值的数据类型是非自定义的,即jdk的提供的类型 -->
<select id="selectPersonCount" resultType="java.lang.Integer">
select count(*) from
person
</select>
<select id="selectPersonByIdWithMap" parameterType="java.lang.Integer"
resultType="java.util.Map">
select * from person p where p.person_id= #{id}
</select>
</mapper>
oracle
resultType是结果集的一个映射,能够简单的写成resultType="map"或者resultType="hashmap",其中"map"和"hashmap"都是mybatis可以识别的别名,写成"java.util.HashMap"固然也没有问题,在java代码端,是这么写的: app
List<Map<String,Object>> list =sqlSession.selectList("User.test"); 测试
for(Map<String,Object> map :list){ spa
System.out.println(map.get("id")); //经过map.get("key"),就能够获取你须要的结果。
}
****************************************MyBatis如何写条件查询**************************************************
基本标签语句
<select id="" parameterType="" resultMap="xxResultMap">
sql语句
</select>
id标识该查询;parameterType指参数类型;resultMap指返回类型,这里与下面设置的resultMap关联。
做为查询语句,返回结果是一个List,当选择性的输出字段时,须要添加一个ResultMap属性与之关联。id标识主键,result标识字段。property指向实体类的属性,column指向数据库列名。
拼接条件以前须要加where关键字。
由于可能没有查询条件,因此写成where 1=1。或者用查询的必要条件拼接。
拼接条件为“=”的状况
用 if 判断是否为空,不为空则用AND拼接。变量写成#{xx}
拼接条件为"LIKE"模糊查询,适用于MySql数据库
if 条件同样,另外要用concat做拼接。
like concat('%', #{userName}, '%')
oracle数据库中,模糊查询报错“参数缺失”。
模糊查询的格式问题
法一:用"||"分隔。like '%' || #{userName} || '%'
法二:like concat(concat('%', #{userName}), '%')
Mybatis中实现传统多条件查询
数据表student以下:
已有的数据以下:
咱们如今进行以下查询:
查询表中grade>70 age>20 的女生
SQL语句天然以下:
在数据库中直接执行这句SQL语句:select * from student where sex="女" and grade>70 and age>20;
如今使用Mybatis完成这个操做:
在student.xml中添加以下配置语句:
测试语句:
由于传入的参数有多个 因此须要使用Map来传递
能够获得刚才的答案
这样的查询引出了下面三个问题:
1.没法灵活的添加条件
2.若是只想按照年龄与成绩查询 不能在sex处赋值为空 仍须要新的SQL语句
3.若是采用拼接的方式(其实这样也算改变了SQL语句)很是容易产生格式错误或者顺序错误
动态SQL:if
应用场景1:
假设咱们如今须要对student表进行两种操做:
按照如今的方式 咱们必须提供2条SQL语句分别应对这两种操做
此时咱们介绍一下动态SQL中的if标签在这里的使用:
咱们来解释一下这条SQL语句:
这条语句意味着:若是没有传入参数major 那么执行select * from student 即查询全部
若是传入了参数majo 那么执行这句模糊查询
注意:这里的<if test>中的test仅为语法 实际等于if()
测试一下这两种状况:
第二种状况:
应用场景2:
如今须要进行这种查询:
根据姓名与专业来查询数据:若是姓名为空 将只根据专业来查询 若是姓名不为空 将只根据姓名来查询
传统SQL语句以下:
select * from student where name=#{name} and major=#{major};
在上面的SQL语句中咱们发现 若是#{name}为空 那么查询结果直接为空 并不能进入“根据专业查询”这一个环节
咱们在测试中发现 根据name来查询能够获得正确结果 而name为空 试图根据major来查询时报错
这是由于当major为空 name不为空时 SQL语句以下:
咱们发现问题出在这个where上
如何解决这个问题呢?
<where>标签能够自动进行判断
若是任何条件都不成立 那么在SQL语句中不会出现where
若是有条件成立 且这个标签返回的内容是以“AND”或“OR”开头的 会自动去掉这个多出来的and或者or
在测试代码中:
<!-- 导出全部数据 -->
<select id="exportAll" resultMap="map"> SELECT t1.MEDICAL_ID AS medicalId, ADDRESS AS address, DATE_START AS dateStart, DATE_END AS dateEnd, TIME_START AS timeStart, TIME_END AS timeEnd, AMBULANCE_NUM AS ambulanceNum, NAME AS name, PHONE AS phone FROM PM.T_MEETING_MEDICAL t1,PM.T_MEETING_MEDICAL_DOCTOR t2 <where> t1.MEDICAL_ID = t2.MEDICAL_ID <if test="address != null and address !='' "> AND ADDRESS = #{address} </if> <if test="dateStart != null and dateStart !='' "> AND DATE_START = #{dateStart} </if> <if test="dateEnd != null and dateEnd !='' "> AND DATE_END = #{dateEnd} </if> <if test="meetingId != null and meetingId !='' "> AND MEETING_ID = #{meetingId} </if> </where> ORDER BY t1.ADDRESS,t1.DATE_START </select>
public List<Map<String, Object>> exportAll(MeetingMedicalVo meetingMedicalVo);//接口
resultType*****************************************************************************************************************************
resultType是结果集的一个映射,能够简单的写成resultType="map"或者resultType="hashmap",其中"map"和"hashmap"都是mybatis可以识别的别名,写成"java.util.HashMap"固然也没有问题。
说白了,即使使用resultType,mybatis也将使用resultMap进行查询结果的映射。只是映射过程咱们是看不见的,方便写代码。
resultMap中id和result的区别:这二者之间的惟一不一样是id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进总体表现,特别是缓存和嵌入结果映射(也就是联合映射) 。官方原话,简单的理解,就是当某一个列是惟一索引时,用id标签,提升效率。
MyBatis拥有自动封 装功能,只要你提供了返回类型,MyBatis会根据本身的判断来利用查询结果封装对应的对象,因此前面的简单查询中,若是你不在resultMap中明 确的指出id对应哪一个字段,title对应哪一个字段,MyBatis也会根据自身的判断来帮你封装,MyBatis的自身判断是把查询的field或其对 应的别名与返回对象的属性进行比较,若是相匹配且类型也相匹配,MyBatis则会对其进行赋值。