Mybatis查询结果处理

    我们在进行传统的jdbc代码进行增删改操作时,由于这些操作基本并不需要数据库的结果响应,所以相对来说比较简单.而对于查询操作,我们需要通过对ResultSet查询结果集进行处理解析后才能将其响应给客户端,而对于结果集的处理解析往往是一个非常繁杂的过程.

    我们在使用传统的jdbc进行查询操作时,每次查询之后都需要将查询结果一一进行接收,当查询大量数据时这是一个非常庞大的工程.而在Mybatis中对于查询结果集的处理提供了处理功能.下面我们进行介绍

1.简单类型输出映射

简单类型的查询返回简单的基本类型,我们以查询表中的记录条数为例
1.接口中的方法:

int findAdminCount();

2.mapper.xml中的配置文件:

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

3.测试类:

 package com.ffyc.mybatisdemo.test;
 ​
 import com.ffyc.mybatisdemo.dao.AdminDao;
 import com.ffyc.mybatisdemo.model.Admin;
 import com.ffyc.mybatisdemo.util.MybatisUtil;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 /*
    结果处理
  */
 public class Test3 {
 ​
     @Test
     //简单类型输出映射
     public void findAdminCount() {
         SqlSession sqlSession = MybatisUtil.getSqlSession();
         AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
         int res = adminDao.findAdminCount();
         System.out.println(res);
         sqlSession.close();
     }
 }
 ​

2.对象输出映射

   此处SQL语句查询结果为一条记录,Mybatis可以实现将记录自动封装到对象中.但是,这一切都是有前提条件的.

前提条件:

1.表中的列名与对象中的属性完全一致

2.开启全局配置中的mapUnderscoreToCameLCase,以实现查询结果中的列名与对象中的属性名自动转换.这一点我们在上面的Mybatis开发环境搭建的博客中配置过

 <!--从经典的数据库命名转为java的驼峰命名-->
   <setting name="mapUnderscoreToCamelCase" value="true"/>

我们以使用id查询表中数据为例:

1.普通java实体类

 
package com.ffyc.mybatisdemo.model;
 ​
 public class Admin {
 ​
      private int id;
      private String account;
      private String password;
      private String xb;  //此处为xb,与数据库中列名不同,我们需特别注意
      private String adminPhone;
 ​
     public String getXb() {
         return xb;
     }
 ​
     public void setXb(String xb) {
         this.xb = xb;
     }
 ​
     public String getAdminPhone() {
         return adminPhone;
     }
 ​
     public void setAdminPhone(String adminPhone) {
         this.adminPhone = adminPhone;
     }
 ​
     public Admin() {
         System.out.println("Admin无参构造");
     }
 ​
     public Admin(String account, String password, String gender) {
         this.account = account;
         this.password = password;
         this.xb = gender;
     }
 ​
     public int getId() {
         return id;
     }
 ​
     public void setId(int id) {
         System.out.println("SetId");
         this.id = id;
     }
 ​
     public String getAccount() {
         return account;
     }
 ​
     public void setAccount(String account) {
         this.account = account;
     }
 ​
     public String getPassword() {
         return password;
     }
 ​
     public void setPassword(String password) {
         this.password = password;
     }
 ​
 ​
 ​
     @Override
     public String toString() {
         return "Admin{" +
                 "id=" + id +
                 ", account='" + account + '\'' +
                 ", password='" + password + '\'' +
                 ", xb='" + xb + '\'' +
                 ", adminPhone='" + adminPhone + '\'' +
                 '}';
     }
 }

2.接口中的方法:

 Admin findAdminById(int id);

3.mapper.xml中的配置文件:

<select id="findAdminById" parameterType="int" resultType="Admin">
         select * from admin where id = #{id}
     </select>

4.测试类:

 package com.ffyc.mybatisdemo.test;
 ​
 import com.ffyc.mybatisdemo.dao.AdminDao;
 import com.ffyc.mybatisdemo.model.Admin;
 import com.ffyc.mybatisdemo.util.MybatisUtil;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 /*
    结果处理
  */
 public class Test3 {
 ​
     @Test
     //对象映射
     public void findAdminById() {
         SqlSession sqlSession = MybatisUtil.getSqlSession();
         AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
         Admin admin = adminDao.findAdminById(2);
         System.out.println(admin);
         sqlSession.close();
     }
 }

3.resultMap输出映射

   resultMap可以将指定查询结果映射为普通的java对象,但是需要我们java实体类中的属性名与SQL查询结果中的列名一致.如果SQL查询结果与java实体类中的属性名不一致我们还可以通过特殊处理,使用resultMap将字段名与实体类中的属性名建立一一对应关系,从而实现将查询结果映射到普通java对象中.

首先我们需要了解resultMap中的各种属性:

resultMap属性列表:

  • id: resultMap的唯一标识符

  • type: resultMap所映射的实体对象类型

  • column: 字段名与属性名不一致时用来定义对应关系.column中的值为字段名

  • property: 字段名与属性名不一致时用来定义对应关系.property中的值为属性名

  • parameterType: 参数类型

3.1特殊处理定义resultMap

1.接口中的方法:

 Admin findAdminById1(int id);

2.mapper.xml文件:

 <!--特殊情况,单独处理-->
     <resultMap id="adminMap" type="Admin">
         <!--定义列名与属性名的对应关系-->
         <id column="id" property="id"></id>
         <result column="account" property="account"></result>
         <result column="password" property="password"></result>
         <result column="admin_phone" property="adminPhone"></result>
         <result column="gender" property="xb"></result>
     </resultMap>
     <select id="findAdminById1" parameterType="int" resultMap="adminMap">
          select * from admin where id = #{id}
     </select>
  • 注:

    • 此处在定义列名与属性名的一一对应关系时,列名与属性名相同的可以不用定义,但是列名与属性名不相同的一定要在 resultMap中定义,否侧无法进行正常映射.如上述属性名“xb”与数据库中列名“gender”不同,我们必须声明出来.

3.测试类:

 package com.ffyc.mybatisdemo.test;
 ​
 import com.ffyc.mybatisdemo.dao.AdminDao;
 import com.ffyc.mybatisdemo.model.Admin;
 import com.ffyc.mybatisdemo.util.MybatisUtil;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 /*
    结果处理
  */
 public class Test3 {
 ​
     @Test
     //单独使用resultMap处理
     public void findAdminById1() {
         SqlSession sqlSession = MybatisUtil.getSqlSession();
         AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
         Admin admin = adminDao.findAdminById1(2);
         System.out.println(admin);
         sqlSession.close();
     }
 }
 ​

3.2使用resultMap

1.接口中的方法:

 Admin login1(Admin admin);

2.mapper,xml文件:

 <select id="login1" resultMap="adminMap" parameterType="Admin">
         select * from admin where account=#{account} and password=#{password}
 </select>
  • 注:

    • 此处我们引用了resultMap为上述3.1中的“adminMap”

3.测试类:

 
package com.ffyc.mybatisdemo.test;
 ​
 import com.ffyc.mybatisdemo.dao.AdminDao;
 import com.ffyc.mybatisdemo.model.Admin;
 import com.ffyc.mybatisdemo.util.MybatisUtil;
 import org.apache.ibatis.session.SqlSession;
 import org.junit.Test;
 ​
 import java.io.IOException;
 ​
 public class Test2 {
 ​
     @Test
     //使用 parameterType 参数进行类型定义
     public void login1() {
 ​
         SqlSession sqlSession = MybatisUtil.getSqlSession();
         AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
         Admin admin1 = new Admin("admin", "111",null);
         adminDao.login1(admin1);
         sqlSession.close();
     }
 ​
 }
 ​

至此我们介绍了4中Mybatis的查询结果处理方式,其余方式我们在多表查询中进行介绍!!!

猜你喜欢

转载自blog.csdn.net/weixin_52629592/article/details/125843395