关于Mybatis中属性名和字段名可不一致的问题
在偶然写代码的过程中发现,在不使用resultMap以及字段名重写的情况下,使用resultType
网上大多数博客写的是使用resultType,如果返回的是一个封装的对象,那么该对象的属性名和数据库表中的字段名相同
其实不然,以下我对在属性名和字段名不一致的时候,分了几种情况考虑:
这是相关java代码及配置:
数据库表
封装返回对象
public class Student {
private String Sno;
private String Sname;
private String Ssex;
private Integer Sage;
private String Sdept;
public String getSno() {
return Sno;
}
public void setSno(String Sno) {
this.Sno = Sno;
}
public String getSname() {
return Sname;
}
public void setSname(String Sname) {
this.Sname = Sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String Ssex) {
this.Ssex = Ssex;
}
public Integer getSage() {
return Sage;
}
public void setSage(Integer Sage) {
this.Sage = Sage;
}
public String getSdept() {
return Sdept;
}
public void setSdept(String Sdept) {
this.Sdept = Sdept;
}
@Override
public String toString() {
return "Student{" +
"Sno='" + Sno + '\'' +
", Sname='" + Sname + '\'' +
", Ssex='" + Ssex + '\'' +
", Sage=" + Sage +
", Sdept='" + Sdept + '\'' +
'}';
}
}
接口中的方法
List<Student> findByNameSex (@Param("name") String name,
@Param("sex") String sex);
sql映射文件
<select id="findByNameSex" resultType="student">
select Sno, Sname, Ssex, Sage, Sdept
from Student
where Sname like CONCAT('%',#{name},'%') and Ssex = #{sex}
</select>
单元测试代码
@Test
public void testFindByNameSex() {
// 获取SqlSession对象
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List<Student> studentList = dao.findByNameSex("张", "男");
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
只有大小写不一致
这里为了方便只对一个属性名进行改动
Sno --> SNo
public class Student {
private String SNo;
...
public String getSNo() {
return SNo;
}
public void setSNo(String SNo) {
this.SNo = SNo;
}
...
}
其他无任何更改,执行单元测试
测试结论:
正常生成setter和getter方法时,属性名和字段名可大小写不一致
也就是说属性名和字段名只有大小写不一致的情况下是等同的
两者等同,setter方法名任意
在属性名和字段名等同时,属性的setter方法名任意
方法名setSNo —> aaa
public class Student {
private String SNo;
...
public String getSNo() {
return SNo;
}
public void aaa(String SNo) {
this.SNo = SNo;
}
...
}
执行测试
测试结论:
在属性名和字段名等同时,setter方法名可以任意
两者不同,setter方法名任意
属性名任意,setter方法名任意
public class Student {
private String aaa;
...
public String getSNo() {
return SNo;
}
public void aaa(String SNo) {
this.SNo = SNo;
}
...
}
执行测试
测试结论:
当属性名不同,且setter方法名任意时,属性名和字段名无法建立映射关系
两者不同,setter方法名(set+字段名等同形式)
属性名任意,但是setter方法名采用set+字段名等同形式(sno,SNO等等)
public class Student {
private String aaa;
...
public String getaaa() {
return SNo;
}
public void setsno(String aaa) {
this.aaa = aaa;
}
...
}
执行测试
测试结论:
属性名任意的情况下,可将其setter方法可设置为set+字段名等同形式
两者不同,setter方法名(字段名等同形式)
属性名不同于字段名,setter方法名前不加set,只有字段名等同形式
public class Student {
private String aaa;
...
public String getaaa() {
return SNo;
}
public void sno(String aaa) {
this.aaa = aaa;
}
...
}
执行测试
测试结论
当属性名不同于字段名时,必须将setter方法设置为set+字段名等同形式
总结
以上是我测试的几种不同情况,暂时得到的结论是:
在使用resultType返回时,返回参数的封装对象的属性名可以和数据库表中的字段名不同。
只有大小写不一致的情况下,可直接使用
属性名和字段名不同情况下,可将属性的setter方法改为set+字段名的等同形式
这些情况应该设计到Mybatis相关细节,暂时还未了解到相关知识,欢迎各位大佬指正!!!