`
baobeituping
  • 浏览: 1067925 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MyBatis解决Java实体类和数据库表字段不一致方法总结

 
阅读更多

在此,首先说明一点任何持久性框架都需要解决一个问题,那就是Java实体类的字段一般来说基本上会与数据库表中字段不一致,那么它们是如何解决的呢?咱们以Hibernate和SpringJDBC为例说明一下;

1、Hibernate中一般通过XML映射和注解的方式解决不一致问题,看下面两个简单例子,

注解方式:


[java] view plain copy
@Entity 
@Table(name = "ACCOUNT") 
public class Account implements Serializable { 
    private static final long serialVersionUID = 1L; 
 
    @Id 
    @GeneratedValue 
    private int id; 
 
    @Column(name="fld_number") 
    private String number; 
     
    @OneToMany(mappedBy="account") 
    private Set<Client> clients; 
     
    private double balance; 
 


XML映射文件配置方式:

[html] view plain copy
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
 
<hibernate-mapping> 
 
    <class name="org.hibernate.test.domain.Account" table="ACCOUNT" lazy="false"> 
        <id name="id" column="ACCOUNT_ID"> 
            <generator class="native"/> 
        </id> 
 
        <many-to-one name="person" class="org.hibernate.test.domain.Person" cascade="save-update,lock" 
                     column="person_id" 
                     unique="true" 
                     not-null="true"/> 
    </class> 
 
</hibernate-mapping> 

2、Spring JDBC一般通过使用RowCallbackHandler和RowMapper,编写回调函数的方式处理不一致,各种方法如下所示:

好的,了解完上述两种方式,咱们再来看看对于同样的问题,MyBatis是如何处理的?

对于这种问题,MyBatis主要提供了两种方式用来解决该问题;

一、通过对查询SQL采用字段别名的方式

1、新建表和插入数据


[html] view plain copy
DROP TABLE IF EXISTS `sl_company`; 
CREATE TABLE `sl_company` ( 
  `company_id` int(11) NOT NULL AUTO_INCREMENT, 
  `company_name` varchar(50) DEFAULT NULL, 
  `full_name` varchar(100) DEFAULT NULL, 
  `address` varchar(100) DEFAULT NULL, 
  `post_code` varchar(45) DEFAULT NULL, 
   PRIMARY KEY (`company_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 
 
-- ---------------------------- 
-- Records of sl_company 
-- ---------------------------- 
INSERT INTO `sl_company` VALUES ('1', '锐客科技', '上海锐客科技股份有限公司', '上海市浦东新区峨山路91弄97号陆家嘴软件园5号楼3层', '200127'); 

2、创建对应的实体类

[java] view plain copy
package com.mybatis.entity; 
 
import java.io.Serializable; 
 
public class SlCompany implements Serializable { 
 
    private static final long serialVersionUID = 1L; 
 
    private int companyId; 
 
    private String companyName; 
 
    private String fullName; 
 
    private String address; 
 
    private String postCode; 
 
    public SlCompany() { 
        super(); 
    } 
 
    public int getCompanyId() { 
        return companyId; 
    } 
 
    public void setCompanyId(int companyId) { 
        this.companyId = companyId; 
    } 
 
    public String getCompanyName() { 
        return companyName; 
    } 
 
    public void setCompanyName(String companyName) { 
        this.companyName = companyName; 
    } 
 
    public String getFullName() { 
        return fullName; 
    } 
 
    public void setFullName(String fullName) { 
        this.fullName = fullName; 
    } 
 
    public String getAddress() { 
        return address; 
    } 
 
    public void setAddress(String address) { 
        this.address = address; 
    } 
 
    public String getPostCode() { 
        return postCode; 
    } 
 
    public void setPostCode(String postCode) { 
        this.postCode = postCode; 
    } 
     


3、上述创建完成后可以很明显发现字段名称与属性名称不一致,继续看如何解决该问题,找到slCompanyMapper.xml文件,修改文件内容如下:

[html] view plain copy
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.mybatis.mappings.slCompanyMapper"> 
    <!-- 通过使用字段别名的方式,AS关键字前面的是数据库表的字段名,后面对应的Java实体类对应的属性名称 --> 
    <select id="getSlCompany" parameterType="int" 
        resultType="com.mybatis.entity.SlCompany"> 
        SELECT company_id AS companyId,company_name AS 
        companyName,full_name AS fullName, post_code AS postCode, address FROM 
        sl_company WHERE company_id=#{id} 
    </select> 
</mapper> 

4、执行测试类,发现通过上述方式,仍然执行出既定结果,需要说明的是如果字段过多、过长,我们可以继续采用下面方式,将字段列表单独映射出来,用的时候直接导入即可,如下所示:

[html] view plain copy
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.mybatis.mappings.slCompanyMapper"> 
    <!-- 通过使用字段别名的方式,AS关键字前面的是数据库表的字段名,后面对应的Java实体类对应的属性名称 --> 
    <!-- SlCompany字段映射列表 --> 
    <sql id="getSlCompanyColumns"> 
        company_id AS companyId, 
        company_name AS companyName, 
        full_name AS fullName,  
        post_code AS postCode,  
        address  
    </sql> 
    <!-- 通过使用include元素的refid属性引入上面自定义的映射列表 --> 
    <select id="getSlCompany" parameterType="int" resultType="com.mybatis.entity.SlCompany"> 
        SELECT <include refid="getSlCompanyColumns"/> FROM    sl_company WHERE company_id=#{id} 
    </select> 
</mapper> 

二、通过在xml中自定义结果映射的方式
1、表结构与java实体类同上,不在赘述。

2、下面来看看映射xml中的变化;


[html] view plain copy
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
<mapper namespace="com.mybatis.mappings.slCompanyMapper"> 
    <!-- 通过使用结果映射的方式 --> 
    <select id="getSlCompany2" parameterType="int" resultMap="slCompanyResultMap"> 
        SELECT * FROM sl_company WHERE company_id=#{id} 
    </select> 
     
    <!-- 通过使用resultMap元素自定义结果映射,该元素内部的id和result提供了javaType、jdbcType、typeHandler属性满足类型要求 --> 
    <resultMap type="com.mybatis.entity.SlCompany" id="slCompanyResultMap"> 
        <!-- 通过id元素映射主键类型 --> 
        <id column="company_id" property="companyId" /> 
        <!-- 通过result元素映射非主键类型 --> 
        <result column="company_name" property="companyName"/> 
        <result column="full_name" property="fullName"/> 
        <!-- 当字段名和属性名一致是,可写可不写 --> 
        <result column="address" property="address"/> 
        <result column="post_code" property="postCode"/> 
    </resultMap> 
     
</mapper> 

3、执行简单输出类

[java] view plain copy
package com.mybatis.test; 
 
import java.io.IOException; 
import java.io.InputStream; 
 
import org.apache.ibatis.io.Resources; 
import org.apache.ibatis.session.SqlSession; 
import org.apache.ibatis.session.SqlSessionFactory; 
import org.apache.ibatis.session.SqlSessionFactoryBuilder; 
 
import com.mybatis.entity.SlCompany; 
 
public class MyBatisTest { 
     
    public static void main(String[] args) throws IOException { 
         
        // mybatis提供了Resources类用来提供简易方式来获取各种来源的资源文件信息 
        // 获取mybatis.xml的字节流 
        InputStream is = Resources.getResourceAsStream("mybatis.xml"); 
        // 获取mybatis.xml的字符流 
        //Reader reader = Resources.getResourceAsReader("mybatis.xml"); 
         
        // 构建SqlSessionFactory对象,传入字符流或字节流均可 
        SqlSessionFactory SqlSessionFactory = new SqlSessionFactoryBuilder().build(is); 
        // 获取SqlSession对象 
        SqlSession sqlSession = SqlSessionFactory.openSession(); 
         
        // 执行查询操作 
        // selectOne()方法的第一个参数是由slCompanyMapper.xml里配置的mapper的namespace属性 + 该mapper下select元素的id属性值组成的 
        SlCompany slCompany = sqlSession.selectOne("com.mybatis.mappings.slCompanyMapper.getSlCompany2", 1); 
         
        // 用完SqlSession之后,不要忘记关闭 
        sqlSession.close(); 
         
        System.out.println(slCompany.getAddress()); 
    } 


输出既定信息;
总结:无论上述哪一种方式都提供了一种解决不一致的途径,需要注意它俩的不同点;

第一种方式直接在查询SQL语句下手,通过采用别名的方式,也就是说这种方式在得到查询结果集之前就搞定了不一致问题,获取到了跟属性名称一致的结果集;

第二种方式是在获取结果集之后,对结果集下手;

 

分享到:
评论

相关推荐

    java实体类字段自定义-数据库字段和程序实体类属性不一致解决方案.docx

    Java 实体类字段自定义-数据库字段和程序实体类属性不一致解决方案 Java 实体类字段自定义是指在 Java 开发中,实体类的字段与数据库表的字段不一致的问题。这种情况下,需要实现实体类字段的自定义,以便与数据库...

    修改mybatis-generator源码实现实体类字段上方加上数据库中填写的注释

    标题 "修改mybatis-generator源码实现实体类字段上方加上数据库中填写的注释" 描述了一种增强MyBatis Generator(MBG)功能的方法,目的是在生成的实体类字段上添加对应数据库字段的注释。这能提高代码的可读性和...

    SpringBoot + MybatisPlus 实现实体类转成数据库表结构,可直接运行

    总结,通过SpringBoot和MybatisPlus的结合,我们可以方便地从Java实体类生成数据库表结构,无需手动编写SQL脚本。这种方式对于快速构建原型或者在数据丢失后恢复表结构非常有用。在实际应用中,记得对重要数据进行...

    springboot+mybatis通过实体类自动生成数据库表的方法

    Spring Boot + MyBatis 通过实体类自动生成数据库表的方法 本文主要介绍了使用 Spring Boot 2.1.8.RELEASE 和 MyBatis 生成数据库表的方法。该方法通过实体类自动创建数据库表,并提供了详细的示例代码,对学习和...

    MyBatis表字段名与实体属性名不一致-src.zip

    在使用MyBatis框架进行Java开发时,常常会遇到数据库表字段名与实体类属性名不一致的情况。这种情况通常是因为数据库设计规范与编程语言的命名习惯不同,或者是为了避免SQL注入等问题而采取的措施。本压缩包文件...

    Mybatis快速生成实体类和mapperAndXml

    在Mybatis中,实体类的属性与表字段一一对应,这样可以方便地进行对象与数据之间的映射。利用这个工具,你可以快速生成带有注解的实体类,比如`@Table`,`@Id`,`@Column`等,这些注解有助于Mybatis理解如何进行ORM...

    mybatis自动生成实体类和配制文件.zip_java 自动生成_工具

    当使用MyBatis时,通常每个数据库表都会对应一个实体类,这个实体类会包含表字段对应的属性以及getter和setter方法。自动生成功能可以快速地根据数据库表结构生成这些类,避免了开发者逐个手工创建的繁琐过程。 ...

    mybatis实体类自动生成工具

    该工具的主要功能是自动生成与数据库表对应的Java实体类。通常,当我们建立一个新的数据库表后,需要手动创建相应的实体类,包括属性、getter和setter方法以及注解等。而使用这个工具,只需简单配置,就能自动化完成...

    MySQL表自动生成Java实体类

    实体类通常包含对应于数据库表字段的属性,并且具有getter和setter方法,以及可能的构造函数和注解,如`@Entity`、`@Table`、`@Id`等,以定义表名和主键。 接下来,我们讨论如何自动生成这些实体类。这里提到的工具...

    Java自动生成数据库表实体类和mybatis接口以及xml文件

    MyBatis Generator是一个强大的工具,它能够根据数据库表结构自动创建Java实体类、Mapper接口和对应的XML配置文件。下面我们将以MyBatis Generator为例进行介绍。 1. **MyBatis Generator配置**:MBG通过一个XML...

    java实体类生成工具

    4. 生成代码:根据用户的选择,工具将自动生成Java实体类文件,这些文件包含了对应数据库表字段的属性和方法。 使用Java实体类生成工具有以下好处: 1. 提升效率:自动化的代码生成减少了手动编码的时间,尤其是在...

    本地自动生成MyBatis映射类实体类

    2. **实体类**:实体类是数据库表结构在代码中的映射,包含了与表字段相对应的属性和getter/setter方法。实体类是业务对象的基础,用于数据传输和模型表示。 3. **自动生成工具**:许多IDE如IntelliJ IDEA和Eclipse...

    MyBatis--解决字段名与实体类属性名不相同的冲突--源代码

    在使用MyBatis进行数据持久化操作时,有时会遇到数据库表字段名与Java实体类属性名不一致的情况。这可能会导致映射问题,影响到数据的正常读写。为了解决这种冲突,MyBatis提供了一些灵活的映射机制。下面我们将详细...

    mybatis实体类等生成工具

    1. **实体类(Entity Class)**:实体类是数据库表的Java对象表示,通常包含与数据库表字段相对应的属性。这个工具能够根据数据库表结构自动生成对应的实体类,包括属性、getter和setter方法,以及注解(如`@Table`...

    Mybatis 实体类+Mapper实体映射文件+接口+Config主配置文件+测试类

    每个实体类通常会对应数据库中的一行记录,属性与表字段一一对应。实体类的每个属性都有对应的getter和setter方法,方便进行数据操作。 2. **Mapper实体映射文件(Mapper XML)**:这是Mybatis的核心组件之一,用于...

    generator-mybatis接口类、实体类、xml文件生成工具

    2. 实体类生成:对于每个数据库表,generator-mybatis会创建一个对应的实体类,实体类中的属性与表字段一一对应,同时提供getter和setter方法,方便进行对象与数据间的转换。实体类通常用于封装业务数据,是数据访问...

    数据库表转实体类和DTO

    - 然后,根据表信息,工具会生成对应的实体类,类的属性与表字段一一对应,同时可能包含getter和setter方法。 - 对于DTO,工具可能会生成一个更简洁的类,仅包含需要在业务层和视图层之间传递的必要字段。 - 最后...

    mybatis逆向工程数据库实体生产工具

    这些生成的文件通常包含了数据库表字段与Java属性的对应关系,以及基本的CRUD操作对应的SQL语句。 使用MyBatis逆向工程步骤如下: 1. **配置环境**:首先确保已经安装并配置好Java环境,同时在项目中引入MyBatis的...

    Mybatis用到的资料

    3. 实体类:创建与数据库表对应的Java实体类。 4. SqlSessionFactory:使用配置文件创建SqlSessionFactory,它是Mybatis的核心,用于生成SqlSession对象。 5. SqlSession:通过SqlSessionFactory获取SqlSession,...

    java根据数据库自动生成vo 类

    这些框架提供了元数据映射功能,可以根据数据库表自动生成Java实体类,而这些实体类可以视作VO类的变种。 1. Hibernate: Hibernate 是一个强大的ORM框架,它允许开发者将Java对象映射到数据库表。通过配置...

Global site tag (gtag.js) - Google Analytics