SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题

一、使用实体类的包装对象作为查询条件

在实际开发中我们的查询条件并不一定像之前那样单一,可能会用到多个对象组装起来的查询条件,比如查找某个用户对应的某个商品对象的xx属性值,这个时候就要用到多个对象作为参数,但是我们在写dom的时候传入的parameterType只能是一个实体类,那么怎么做呢,我们可以将用到的对象包装到一个实体类中,传入这个包装后的实体类,实现多对象的条件查询。

1.新建一个QueryVo类

在这里插入图片描述

2. 在里面写用到的对象

为了方便起见,这里只写一个user对象。如果有需要的话可以再添加

public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

3. 编写xml

返回结果类型为User实体类 传入参数为包装类QueryVo

因为传入参数的是QueryVo类,而如果条件是: like #{username} 而在QueryVo中
并没有username这个字段,只有user,因此要获取username,则要使用user.username来取得


    <select id="findUserByQueryVo" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo">
        select * from user where username like #{user.username}
    select>

4.编写测试类

先在user类中setUsername,再vo.setUser(user)来与user建立联系

//通过实体类QueryVo封装条件查询
    @Test
    public void testFindUserByQueryVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUsername("%老1%");
        vo.setUser(user);
        List<User> users = userDao.findUserByQueryVo(vo);
        for (User u : users){
            System.out.println(u);
        }

    }

5.测试结果

SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第1张图片

二、解决实体类和数据库列名不对应的两种方法

前提:Mybatis的前提是传入的参数要和数据库类名一样,但是在实际开发中,数据库设计的字段往往和类中字段不好统一,这个时候我们就要找到一种能够统一的方法,这里有两种方法

准备工作:将类中的字段改成不和数据库统一
改前:对应相同
SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第2张图片
SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第3张图片
改后:
SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第4张图片
测试:testFindAll()
SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第5张图片
从中发现,我们除了username还可以找到之外,其他都没有映射到包装类中,为什么呢?
这里:在windows下 数据库是不区分大小写的,所以在执行sql语句的时候,数据库将userName当成了username,在数据库中可以找到相应的字段username字段
但是由于其他字段,都有字母的增加,在数据库中找不到对应的,没法完成映射到实体类中,因此取出来都为null。

方法一、修改sql语句(取别名)

通过修改sql语句,将字段与sql列名对应起来

<select id="findAll" resultType="com.itheima.domain.User">
        select id as userId,username as userName,birthday as UserBirthday,sex as UserSex,address as userAddress from user;
    select>

你可以发现我上面UserBirthday和userBirthday并不对应…原因上面已经讲过了,windows下mysql的sql语句并不区分大小写,但是在Linux系统下是严格区分的

完美get
SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第6张图片

方法二、通过添加映射

resultMao的id为自己取的,type为映射的实体类
其中为主键字段的对应
其他字段都为

SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第7张图片

<select id="findAll" resultType="com.itheima.domain.User">
        
        select * from user;
    select>

接着 我们运行看看!
SSM学习之路——Mybatis第二天_CRUD_实体类和字段不统一问题_第8张图片

你咋骗人呢!

我们康康是什么问题

原因是 我们写了resultMap映射 但是咱没用它啊!还是用原来的select * from user
当然行不通了!此时