在上篇博文中,如果我们的实体类属性名与表的字段名完全一致,则在Person.xml中可以看到如下的代码:
<select id="queryById" parameterType="int" resultType="com.wrh.entity.Person">
SELECT * FROM PERSON WHERE ID=#{id}
select>
并在PersonTest.java文件中利用如下的代码,即可以查到数据库中id=100的Person信息
@Test
public void queryById(){
sqlSession = MybatisUtil.getSqlSession();
int id = 100;
try{
Person person = sqlSession.selectOne("mapper.Person.queryById",id);
System.out.println(person.getUserName());
}catch (Exception e){
e.printStackTrace();
}finally {
MybatisUtil.closeSession(sqlSession);
}
}
但是,如果我们数据库Person表中的字段名不是id、name等字段,而时p_id、p_name等字段,则上面的代码就不能正常工作了。
基于此,本篇博文将介绍下这种情况如何进行数据的查询等操作。
第一步:建立一个Student表
Student表有三个字段,为:s_id、s_name、s_age,并插入了一条数据为后面测试做准备,具体如下:
第二步:定义一个实体类Student
Student类的代码如下
package com.wrh.entity;
/**
* @Author:wojiushimogui
* @Description:
* @Date:Created by 下午1:19 on 2017/9/3.
*/
public class Student {
private int id;
private String name;
private int age;
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;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
第三步:编写sql的xml映射文件StudentMapper.xml
具体内容如下:
<mapper namespace="mapper.StudentMapper">
<select id="queryById" parameterType="int" resultType="com.wrh.entity.Student">
SELECT * FROM student WHERE s_id=#{id}
select>
<select id="queryById2" parameterType="int" resultType="com.wrh.entity.Student">
SELECT s_id id,s_name name,s_age age FROM student WHERE s_id = #{id}
select>
<select id="queryById3" parameterType="int" resultMap="resultStudentMap">
SELECT * FROM student WHERE s_id = #{id}
select>
<resultMap id="resultStudentMap" type="com.wrh.entity.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
<result property="age" column="s_age"/>
resultMap>
mapper>
第四步:将sql映射文件StudentMapper.xml在mybatis-config.xml进行注册
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
mappers>
第五步:测试
package com.wrh;
import com.wrh.entity.Student;
import com.wrh.utils.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
/**
* Created by wuranghao on 2017/7/16.
*/
public class StudentTest {
SqlSession sqlSession ;
@Test
public void queryById(){
sqlSession = MybatisUtil.getSqlSession();
int id = 1;
try{
Student student = sqlSession.selectOne("mapper.StudentMapper.queryById",id);
System.out.println(student);//null
}catch (Exception e){
e.printStackTrace();
}finally {
MybatisUtil.closeSession(sqlSession);
}
}
@Test
public void queryById2(){
sqlSession = MybatisUtil.getSqlSession();
int id = 1;
try{
Student student = sqlSession.selectOne("mapper.StudentMapper.queryById2",id);
System.out.println(student);//Student{id=1, name='wojiushimogui', age=18}
}catch (Exception e){
e.printStackTrace();
}finally {
MybatisUtil.closeSession(sqlSession);
}
}
@Test
public void queryById3(){
sqlSession = MybatisUtil.getSqlSession();
int id = 1;
try{
Student student = sqlSession.selectOne("mapper.StudentMapper.queryById3",id);
System.out.println(student);//Student{id=1, name='wojiushimogui', age=18}
}catch (Exception e){
e.printStackTrace();
}finally {
MybatisUtil.closeSession(sqlSession);
}
}
}
测试结果为
1、执行queryById()方法所查询到的结果为null,这是因为:实体类的属性名和数据库的字段名对应不上,因此无法查询出对应的记录
2、执行queryById2()方法所查询到的结果为:Student{id=1, name='wojiushimogui', age=18}
,查询结果符合期望的原因为:我们将查询得到的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上了。
3、执行queryById3()方法所查询到的结果为:Student{id=1, name='wojiushimogui', age=18}
,查询结果符合期望的原因为:我们通过映射实体类属性名和表的字段名一一对应关系,其中用id属性来映射主键字段,用result属性来映射非主键字段。
形式如下
<select id="queryById3" parameterType="int" resultMap="resultStudentMap">
SELECT * FROM student WHERE s_id = #{id}
select>
"resultStudentMap" type="com.wrh.entity.Student">
property="id" column="s_id"/>
property="name" column="s_name"/>
property="age" column="s_age"/>
当实体类的属性名与表的字段名不一致时,为正确的查找出相应的数据,有如下两种方法:
方法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。形式如下:
<select id="queryById2" parameterType="int" resultType="com.wrh.entity.Student">
SELECT s_id id,s_name name,s_age age FROM student WHERE s_id = #{id}
select>
方法二: 通过来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。 形式如下:
id="resultStudentMap" type="com.wrh.entity.Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
<result property="age" column="s_age"/>
1、http://www.cnblogs.com/xdp-gacl/p/4264425.html