具体可以参见MyBatis中文开发文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
我所述的主要有常用的几个标签和属性
一、parameterType
parameterType:入参值,与接口中对应方法的参数一致,id要与方法名一致。它可以:
1、传递简单数据类型 (如:Integer、String)
2、传递pojo对象 (如:com.jjxy.pojo.User)
3、传递包装pojo对象 (如:在查询的时候传入很多属性,但是这些属性只是该类的部分属性,这时候我们可以创建一个包装类实现)ParameterType传递包装类具体的实现:
包装类:QueryVo,里面有pojo类并生成它的set和get方法。然后在Mapper.xml文件中,sql语句传入的参数类型就是QueryVo。
其实就是原始类属性的部分封装。
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
二、resultType 、resultMap
1.返回简单类型 2、pojo、list只需设置集合类的数据类型 3、resultMap 配置数据库字段和实体属性之间的映射关系,在引入映射
<?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">
<mapper namespace="com.jjxy.mapper.OrderMapper">
<!-- 配置数据库字段和实体属性之间的映射关系
定义resultMap-->
<resultMap id="order_list_map" type="order">
<!-- id用于映射主键 -->
<id property="id" column="id"/>
<!-- 普通属性映射 -->
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
</resultMap>
<!-- 引用resultMap -->
<select id="getOrderList" resultMap="order_list_map">
select *from `order`
</select>
</mapper>三、sql标签
这个元素可以用来定义可重用的 SQL 代码片段,以便在其它语句中使用。 参数可以静态地(在加载的时候)确定下来,并且可以在不同的 include 元素中定义不同的参数值。比如:
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
这个 SQL 片段可以在其它语句中使用,例如:
<select id="selectUsers" resultType="map">
select
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
from some_table t1
cross join some_table t2
</select>四、mybaits错误解决:There is no getter for property named 'id' in class 'java.lang.String'
产生错误的原因:在使用mybaitis传参数的时候,如果仅传入一个类型为String的参数,那么在 xml文件中应该使用_parameter来代替参数名,这也是在我初学时令我头痛的一个问题。 具体解决路口:https://blog.csdn.net/aitcax/article/details/44337271
5、 sql动态查询标签 官方中文文档:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
①:if
②:where
<!--2、where标签 :自动补上where关键字,同时处理多余的and -->
<!-- 根据用户的用户名和性别来查询用户 -->
<select id="getUserByPojo" parameterType="user" resultType="com.jjxy.pojo.User">
SELECT *from user
<where>
<if test="username !=null and username != ''">
username LIKE '%${username}%'
</if>
<if test="sex !=null and sex !=''">
and sex = #{sex}
</if>
</where>
</select>③:foreach
<!--4、 foreach标签
collection :要遍历的集合
open:循环开始之前输出的内容
item:设置循环变量
separator :分隔符
close: 循环结束之后输出的内容
-->
<!-- 查询id为 1,2,3,5的用户信息 -->
<select id="getUserByIds" parameterType="QueryVo" resultType="user">
SELECT *from USER
<where>
/*目的输出 id in(1,2,3,5)*/
<foreach collection="ids" open="id in(" item="uid" separator="," close=")">
#{uid}
</foreach>
</where>
</select>
</mapper>五、处理表映射时用到的标签
具体完成映射关系可先参见:https://blog.csdn.net/sinat_41803693/article/details/103736479 与Hibernate框架类似,在处理映射关系时,MyBatis与其类似。
①:一对一、一对多,一方的一方标签
关联(association)元素处理“有一个”类型的关系。 比如,在我们的示例中,一个博客有一个用户。关联结果映射和其它类型的映射工作方式差不多。 你需要指定目标属性名以及属性的javaType(很多时候 MyBatis 可以自己推断出来),在必要的情况下你还可以设置 JDBC 类型,如果你想覆盖获取结果值的过程,还可以设置类型处理器。
关联的不同之处是,你需要告诉 MyBatis 如何加载关联。MyBatis 有两种不同的方式加载关联:
- 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
- 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
<!-- 配置一对一的映射关系 column:主键id; javaType:类的全限定名,或一个类型别名-->
<association property="user" column="user_id" select="com.jjxy.mapper.UserMapper.getUserById"
javaType="com.jjxy.pojo.User"/>
</resultMap>
<!-- 引用resultMap 在执行getOrderById方法时,会执行引用中的getUserById方法,
从而完成对根据订单id查询订单信息并级联查询用户的信息,他们公用了一个入参,完成一
对一的映射,一对一的关系,不管在哪边都可以配置associate实现 -->②:一对多
总体思想: 一的一方(放置多的一方的集合)
多的一方(放置一的一方的对象)
a.一的一方用到的标签
(collection)标签
<!--设置一对多的关系。在一的一方设置多的一方 :集合
property :pojo类设置的集合对象属性
select :在执行根据id查询用户的时候,级联查询用户的订单。
fetchType:是否执行懒加载策略
column:数据库中的列名,或者是列的别名。传入的入参 id
ofType:Java 类的全限定名,或一个类型别名
-->
<collection property="listOrder" javaType="List" column="id" ofType="com.jjxy.pojo.Order"
select="com.jjxy.mapper.OrderMapper.getOrderList" fetchType="lazy">
</collection>