① if 标签
<select id="find" parameterType="demo" resultType="demo">
select * from test
<!--
where 标签中 if 有成立的会再 sql 语句后面自动添加 where
-->
<where>
<!--
if 标签判断,条件成立后会添加标签体内容 and 底层处理 第一个自动去掉 and
-->
<if test="id != null">
and id = #{id}
</if>
<if test="name != null">
and name = #{name}
</if>
<if test="phone != null">
and phone = #{phone}
</if>
</where>
</select>
----------------------------------------------------------------------------------------------------------------
② forearch 标签
<select id="in" parameterType="demo" resultType="demo">
select * from test
<where>
<!--
传入一个容器,将其中数据遍历取出
-->
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
----------------------------------------------------------------------------------------------------------------
③ sql 抽取
<!-- 抽取 sql -->
<sql id="sqlDemo" >select * from test</sql>
<select id="find" parameterType="demo" resultType="demo">
<!-- 使用抽取的 sql -->
<include refid="sqlDemo"></include>
</select>
2. 多表查询
代码语言:javascript复制
① 一对一
<!--
封装为 map
id : 唯一标识
type : 类的全限定名
-->
<resultMap id="demoMap" type="user" >
<!--
手动指定 字段 与 属性之间的对应关系
property : 属性
column : 字段
-->
<!-- 普通属性 -->
<result property="id" column="uid"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
<!-- 引用对象 -->
//方法一:
<result property="role.id" column="rid"/>
<result property="role.desc" column="desc"/>
//方法二:
<!--
property : 属性
javaType : 属性类型
-->
<association property="role" javaType="role">
<result property="id" column="rid" />
<result property="desc" column="desc" />
</association>
</resultMap>
<select id="find" resultMap="demoMap">
select *,u.id uid from user u, role r where u.rid = r.id
</select>
----------------------------------------------------------------------------------------------------------------
② 一对多
<resultMap id="demoMap" type="user" >
<result property="id" column="uid"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
<collection property="role" ofType="role">
<result property="id" column="rid" />
<result property="desc" column="desc" />
</collection>
</resultMap>
<select id="find" resultMap="demoMap">
select *,u.id uid from user u left join role r on r.id = u.rid
</select>
----------------------------------------------------------------------------------------------------------------
③ 多对多
<resultMap id="demoMap" type="user" >
<result property="id" column="uid"/>
<result property="name" column="name"/>
<result property="password" column="password"/>
<collection property="role" ofType="role">
<result property="id" column="rid" />
<result property="desc" column="desc" />
</collection>
</resultMap>
<select id="find" resultMap="demoMap">
select r.*,u.*,u.id uid from user u left join user_role ur on u.id = ur.uid join role r on ur.rid = r.id
</select>
----------------------------------------------------------------------------------------------------------------
④ 注意
- 一对多 与 多对多 的区别在于查询语句
- 常用的多表查询为 左外 select * from 表1 left [outer] join 表2 on 查询条件
二、核心配置文件
1. typeHandles
代码语言:javascript复制
① 写一个类继承 BaseTypeHandler<T> 并复写其中的四个方法
/*
T 为需要转换的类型
一般用于 Date 存入 毫秒值 到数据库
*/
public class MyTypeHandle extends BaseTypeHandler<Date> {
/*
Date ---> Long
PreparedStatement 执行对象
i 字段的位置
data 需要转换的对象
*/
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType)
throws SQLException {
preparedStatement.setString(i,date.getTime() "");
}
/*
resultSet 结果集
s 需要转换的字段字段
*/
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
return new Date(resultSet.getLong(s));
}
/*
resultSet 结果集
i 字段的位置
*/
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
return new Date(resultSet.getLong(i));
}
/*
callableStatement 执行函数
i 字段的位置
*/
public Date getNullableResult(CallableStatement callableStatement, int i)
throws SQLException {
return new Date(callableStatement.getLong(i));
}
}
----------------------------------------------------------------------------------------------------------------
② 注册
<!-- handler 为自定义类的全限定名 -->
<typeHandlers>
<typeHandler handler="com.softwareMan.typeHandle.MyTypeHandle" />
</typeHandlers>