我们在进行传统的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的查询结果处理方式,其余方式我们在多表查询中进行介绍!!!