MyBatis中resultType和resultMap的使用 |
您所在的位置:网站首页 › mybatis的resulttype映射不到 › MyBatis中resultType和resultMap的使用 |
封装输出结果:MyBatis执行sql语句,得到ResultSet,转为java对象 这里我们两个,分别为resultType和resultMap 文章目录 1.resultType1.1 java类型的全限定名称1.2 自定义别名1.2.1 typeAlias自定义别名1.2.2 package自定义别名 1.3 resultType表示简单类型1.4 resultType 2.resultMap3.列名和Java对象属性名称不一致解决方式3.1 使用resultMap:自定义列名和属性名称对应关系3.2 使用resultType 1.resultTyperesultType属性:在执行select时使用,作为标签的属性出现的。 resultType:执行sql得到ResultSet转换的类型,使用类型的完全限定名或别名。注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。 它的值有两种: java类型的全限定名称使用别名 1.1 java类型的全限定名称dao接口中定义方法 Student selectStudentById(Integer id);mapper文件中 select id, name, email, age from student where id = #{studentId}resultType:现在使用的是java类型的全限定名称。表示的意思是mybatis执行sql,把ResultSet中的数据转为Student类型的对象。 mybatis会做一下操作: 1.调用com.lu.entity.Student的无参构造方法, 创建对象。 Student student = new Student(); //使用反射创建对象2.同名的列赋值给同名的属性 student.setId(rs.getInt("id")); student.setName(rs.getString("name"));3.得到java对象,如果dao接口返回值是List集合,mybatis把student对象放入到List集合 所以执行 Student mystudent = dao.selectById(1001); 得到数据库中 id = 1001这行数据,这行数据的列值,赋值给了mystudent对象的属性。你能得到mystudent对象,就相当于是id = 1001这行数据。 1.2 自定义别名mybatis提供的对java类型定义简短,好记的名称。 自定义别名有两种方式:分别为typeAlias和package 1.2.1 typeAlias自定义别名使用typeAlias自定义别名的步骤: 1.在mybatis主配置文件,使用typeAliases标签声明别名 注意:标签必须写在标签后面 2.在mapper文件中,resultType = “别名” select id, name, email, age from student where id = #{studentId}3.测试类中测试 @Test public void testselectStudentById() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); Student student = dao.selectStudentById(1002); System.out.println(student); session.close(); }控制台输出: 使用typeAlias有优点也有缺点 优点:别名可以自定义 缺点:每个类型必须单独定义 1.2.2 package自定义别名主配置文件中: mapper文件中: select id, name, email, age from student where id = #{studentId}这一种方式resultType中不区分大小写,所以全用小写同样也可以 测试类中测试: 同样测试成功 优点:使用方便,一次给多个类定义别名。 缺点:别名不能随便定义,必须是类名。 这两种自定义别名都有优点和缺点,所以建议是不适用别名,就使用全限定名称,这样清晰明了。 1.3 resultType表示简单类型我们首先在dao接口中定义一个方法 long countStudent();在mapper文件中编写sql语句 select count(*) from student在测试类中测试 @Test public void testCountStudent() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); long nums = dao.countStudent(); System.out.println("nums = " + nums); session.close(); }控制台输出: 1.4 resultTypedao接口中定义方法: Map selectMap(Integer id);mapper文件中写sql语句: select id, name from student where id = #{studentid}测试类中进行测试: @Test public void testSelectMap() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); Map map = dao.selectMap(1001); System.out.println("map = " + map); System.out.println("name = " + map.get("name")); System.out.println("id = " + map.get("id")); session.close(); }控制台输出: 我们可以看到执行结果,列名作为map的key,列值作为value dao接口返回一个map,sql语句最多能获取一行记录,多于一行是错误 2.resultMapresultMap:结果映射。自定义列名和Java对象属性的对应关系。常用在列名和属性名不同的情况。 用法: 1.先定义resultMap标签,指定列名和属性名称对应关系 2.在select标签使用resultMap属性,指定上面定义的resultMap的id值 我们来举一个例子 首先定义一个CustomObject类 package com.lu.entity; public class CustomObject { private Integer cid; private String cname; private String email; private Integer age; public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "CustomObject{" + "cid=" + cid + ", cname='" + cname + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }我们发现这里cid和cname和数据库里面的列名不一致 我们再在dao接口中定义一个方法 CustomObject selectById2(Integer id);如果我们要将从数据库取出来的内容赋值给CustomObject对象,那么如果我们继续用resultType的话,从数据库中取出来的数据只能赋值给email和age,无法给cid和cname进行赋值,这个时候我们就需要用到resultMap 我们在mapper文件中这样来写: select id, name, email, age from student where id = #{studentid}这样我们就可以使用resultMap来定义数据库列和属性的关系 我们在测试类中进行测试: @Test public void testSelectById2() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); CustomObject co = dao.selectById2(1001); System.out.println(co); session.close(); }控制台输出: 这样resultMap就成功解决了列名和属性名不一致的情况。 注意:resultType和resultMap不能同时使用。 3.列名和Java对象属性名称不一致解决方式 3.1 使用resultMap:自定义列名和属性名称对应关系这个方法在上面讲解resultMap的时候就讲解了,可以直接看上面 3.2 使用resultType使用列别名,让别名和Java对象属性名称一样 我们在dao接口中定义一个方法: CustomObject selectById3(Integer id);我们在mapper文件中写: select id AS cid, name AS cname, email, age where id = #{studentid}我们在测试类中进行测试 @Test public void testSelectById3() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao dao = session.getMapper(StudentDao.class); CustomObject co = dao.selectById2(1003); System.out.println(co); session.close(); }控制台输出: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |