目录
5.2.3 在 UserDao.xml 文件中编写 模糊查询代码
5.2.4 在 TestUserDao 中编写 模糊查询代码
5.3.2 字段与属性名不一致问题解决(方案二)(推荐)(resultMap)
五、Mybatis参数的深入了解
5.1 parameterType(输入类型)
5.1.1 传递简单类型
int -- int 或者 java.lang.Integer
string -- string 或者 java.lang.String
别名不区分大小写
5.1.2 传递 pojo 对象
com.cpz.domain.User -- username、address、sex、birthday、id
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
5.2 通过 pojo 对象传递条件
5.2.1 创建 QueryVO 类(包装User类)
package com.cpz.domain;
public class QueryVO {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
5.2.2 在 UserDao 接口中编写 模糊查询代码
//使用QueryVO完成模糊查询
List<User> findUserByQueryVOLike1(QueryVO queryVO);
5.2.3 在 UserDao.xml 文件中编写 模糊查询代码
<!--使用QueryVO完成模糊查询-->
<select id="findUserByQueryVOLike1" parameterType="com.cpz.domain.QueryVO" resultType="com.cpz.domain.User">
select * from user where username like #{user.username}
</select>
5.2.4 在 TestUserDao 中编写 模糊查询代码
//通过QueryVO模糊查询
@Test
public void findUserByQueryVOLike(){
QueryVO queryVO = new QueryVO();
User user = new User();
user.setUsername("%王%");
queryVO.setUser(user);
List<User> list = userDao.findUserByQueryVOLike1(queryVO);
for (User u : list) {
System.out.println(u);
}
}
5.3 resultType(输出类型)
5.3.1 数据库中的字段与对象中的属性不一致问题
这里我们在原有代码基础上进行修改,分别修改User.java,UserDao.java等文件
修改User.java文件
package com.cpz.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int userId;// 主键ID
private String userName;// 用户姓名
private String userSex;// 性别
private Date userBirthday;// 生日
private String userAddress;// 地址
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userSex='" + userSex + '\'' +
", userBirthday=" + userBirthday +
", userAddress='" + userAddress + '\'' +
'}';
}
}
5.3.2 字段与属性名不一致问题解决(方案一)
添加、修改操作:我们选择修改OGNL表达式的参数值,让它们与实体类中的属性名一致
<!-- 查询所有 -->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
<!--保存用户-->
<insert id="saveUser" parameterType="com.itheima.domain.User">
<!-- 配置插入操作后,获取插入数据的id -->
<selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday})
</insert>
查询操作:我们选择给每个字段起别名的方式,别名分别为实体类中的属性名
<!-- 查询所有 -->
<select id="findAll" resultType="com.itheima.domain.User">
select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;
</select>
5.3.2 字段与属性名不一致问题解决(方案二)(推荐)(resultMap)
第一步:在 UserDao.xml 中的 <mapper> 下定义 <resultMap>
<!--如果数据库的字段和实体类中的属性名称不一致,结果封装null,使用resultMap
id :封装主键的映射
result :封装普通字段的映射
property="":实体中属性的名称
column="":数据库中字段的名称
-->
<resultMap id="userMap" type="com.cpz.domain.User">
<id property="userId" column="id"></id>
<result property="userName" column="username"></result>
<result property="userBirthday" column="birthday"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
</resultMap>
第二步:修改 UserDao.xml 中的语句
将语句中 resultType="com.cpz.domain.User" 修改为 resultMap="userMap",这里 userMap 指向 <resultMap> 中的 type
<select id="findAll" resultMap="userMap">
select * from user
</select>