MyBatis映射文件深入

MyBatis映射文件深入

在实际开发中执行查询SQL语句,经常需要多个参数。那么parameterType属性值的数据类型是什么呢?可以使用是用Map集合的键值对来传递多个参数; 也可以使用JavaBean对象封装多个参数

使用Map传递多个参数

先写一个在UserMapper接口中添加下面的抽象方法

/*查询姓张的男性用户信息*/
public List<User> selectAllUserByCondition(Map<String,Object> map);

在UserMap.xml映射文件添加下面的代码

 <!--查询姓王的所有用户信息-->
<select id="selectAllUserByCondition" resultType="com.itheima.domain.User" parameterType="map">
     select * from user where uname like concat('%',#{uname},'%') and usex=#{usex}
</select>

创建UserMapperTest3测试类,在测试类中进行测试

/*演示使用map接口传递多个参数*/
@Test
public void test(){
    InputStream in = null;
    try {
        in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = ssf.openSession();
        //获取UserMapper接口映射对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //准备查询参数,
        HashMap<String,Object> map=new HashMap<String, Object>();
        map.put("uname","王");
        map.put("usex","男");
        //将查询参数传递sql语句
        List<User> users = mapper.selectAllUserByCondition(map);
        for (User user : users) {
            System.out.println(user);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

使用JavaBean传递多个参数

先在UserMapper接口中加入下面的方法

 /*查询姓王的女性用户的信息*/
 public List<User> selectAllUserByJavaBean(User user);

再到UserMapper映射文件中加入下面的代码

<!--查询姓王的所有用户信息-->
<select id="selectAllUserByJavaBean" resultType="com.itheima.domain.User" parameterType="user">
    select * from user where uname like concat('%',#{uname},'%') and usex=#{usex}
</select>

在UserMapperTest3测试类中,加入下面的代码进行测试

/*演示使用JavaBean对象传递多个参数*/
@Test
public void test1(){
    InputStream in = null;
    try {
        in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = ssf.openSession();
        //获取UserMapper接口映射对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //准备查询参数,
        User user=new User();
        user.setUname("王");
        user.setUsex("女");
        //将查询参数传递sql语句
        List<User> users = mapper.selectAllUserByJavaBean(user);
        for (User u : users) {
            System.out.println(u);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

JavaBean主键自动回填

在MySQL等数据库的表格中可以设置主键自动增长,当添加数据时JavaBean对象并不用给主键赋值,添加完数据之后把自动生成的主键值回填给JavaBean对象

在UserMapper的映射文件中为<insert>标签加入keyPropertyuseeGeneratedKeys属性就可以了,代码如下

<!--添加一个用户-->
<insert id="addUser" parameterType="com.itheima.domain.User"  keyProperty="id" useGeneratedKeys="true">
    insert into User(uname,usex) values(#{uname},#{usex})
</insert>

在UserMapperTest3测试类中进行测试,代码如下

public class UserMapperTest3{
    /*演示主键回填*/
    @Test
    public void test2(){
        InputStream in = null;
        try {
            in = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
            SqlSession sqlSession = ssf.openSession();
            //获取UserMapper接口映射对象
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);

            //创建User对象,封装要添加的数据(注意没有给主键id)
            User user=new User();
            user.setUname("王三毛");
            user.setUsex("男");
            int count = mapper.addUser1(user);
            System.out.println("影响的行数:"+count);
            System.out.println("回填的主键是:"+user.getId());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用Map存储结果集

在任意的select语句中都可以使用Map存储结果集,现在UserMapper接口中添加一个抽象方法

/*查询所有的用户信息,存储到Map集合中*/
public List<Map<String,Object>> selectAllUserMap();

在UserMapper映射文件中添加下面的代码

<!--查询所有用户信息,使用map集合存储结果集-->
<select id="selectAllUserMap" resultType="map">
    select * from user
</select>

在UserMapperTest3测试类中,添加下面的测试方法

/*演示查询结果,使用Map集合存储*/
@Test
public void test3(){
    InputStream in = null;
    try {
        in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = ssf.openSession();
        //获取UserMapper接口映射对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //查询所有的用户信息,每一个用户信息使用Map集合存储,再把Map集合存入List集合
        List<Map<String, Object>> maps = mapper.selectAllUserMap();
        for (Map<String, Object> map : maps) {
            System.out.println(map);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

使用JavaBean存储结果集

如果JavaBean对象的属性名和select语句结果集的字段名不一致,就不能正确的把结果集中的数据填充到JavaBean对象中。我们可以采用<resultMap>元素,自定义结果集与JavaBean对象的映射关系。

定义一个MapUser类,用户存储结果集的数据。

public class MapUser {
    private Integer u_id;
    private String u_name;
    private String u_sex;
  	//此处省略了get和set方法
    @Override
    public String toString() {
        return "MapUser{" +
                "u_id=" + u_id +
                ", u_name='" + u_name + '\'' +
                ", u_sex='" + u_sex + '\'' +
                '}';
    }
}

在UserMapper映射文件中配置<resultMap>元素,其属性type引用Javabean类

<!--配置resultMap元素-->
<resultMap type="com.itheima.domain.MapUser" id="myResult">
    <!--id表示那一个列是主键列-->
    <id property="u_id" column="id"/>
    <!--result表示查询结果,property表示User类的属性;column表示查询结果的列名-->
    <result property="u_name" column="uname"/>
    <result property="u_sex" column="usex"/>
</resultMap>

在UserMapper映射文件中配置select语句,其属性resultMap引用<resultMap>元素的id

<!--查询所有用户-->
<select id="selectResultMap" resultMap="myResult">
    select * from user
</select>

在UserMapperTest3测试类中进行测,代码如下

/*演示resultMap自定义结果集*/
@Test
public void test4(){
    InputStream in = null;
    try {
        in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession = ssf.openSession();
        //获取UserMapper接口映射对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //查询所有的用户信息
        List<MapUser> listResutMap = mapper.selectResultMap();
        for (MapUser mapUser : listResutMap) {
            System.out.println(mapUser);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值