1. 配置 查询结果的列名和实体类的属性名的对应关系
- 当User.java中的属性名和创建的User表中的列名不一致时,为了使程序不报错,要在IUserDao.xml中配置对应关系。
- 虽然创建表的字段名与User属性名不一致,但是表字段名与column名称一致,这样就算2个名称不相同也行。
- 一般属性名最好与表的字段名一致,避免很多麻烦。
配置如下:
2. if标签(if如果)
这里的resultType变成了resultMap,resultMap是上述配置 查询结果的列名和实体类的属性名的对应关系中已经配置好了,以后SQL语句的返回值类型都可以写resultMap=“userMap”,前提是已经配置好resultMap标签,如下。
<resultMap id="userMap" type="uSeR">
通过id名访问到type属性是com.jh.domain.User实体类
记住这里的and必须写
<!--根据if标签查询:select * from user where 1=1 and username=? and sex = ? -->
<select id="findUserByIf" resultMap="userMap">
select * from user where 1=1
<if test="username!=null">
and username=#{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
3. where标签(条件)
添加where标签可以省略 if标签中 where 1=1
<!--根据where标签查询:select * from user where 1=1 and username=? and sex = ? -->
<select id="findUserByWhere" resultMap="userMap">
select * from user <!--where标签不加where 1=1-->
<where>
<if test="username!=null">
and username=#{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
4. foreach标签(同for一样)
抽取重复的SQL语句,下面的代码include标签用到
<sql id="defaultUser">
select * from user
</sql>
<!-- 根据queryvo中的Id集合实现查询用户列表:foreach标签-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryVo">
<include refid="defaultUser"></include> <!--抽取重复的SQL语句-->
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
5. 主要代码
完整的IUserDao.xml代码
<?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.jh.dao.IUserDao">
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="uSeR">
<!-- 主键字段的对应
<id property="id" column="id"></id>
<!–非主键字段的对应–>
<result property="username" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>-->
</resultMap>
<!--配置查询所有-->
<select id="findAll" resultType="uSer">
select * from user
</select>
<!--保存用户:typeAliases配置别名,useR不再区分大小写-->
<insert id="saveUser" parameterType="useR">
<!--配置插入操作后,获取插入数据的id-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user (username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
</insert>
<!--根据id查询用户-->
<select id="findById" parameterType="INT" resultType="com.jh.domain.User">
select * from user where id=#{Uid}<!--这里id命名无所谓-->
</select>
<!--根据名称模糊查询-->
<select id="findByName" parameterType="string" resultType="com.jh.domain.User">
<!--select * from user where username like #{name}-->
select * from user where username like '%${value}%'
</select>
<!-- 获取用户的总记录条数 -->
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
<!--根据if标签查询:select * from user where 1=1 and username=? and sex = ? -->
<select id="findUserByIf" resultMap="userMap">
select * from user where 1=1
<if test="username!=null">
and username=#{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
<!--根据where标签查询:select * from user where 1=1 and username=? and sex = ? -->
<select id="findUserByWhere" resultMap="userMap">
select * from user <!--where标签不加where 1=1-->
<where>
<if test="username!=null">
and username=#{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
<!--了解的内容:抽取重复的sql语句-->
<sql id="defaultUser">
select * from user
</sql>
<!-- 根据queryvo中的Id集合实现查询用户列表:foreach标签-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryVo">
<include refid="defaultUser"></include>
<where>
<if test="ids != null and ids.size()>0">
<foreach collection="ids" open="and id in (" close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
</mapper>
IUserDao.java三个标签代码
public interface IUserDao {
/**
*根据传入参数条件:If标签
* user查询的条件:有可能是用户名,有可能是性别,也有可能是地址,还有可能是都有
* */
List<User>findUserByIf(User user);
/**
*根据传入参数条件:where标签
* user查询的条件:有可能是用户名,有可能是性别,也有可能是地址,还有可能是都有
* */
List<User>findUserByWhere(User user);
/**
* 根据queryvo中提供的id集合,查询用户信息:foreach标签
* @param vo
* @return
*/
List<User> findUserInIds(QueryVo vo);
}
User.java的主要代码
省略了set和get方法,toString()方法;另外,属性名与表的字段名不一致:Address Sex Birthday。
public class User implements Serializable {
private Integer id;
private String username;
private String Address;
private String Sex;
private Date Birthday;
}
QueryVo.java
package com.jh.domain;
import java.util.List;
public class QueryVo {
private User user;
private List<Integer> ids;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
测试的主要代码:三个标签
/**
* 测试If标签查询
*/
@Test
public void testfindUserByIf() {
User user = new User();
user.setUsername("老王");
user.setSex("女");
//5.执行查询一个方法
List<User> users = userDao.findUserByIf(user);
for (User u : users) {
System.out.println(u);
}
}
/**
* 测试where标签查询
*/
@Test
public void testfindUserByWhere() {
User user = new User();
user.setUsername("老姜");
user.setSex("女");
//5.执行查询一个方法
List<User> users = userDao.findUserByWhere(user);
for (User u : users) {
System.out.println(u);
}
}
/**
* 测试foreach标签的使用
*/
@Test
public void testFindInIds() {
QueryVo vo = new QueryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(42);
list.add(43);
vo.setIds(list);
//5.执行查询所有方法
List<User> users = userDao.findUserInIds(vo);
for (User user : users) {
System.out.println(user);
}
}