继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

MyBatis3.2.x从入门到精通之第四章

HansonQ
关注TA
已关注
手记 21
粉丝 334
获赞 3452

第四章:输入映射
如果看了前几章节,这一章会很容易懂。如果是第一次看,可能会看不懂,建议从第一章开始。
重要知识点:通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。
还是老样子,以一个需求案例为引导学习这一知识点
需求:用户信息综合查询
User.java实体类:

package cn.mybatis.pojo;

import java.util.Date;

public class User {
    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", sex=" + sex
                + ", birthday=" + birthday + ", address=" + address + "]";
    }

}

用户扩展类:

package cn.mybatis.po;

import cn.mybatis.pojo.User;
/**
 * 用户扩展类
 * @author Hanson
 *
 */
public class UserCustom extends User{

}

用户包装类:

package cn.mybatis.po;
/**
 * 用户包装类型
 * @author Hanson
 *
 */
public class UserQueryVo {
    //在这里包装所需要的查询条件

    //用户查询条件
    private UserCustom userCustom;
    //可以包装其他的查询条件

    public UserCustom getUserCustom() {
        return userCustom;
    }
    public void setUserCustom(UserCustom userCustom) {
        this.userCustom = userCustom;
    }

}

疑问:
可能会有人对这边有疑问,为什么查询一个用户需要建立三个java类,而不是把所有查询条件放在user类里面不就可以了么?
其实全部放在一起也没有错,但是为了程序的扩展,我们最好不要动原始的User类,因为这个类有可能对你来说只要User里面的成员变量就够了,但是其他人也需要用的时候可能就不是这样了,因此我们最好就是自己定义一个,不该动原始的直接继承就好了。方便扩展。

UserMapper.java

package cn.mybatis.mapper;

import java.util.List;

import cn.mybatis.po.UserCustom;
import cn.mybatis.po.UserQueryVo;

public interface UserMapper {
    //用户的信息综合查询
    public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 
    编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。 
    规范:
    1、namespace等于mapper接口地址 
    2、mapper.java接口中的方法名等于mapper.xml中statement的id一致 
    3、mapper.java接口中的方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致 
    4、mapper.java接口中的方法的返回值类型和mapper.xml中statement的resultType指定的类型一致。
 -->
<mapper namespace="cn.mybatis.mapper.UserMapper">
    <!-- 
        用户信息的综合查询 的一个statement 
        #{userCoustom.sex}:取出pojo对象中包装对象性别的值 
        %${userCoustom.username}%:取出pojo对象中包装对象姓名的值
     -->
    <select id="findUserList" parameterType="cn.mybatis.po.UserQueryVo"
        resultType="cn.mybatis.po.UserCustom">
        select * from user where user.sex = #{userCustom.sex} and
        user.username like '%${userCustom.username}%'
    </select>
</mapper>

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 加载属性文件 -->
    <properties resource="db.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 加载mapper.xml映射文件 使用批量加载方式 规范:
        mapper.xml和mapper.java的名称一致并且在同一目录 
        使用的是mapper代理的方法 
    -->
    <mappers>
        <package name="cn.mybatis.mapper" />
    </mappers>
</configuration>

测试用例:

package cn.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import cn.mybatis.po.UserCustom;
import cn.mybatis.po.UserQueryVo;

public class UserMapperTest {
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception {
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources//
                .getResourceAsStream("MyBatisConfig.xml"));
    }

    @After
    public void tearDown() throws Exception {

    }

    @Test
    public void testFindUserList() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //创建UserMapper对象,mybatis自动生成mapper代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //创建包装对象
        UserCustom userCustom = new UserCustom();
        userCustom.setSex("1");
        userCustom.setUsername("张三丰");
        UserQueryVo userQueryVo = new UserQueryVo();
        userQueryVo.setUserCustom(userCustom);
        //调用userMapper的方法
        List<UserCustom> list = userMapper.findUserList(userQueryVo);
        for (UserCustom userCustom2 : list) {
            System.out.println(userCustom2);
        }
    }
}

复制代码试一试吧。
到这里基本上输入映射就学完了,下一章会介绍输出映射。


本文为慕课网作者原创,转载请标明【原文作者及本文链接地址】。侵权必究,谢谢合作!

打开App,阅读手记
11人推荐
发表评论
随时随地看视频慕课网APP

热门评论

学习了,受益匪浅,感谢楼主

这两天一干完工作,就来看看楼主的帖子

问个问题啊楼主!xml中查询的返回结果的时候,是建立扩展类,接受该返回结果好呢?还是,在xml中,写resultMap,在后台java代码中,用map去接收好呢??

请问输入映射体现在哪个方面了,还有在UserQueryVo类里包装所需要的查询条件是指的什么,能够简单举个例子吗?谢谢

查看全部评论