Java第三十七天,Mybatis框架系列,mybatis 参数详解

一、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

猜想一下,如果实体类的属性名和数据库的表中的字段名不一样怎么办?这里有两种解决办法:

  1. 在数据库层面就行别名的设置 ===> as
  2. 在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());
    }

}

 

 

posted @ 2020-08-01 09:56  IT蓝月  阅读(151)  评论(0编辑  收藏  举报
Live2D