MyBatis查询结果处理
我们在使用传统的JDBC代码进行数据库操作时,增、删、改的sql语句由于基本上没有数据库的结果响应所以会比较简单,而对于查询的sql语句而言,我们需要通过对ResultSet结果集进行处理解析后才能将其响应给客户端,而对结果集的处理解析往往是一个非常繁琐的过程,会浪费我们大量的时间。
对于sql语句查询的结果,MyBtais框架提供了对结果进行处理的功能,MyBatis框架的Mapped Statement(底层封装对象)对sql执行输出结果进行定义,包括基本类型、HashMap、POJO等Executor通过Mapped Statement在执行sql后将输出结果映射到java对象,输出结果的映射过程就相当于JDBC对结果的解析处理过程。
简单类型输出映射
返回简单的基本类型,以查询表中记录为例:
接口中的方法为:
//查询user表有多少条记录
int findUserCount();
mapper.xml文件中配置为:
<select id="findUserCount" resultType="int">
SELECT COUNT(1) FROM t_user
</select>
POJO对象输出映射
POJO(Plain Old Java Objects,普通的java对象),如果数据库表中的列名与java类中的属性名完全相同,MyBatis会自动将查询结果封装到POJO对象中。
以查询表中id=?的详细数据为例
1.普通的Java类——User
package com.cwd.mybatis.bean;
import org.apache.ibatis.type.Alias;
import java.util.Date;
@Alias("User")
public class User {
private int id;
private String name;
private int age;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
2.数据库表——t_user
3.接口中的方法为:
//查询id=?的user信息
User findUserById(int id);
4.mapper.xml文件中配置为:
<select id="findUserById" parameterType="int" resultType="User">
SELECT * FROM t_user WHERE id = #{id}
</select>
5.测试,如有不懂请参见一篇文章告诉你什么是Mybatis+Mybatis的搭建及使用
@Test
public void test4() {
try {
//读取MyBtais全局配置文件
Reader reader = Resources.getResourceAsReader("MyBatisConfig.xml");
//创建会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//建立轻量级会话
SqlSession sqlSession = sessionFactory.openSession();
//获取接口的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用方法
System.out.println(userDao.findUserById(1));
//递交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
注意
POJO对象输出映射中,除了java类中属性名与表中列名完全相同外,还需注意我们所熟悉的驼峰命名,如果java类中使用了标准的驼峰命名,数据库中使用下划线连接命名,我们可以在MyBatis全局配置文件中开启全局设置实现属性与列的自动转换,比如从数据库命名 user_name自动映射到userName。
<!--mybatis的全局设置-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
resultMap输出映射
resultType可以指定将查询结果映射为POJO,但需要Java类中的属性名和sql查询的列名一致放可映射成功。如果sql查询字段名和java类的属性名不一致,我们可以通过resultMap将字段名和属性名座椅个对应关系,resultMap实质上还需要将查询结果映射到POJO对象中。
定义resultMap
1.数据库有如下字段(列):
CREATE TABLE t_work(
id_ SMALLINT PRIMARY KEY COMMENT'作业id',
work_name_ VARCHAR(50) NOT NULL COMMENT'作业名',
work_class_ VARCHAR(50) NOT NULL COMMENT'布置班级'
)
2.如下Work.java类:
package com.cwd.mybatis.bean;
public class Work {
private Integer id;
private String name;
private String grade;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
}
3.在mapper.xml文件中定义resultMap:
<!--定义resultMap-->
<resultMap id="workResultMap" type="Work">
<id column="id_" property="id"/>
<result property="name" column="work_name_"/>
<result property="grade" column="work_class_"/>
</resultMap>
注意:
(1)resultMap标签的id属性是resultMap的唯一标识,本例中定义为workResultMap。
(2)resultMap标签的type属性是映射的POJO对象。
(3)id标签映射的是主键,result标签映射的是非主键。
(4)property设置POJO的属性名称,column映射查询结果即数据库表的列名称或别名。
使用resultMap
1.接口中的方法为:
//根据id查询数据库表中的信息
Work findWorkById(int id);
2.mapper.xml文件中配置为:
<select id="findWorkById" resultMap="workResultMap" parameterType="int">
SELECT id_,work_name_,work_class_ FROM t_work WHERE id_ = #{id}
</select>
注意:
(1)本例输出映射使用的是resultMap,而非resultType。
(2)resultMap引用了workResultMap。
3.测试:
@Test
public void test5() {
try {
//读取MyBtais全局配置文件
Reader reader = Resources.getResourceAsReader("MyBatisConfig.xml");
//创建会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//建立轻量级会话
SqlSession sqlSession = sessionFactory.openSession();
//获取接口的代理对象
WorkDao workDao = sqlSession.getMapper(WorkDao.class);
//调用方法
System.out.println(workDao.findWorkById(1));
//递交事务
sqlSession.commit();
//关闭会话
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}