Mybatis实体类属性名与字段名不相同冲突_4

来源:互联网 发布:pandorabox安装python 编辑:程序博客网 时间:2024/05/01 15:57

在开发中,有可能我们表中的字段名和表对应实体类的属性名称不一致!如何解决字段名与实体类属性名不相同的冲突。

一、表及数据

create table USERINFOS(  id    NUMBER(8) not null,  uname VARCHAR2(20) not null,  upass VARCHAR2(8) not null)alter table USERINFOS add primary key (ID)insert into USERINFOS (id, uname, upass)values (1, '冒泡', '8888');insert into USERINFOS (id, uname, upass)values (3, '大白熊', '000');insert into USERINFOS (id, uname, upass)values (6, 'John', '000');commit;

二、实体类Userinfo

package com.hlx.entzity;public class Userinfo {//Userinfo实体类中属性名和Userinfos表中的字段名是不一样的private int myid; // idprivate String myuname; // unameprivate String myupass; // upasspublic int getMyid() {return myid;}public void setMyid(int myid) {this.myid = myid;}public String getMyuname() {return myuname;}public void setMyuname(String myuname) {this.myuname = myuname;}public String getMyupass() {return myupass;}public void setMyupass(String myupass) {this.myupass = myupass;}public Userinfo(int myid, String myuname, String myupass) {super();this.myid = myid;this.myuname = myuname;this.myupass = myupass;}public Userinfo() {super();}public Userinfo(int myid) {super();this.myid = myid;}@Overridepublic String toString() {return "Userinfo [myid=" + myid + ", myuname=" + myuname + ", myupass="+ myupass + "]";}}

三、编写代码

   1)UserinfoMapper.xml映射文件
  
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hlx.dao.UserinfoMapper"><!--1) 根据ID查询用户对象,使用这个查询查询出数据是null             因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录  --><select id="getByid" parameterType="int" resultType="Userinfo">select * from userinfos where id=#{myid}</select><!--(a)写个sql语句字段别名与属性名一致 OK!--><select id="getByidA" parameterType="int" resultType="Userinfo">select id myid,uname myuname,upass myupass from userinfos where id=#{myid}</select><!--(b) 可以通过<resultMap>映射实体类属性名和表的字段名一一对应关系     -->      <select id="getByidB" parameterType="int" resultType="Userinfo" resultMap="UserinfoMap">select * from userinfos where id=#{myid} </select> <!--通过<resultMap>映射实体类属性名和表的字段名对应关系 --> <resultMap type="com.hlx.entity.Userinfo" id="UserinfoMap"><!-- 用id属性来映射主键字段 --><id property="myid" column="id"/><!-- 用result属性来映射非主键字段   property属性,column列名字段 --> <result property="myuname" column="uname"/> <result property="myupass" column="upass"/> </resultMap></mapper>

2)mybatis-config.xml文件
<typeAliases>  <package name="com.hlx.pojo" />  <package name="com.hlx.entity" />  <!-- 可以配置多个 --></typeAliases>
<!-- 将mapper文件加入到配置文件中 --><mappers><mapper resource="com/hlx/dao/UserinfosMapper.xml" /><mapper resource="com/hlx/dao/UserinfoMapper.xml" /></mappers>

3)测试
public class UserTest {// 日志对象private Logger logger = Logger.getLogger(UserTest.class);@Testpublic void getId() {SqlSession session = null;try {// 获得会话session = MyBatisUtil.getSqlSession(true);/** * 映射sql的标识字符串, com.hlx.dao.UserinfosMapper是userinfosMapper. * xml文件中mapper标签的namespace属性的值, * getUserinfo是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL */// 映射sql的标识字符串String statement = "com.hlx.dao.UserinfoMapper.getByid";// 执行插入操作Userinfo userinfos = session.selectOne(statement, 23);logger.debug("查询数据!");System.out.println(userinfos);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {session.close(); // 对应一次数据库会话,会话结束必须关闭}}}
执行后的效果:

  1、getById方法执行查询后返回一个null。

  2、getByIdA方法和getByIdB方法执行查询后可以正常得到想要的结果。

四、总结

  解决办法一: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。

  解决办法二: 通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。







0 0