往期内容,如下
一、MyBatis简介
二、MyBatis环境搭建
三、MyBatis入门案例
四、MyBatis自定义
五、MyBatis CRUD操作
以下内容基于MyBatis CRUD操作中的代码
目录如下:
parameterType配置参数
这里我们来回顾以下OGNL表达式
OGNL是通过对象的取值方法来获取数据,在写法上表现为get省略掉
比如我们获取用户名:
- 类中的写法为:User.getUsername();
- OGNL表达式写法:user.username
那么Mybatis中为什么可以直接写username呢,而不用写成user.username
- 原因是parameterType已经提供了属性的类,所以不需要写对象名
在实际的开发中,查询条件是复杂和综合的,一般我们都是直接封装成一个查询条件的类对象
模拟操作一下
IUserDao接口定义以下代码:
/**
* 根据queryVo中的条件查询用户
* @param vo
* @return
*/
List<User> findUserByVo(QueryVo vo);
再domian
包中创建QueryVo.java
类
package com.itheima.domain;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
在IUserDao.xml
配置查询条件
<!-- 根据queryVo的条件查询用户 -->
<select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
select * from user where username like #{user.username}
</select>
编写测试方法
/**
* 测试使用QueryVo作为查询条件
*/
@Test
public void testFindByVo(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUserName("%王%");
vo.setUser(user);
//5.执行查询一个方法
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
}
resultMap(结果类型)
上面的CRUD操作都是要求数据库的列名和实体类保持一致,以下内容举例说明不一致的时候应该如何修改代码。
首先需要修改实体类User.java
package com.itheima.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer userId;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
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;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userAddress='" + userAddress + '\'' +
", userSex='" + userSex + '\'' +
", userBirthday=" + userBirthday +
'}';
}
}
还需要修改Mybatis.java
的测试方法调用到User
类的get/set
方法的地方,这就不再演示了
还有两个错误的地方需要修改:
IUserDao.xml
中的ketProperty
属性IUserDao.xml
中的OGNL表
达式
保存操作,修改IUserDao.xml
主要修改keyProperty和OGNL表达式
<!-- 保存用户 -->
<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>
查询所有操作,修改IUserDao.xml
再还未修改前运行以下,会发现除了userName
属性以前,全部都封装不进去,这是因为Mysql
再windows
环境下不区分大小写,但是再Liunx
会区分大小写
第一种解决方法:起别名
IUserDao.xml
<!-- 查询所有 -->
<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>
这种方法的执行效率是最快的,因为他是在MySQL
层面上进行执行的,不过Mybatis还提供另一种方法
第二种解决方法:配置查询结果的列名和实体类的属性名的对应关系
IUserDao.xml
<resultMap id="userMap" type="com.itheima.domain.User">
<!-- 主键字段的对应 -->
<id property="userId" 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>
<!-- 查询所有 使用resultMap,值为上面的id值-->
<select id="findAll" resultMap="com.itheima.domain.User">
select * from user;
</select>
所有的方法有用到映射
的,resultType
都要改为resultMap
,这种方法显然比不上起别名,但是这种方法减少了代码量。