一、parameterType 配置参数
SQL 语句传参,使用标签的 parameterType 属性来设定
1.属性取值范围:
- 基本类型 ===> 直接写类型名称或者包名.类名
- 引用类型 ===> 包名.类名(少部分支持 直接写类名,比如 String)
- 实体类类型(POJO 类,也成javaBean)===> 全限定类名
- 实体类的包装类
2.mybatis 中使用 parameterType 传参需要注意的细节
(1)官网支持的别名
mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名
(2)mybatis如何解析 pojo 对象
mybatis 中使用 OGNL(Object Graphic Navigation Language) 表达式来解析 pojo 对象
通过对象的取值方法(get方法)来获取数据,但是在写法上把 get 给省略了(内部拼接)
类中写法
user.getUsername
OGNL表达式写法
user.username
mybatis中写法
username
(3)mybatis为什么不需要写对象名?
因为parameterType中已经提供了实体类的路径
<update id="update" parameterType="entil.User">
update user set username=#{username}, password=#{password} where officeid=#{officeid}
</update>
3.QueryVo
1.定义
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括实体类属性还包括其它的查询条件,这时可以使用包装对象传递输入参数(实际上就是一个包含实体类的类)
2.实例
(1) 持久层接口定义方法
public List<User> findUsersByQueryVo(QueryVo queryVo);
(2) 持久层接口实现类实现方法
public List<User> findUsersByQueryVo(QueryVo queryVo){
return userDao.findUsersByQueryVo(queryVo);
}
(3) Dao.xml或者Mapper.xml文件中实现语句
<!--根据 QueryVo 模糊查询;注意这里的 user 实际上是 QueryVo 的参数 User user,-->
<select id="findUsersByQueryVo" parameterType="dao.QueryVo" resultType="entil.User">
select * from user where username like #{user.username}
</select>
(4) 调用测试
UserDaoImpl userDao = new UserDaoImpl();
QueryVo queryVo = new QueryVo();
User user = new User();
user.setOfficeid(8);
user.setUsername("%1%");
user.setPassword("8");
queryVo.setUser(user);
List<User> usersByQueryVo = userDao.findUsersByQueryVo(queryVo);
for(User userTemp : usersByQueryVo){
System.out.println(userTemp.toString());
}
二、resultMap
猜想一下,如果实体类的属性名和数据库的表中的字段名不一样怎么办?这里有两种解决办法:
- 在数据库层面就行别名的设置 ===> as
- 在mybatis 层面进行 resultMap 关键字的使用
下面我们进行实验
1.修改实体类为如下:
package entil;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
private String word;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", word='" + word + '\'' +
'}';
}
}
2.此时数据库的字段值如下:
3.编辑Mapper.xml(也称Dao.xml)文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.IUserDao">
<!--resultMap 配置的是查询结果的列名和实体类的属性名之间的对应关系-->
<!--id 可以随意取,属于自定义字段;type 指明对应的实体类的全限定类名(路径)-->
<resultMap id="userMap" type="entil.User">
<!--id 用来标识这是数据库中的主键-->
<!--property 用来标识Java实体类对应的属性-->
<!--column 用来标识对应的数据库表中的列名-->
<id property="id" column="officeid"></id>
<!--result 用来标识这是普通字段-->
<result property="name" column="username"></result>
<result property="word" column="password"></result>
</resultMap>
<!--resultMap 指向上面定义的 resultMap 的 id-->
<select id="findAll" resultMap="userMap">
select * from user;
</select>
<!--使用别名时 as 左边为数据库的字段,右边为实体类的属性;效率较上面的写法高-->
<!-- <select id="findAll" resultType="entil.User">-->
<!-- select officeid as id, username as name, password as word from user;-->
<!-- </select>-->
</mapper>
4.入口类
import dao.impl.UserDaoImpl;
import entil.User;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception{
UserDaoImpl userDao = new UserDaoImpl();
List<User> all = userDao.findAll();
for(User userTemp : all){
System.out.println(userTemp.toString());
}
}