MyBatis输出结果

mybatis执行了sql语句,得到java对象。

1、resultType

resultType: 执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。
resultType结果类型, 指sql语句执行完毕后, 数据转为的java对象, java类型是任意的。
resultType结果类型的值

  1. 类型的全限定名称
  2. 类型的别名, 例如 java.lang.Integer别名是int

1.1 简单类型

接口方法:

int countStudent();

mapper 文件:

<select id="countStudent" resultType="java.lang.Integer">
        select count(*) from student
    </select>

测试:

@Test
    public void countStudent() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        int countStudent = dao.countStudent();
        System.out.println("学生总人数------->" + countStudent);
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_java

1.2 对象类型

接口方法:

Student selectStudentById(Integer id);

mapper 文件:

<select id="selectStudentById" resultType="com.b0kuwa.entity.Student">
        select * from student where id = #{id}
    </select>

框架的处理: 使用构造方法创建对象。调用 setXXX 给属性赋值。

Student student = new Student();

mybatis result实体 mybatis resulttype int_java_02


注意: Dao 接口方法返回是集合类型,需要指定集合中的类型,不是集合本身。

mybatis result实体 mybatis resulttype int_List_03


mybatis result实体 mybatis resulttype int_mybatis result实体_04

1.3 Map

sql 的查询结果作为 Map 的 key 和 value。推荐使用 Map<Object,Object>。
注意:Map 作为接口返回值,sql 语句的查询结果最多只能有一条记录。大于一条记录是错误。
接口方法:

Map<Object,Object> selectMapById(Integer id);

mapper 文件:

<select id="selectMapById" resultType="java.util.HashMap">
        select * from student where id = #{studentId}
    </select>

测试方法:

@Test
    public void selectMapById() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        Map<Object, Object> map = dao.selectMapById(1006);
        System.out.println("map" + map);
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_sql_05

2、resultMap

resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。
常用在列名和 java 对象属性名不一样的情况。
使用方式:

  1. 先定义 resultMap,指定列名和属性的对应关系。
  2. 在< select >中把 resultType 替换为 resultMap。
    接口方法:
List<Student> selectAllStudents();

mapper 文件:

<!-- 创建 resultMap
        id:自定义的唯一名称,在<select>使用
        type:期望转为的 java 对象的全限定名称或别名
    -->
    <resultMap id="studentMap" type="com.b0kuwa.entity.Student">
        <!-- 主键字段使用 id -->
        <id column="id" property="id"/>
        <!--非主键字段使用 result
            column :列名
            property:java类型的属性名
        -->
        <result column="name" property="name"/>
        <result column="email" property="email"/>
        <result column="age" property="age"/>
    </resultMap>

	<!--resultMap: resultMap 标签中的 id 属性值-->
    <select id="selectAllStudents" resultMap="studentMap">
        select * from student
    </select>

测试方法:

@Test
    public void selectAllStudents() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Student> students = dao.selectAllStudents();
        students.forEach(student -> System.out.println(student));
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_sql_06

3、实体类属性名和列名不同的处理方式

3.1 使用列别名和< resultType >

实体类:

public class Servant {
    private String id;
    private String name;
    private String gender;
    private Integer age;
    //创建get 和set

接口方法:

List<Servant> selectDiffColProperty();

mapper 文件:

<select id="selectDiffColProperty" resultType="com.b0kuwa.entity.Servant">
        select sno as id, sname as name, sgen as gender, sage as age from servant
    </select>

测试:

@Test
    public void selectDiffColProperty() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Servant> servants = dao.selectDiffColProperty();
        servants.forEach(servant -> System.out.println(servant));
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_mybatis result实体_07


mybatis result实体 mybatis resulttype int_List_08

3.2 使用< resultMap >

接口方法:

List<Servant> selectServant();

mapper 文件:

<resultMap id="servantMap" type="com.b0kuwa.entity.Servant">
        <id column="sno" property="id"/>
        <result column="sname" property="name"/>
        <result column="sgen" property="gender"/>
        <result column="sage" property="age"/>
    </resultMap>

    <select id="selectServant" resultMap="servantMap">
        select * from servant
    </select>

测试:

@Test
    public void selectServant() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Servant> servants = dao.selectServant();
        servants.forEach(servant -> System.out.println(servant));
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_java_09

4、模糊查询like

模糊查询的实现有两种方式:

  1. 是 java 代码中给查询数据加上“%” ;
  2. 是在 mapper 文件 sql 语句的条件位置加上“%”

4.1 java 代码中加上“%”

接口方法:

List<Student> selectLikeOne(String name);

mapper文件:

<select id="selectLikeOne" resultType="com.b0kuwa.entity.Student">
        select * from student where name like #{name}
    </select>

测试:

@Test
    public void selectLikeOne() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        String name = "%路%";
        List<Student> students = dao.selectLikeOne(name);
        students.forEach(student -> System.out.println(student));
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_sql_10

4.2 mapper 文件中使用 like name “%” #{xxx} “%”

接口方法:

List<Student> selectLikeTwo(String name);

mapper文件:

<select id="selectLikeTwo" resultType="com.b0kuwa.entity.Student">
        select * from student where name like "%" #{name} "%"
    </select>

测试:

@Test
    public void selectLikeTwo() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        String name = "路";
        List<Student> students = dao.selectLikeTwo(name);
        students.forEach(student -> System.out.println(student));
        sqlSession.close();
    }

mybatis result实体 mybatis resulttype int_List_11