MyBatis学习8之入门案例输入输出控制、ResultMap示例


一、pojo实体类创建?

1.在pojo中创建User类

package com.pp.pojo;

import java.util.Date;
import java.util.List;

public class User {

  private Integer id;
  private String username;
  private Date   birthday;
  private String sex;
  private String address;
  private List<Orders> ordersList;

    public List<Orders> getOrdersList() {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", ordersList=" + ordersList +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

User类中写的对应就是数据库中的usr表中的每一个属性,然后使用的set()和get()方法,又利用tostring()方法方便输出验证结果使用。

2.在com.pp.pojo包下创建QueryVo类

package com.pp.pojo;

public class QueryVo {
    private User usser;

    public User getUsser() {
        return usser;
    }

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

创建的QueryVo类中创建了一个user对象,然后创建了get()和set()方法。

3.在pojo中创建order类

这个类再resultMap查询方法中会使用到该类

package com.pp.pojo;

import java.util.Date;

public class Orders {
     /* `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
            `number` varchar(32) NOT NULL COMMENT '订单号',
            `createtime` datetime NOT NULL COMMENT '创建订单时间',
            `note` varchar(100) DEFAULT NULL COMMENT '备注',*/
     private Integer id;
     private Integer userid;
     private String number;
     private Date  createtime;
     private String note;

    public Integer getId() {
        return id;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", userid=" + userid +
                ", number='" + number + '\'' +
                ", createtime=" + createtime +
                ", note='" + note + '\'' +
                '}';
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserid() {
        return userid;
    }

    public void setUserid(Integer userid) {
        this.userid = userid;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
}

order类中写的对应就是数据库中的order表中的每一个属性,然后使用的set()和get()方法,又利用tostring()方法方便输出验证结果使用。

二、通过用户名和性别查询(QueryVoByUserList)

1.在com.pp的mapper包下的UserMapper类中定义抽象方法

代码如下(示例):

import com.pp.pojo.QueryVo;
import com.pp.pojo.User;

import java.util.List;

public interface UserMapper {
	 List<User> QueryVoByUserList(QueryVo queryVo);
}

2.在com.pp的mapper包下的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 namespace="com.pp.mapper.UserMapper">

    <select id="QueryVoByUserList" parameterType="com.pp.pojo.QueryVo" resultType="com.pp.pojo.User">
           select *  from user where username like  '%${usser.username}%' and sex=#{usser.sex}
    </select>
</mapper>

<select>中id填写方法明;parameterType入口参数填写具体指向的类路径,这里填写com.pp.pojo.QueryVo;resultType放回参数写返回的参数类型路径,这里写com.pp.pojo.User。这里的where条件查询,参数要写类名.属性。这里填写的是user.username和user.sex,即根据用户名和性别去查询。

2.编写测试类,详见fun7()方法

import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserTest {
    private SqlSessionFactory factory;
    @Test
    @Before
    public void Setup() throws IOException {
        String res="SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(res);
        factory=new SqlSessionFactoryBuilder().build(inputStream);
    }
     @Test
    public void fun7(){
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        QueryVo queryVo = new QueryVo();
        User user = new User();
        user.setSex("男");
        user.setUsername("张");
        queryVo.setUser(user);
        List<User> list = mapper.QueryVoByUserList(queryVo);

        System.out.println(list);
    }
 }

  由于QueryVoByUserList()方法的参数传递的是一个queryVo,所以需要创建一个queryVo类,而该类中有一个setUser()的方法用来构造user类,所以还需要创建User对象,在利用User的Set()方法去给user对象赋值,然后再把user对象作为queryVo.setUser()方法的参数传递进去。最终调用mapper.QueryVoByUserList(),将queryVo对象传递进去即可。

三、查询数据库中表的行数

1.编写UserMapper抽象类方法

import com.pp.pojo.QueryVo;
import com.pp.pojo.User;
import java.util.List;
public interface UserMapper {
	Integer findUserCount();
}

2.编写UserMapper.xml中的sql语句

<?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 namespace="com.pp.mapper.UserMapper">
	 <select id="findUserCount" resultType="int">
       select count(*) from user
    </select>
</mapper>

这里的查询语句id填写fingUserCount,结果返回一个int类型的值,使用的sql语句是select count(*) from user查询user表中的所有用户。

3.再测试类UserTest中写fun8()方法

 @Test
    public void fun8(){
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Integer userCount = mapper.findUserCount();
        System.out.println(userCount);
    }

四、查询用户表和订单

1.在pojo中创建User类中添加ordersList属性,因为再查询的时候即需要用户的信息也需要订单的信息。

User类中添加的内容具体请参考本文第一个标题(一、pojo实体类创建)

2.在UserMapper抽象类中写入findUserAndOrder()方法

import com.pp.pojo.QueryVo;
import com.pp.pojo.User;

import java.util.List;

public interface UserMapper {
	  List<User> findUserAndOrder();
}

2.在UserMapper.xml配置文件中写入findUserAndOrder()的sql语句

<?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 namespace="com.pp.mapper.UserMapper">
	<!--  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',-->
   
    <resultMap id="userAndOderResultMap" type="com.pp.pojo.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="birthday" property="birthday"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <collection property="ordersList" ofType="com.pp.pojo.Orders">
            <id column="id" property="id"/>
            <result column="user_id" property="userid"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>
        </collection>
    </resultMap>

    <select id="findUserAndOrder" resultMap="userAndOderResultMap">
        select  a.*,b.*   from user a, orders b where a.id=b.user_id;
    </select>
</mapper>
  1. <resultMap>id值的就是一个名字,可以随便取,这里取名为userAndOderResultMap;

  2. <resultMap>下的<id>中的column的值填写对应表的id,这里填写对应数据库中user表中的id,property的值就叫id;

  3. 然后有一个<result>中的column要一一的和实体类进行一一对应,所以这里column的值为username,property的值为username。

  4. 后面的几个<result>的column的和property的值分别就是实体类的birthday、sex、address

  5. 实体类User中还加了个List<order>,要想对应该属性使用<collection>

  6. <collection>的property填写实体类的属性名,这里是ordersList,ofType意思是对应ordersList的那个实体类的orders.也就是ordersList的那个元素对应的是那个实体类。

  7. <collection>下的属性,就是order实体类的列(数据库中对应的列)的对应关系。根据数据表中,oders中有id,所以这里写:<id column="id" property="id"/>

  8. orders表中的user_id在实体类中对应的是userid,所以这里应该写:<result column="user_id" property="userid"/>

  9. 后面的数据库orders表 中的number、createtime、note都和实体类相同,这里就不一一介绍。

上面介绍的代码内容为:

<resultMap id="userAndOderResultMap" type="com.pp.pojo.User">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="birthday" property="birthday"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <collection property="ordersList" ofType="com.pp.pojo.Orders">
            <id column="id" property="id"/>
            <result column="user_id" property="userid"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>
        </collection>
    </resultMap>
  1. 上面关于一个类中的属性包含另一个实体类的情况已经完成,接下来我们写sql语句。
 <select id="findUserAndOrder" resultMap="userAndOderResultMap">
        select  a.*,b.*   from user a, orders b where a.id=b.user_id;
    </select>

<select>中的id就是我们在UserMapper中定义的方法名;resultMap结果返回的就是上面配置的resultMap的id名,这里是userAndOderResultMap。在标签里面写上sql语句 select a.*,b.* from user a, orders b where a.id=b.user_id;这句话是给user定义别名为a,orders表定义别名为b,当user的id和orders的id相等的时候,查询两个表的所有信息。

2.UserTest测试类中写fun9()测试方法

import com.pp.mapper.UserMapper;
import com.pp.pojo.QueryVo;
import com.pp.pojo.User;
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.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserTest {
    private SqlSessionFactory factory;
    @Test
    @Before
    public void Setup() throws IOException {
        String res="SqlMapConfig.xml";
        InputStream inputStream = Resources.getResourceAsStream(res);
        factory=new SqlSessionFactoryBuilder().build(inputStream);
    }

	 @Test
    public void fun9(){
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> l = mapper.findUserAndOrder();
      /*  User user = l.get(0);
        List<Orders> ordersList = user.getOrdersList();
        System.out.println(ordersList);*/
        System.out.println(l);
    }
}

五、总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅输入参数,输出参数、还有resultMap。输入输出参数如果参数是实体类的话,需要写具体实体类的路径这里的路径就是com.pp.类名。resultMap是用来作两个表关联的查询。所以在xml配置中需要将实体类的属性和数据库中表的元素对应。

源码地址:https://gitee.com/yangforever/project-learning.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值