MyBatis输出结果
mybatis执行了sql语句,得到java对象。
1、resultType
resultType: 执行 sql 得到 ResultSet 转换的类型,使用类型的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。resultType 和 resultMap,不能同时使用。
resultType结果类型, 指sql语句执行完毕后, 数据转为的java对象, java类型是任意的。
resultType结果类型的值
- 类型的全限定名称
- 类型的别名, 例如 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();
}
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();
注意: Dao 接口方法返回是集合类型,需要指定集合中的类型,不是集合本身。
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();
}
2、resultMap
resultMap 可以自定义 sql 的结果和 java 对象属性的映射关系。更灵活的把列值赋值给指定属性。
常用在列名和 java 对象属性名不一样的情况。
使用方式:
- 先定义 resultMap,指定列名和属性的对应关系。
- 在< 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();
}
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();
}
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();
}
4、模糊查询like
模糊查询的实现有两种方式:
- 是 java 代码中给查询数据加上“%” ;
- 是在 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();
}
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();
}