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

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

注解方式:

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

XML映射文件配置方式:

<?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、新建表和插入数据

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、创建对应的实体类

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文件,修改文件内容如下:

<?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 AScompanyName,full_name AS fullName, post_code AS postCode, address FROMsl_company WHERE company_id=#{id}</select>
</mapper>

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

<?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中的变化;

<?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、执行简单输出类

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语句下手,通过采用别名的方式,也就是说这种方式在得到查询结果集之前就搞定了不一致问题,获取到了跟属性名称一致的结果集;

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

MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结相关推荐

  1. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao ...

  2. MyBatis由浅入深学习总结之一:MyBatis入门案例

    一.MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名 ...

  3. Mybatis解决实体类属性和表字段对应不上

    一.通过XML文件中的resultMap 这种方式是最常见的,类似如下: <mapper namespace="demo.UserDao"><resultMap ...

  4. MyBatis的学习之路(二)

    上篇文章介绍了MyBatis的配置文件,现在来介绍实体映射文件Mapper.xml. 说道实体映射文件,就不得不说一下实体与表之间的映射关系:单表映射和多表映射. a. 单表映射 1 public c ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6973266.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(九)--My ...

  6. 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型

    问题描述: 使用MyBatis Plus 3.2.0版本插件代码生成器生成实体类后,对于数据库中字段类型datetime的字段会转变为LocalDateTime类型,IDEA提示报错"Usa ...

  7. java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...

  8. mybatis generator 自动生成代码(带注释的实体类)

    使用前提: 当你开发的java 项目或新模块的数据库有N张表操作时,这时要自己写实体类.dao.SqlMapper.xml等文件,如果有多个表,就是造成时间浪费降低开发效率,所以建议使用mybatis ...

  9. 关于解决SpringDataJpa框架实体类表字段创建顺序与数据库表字段展示顺序不一致的问题

    关于解决SpringDataJpa框架实体类表字段创建顺序与数据库表字段展示顺序不一致的问题 参考文章: (1)关于解决SpringDataJpa框架实体类表字段创建顺序与数据库表字段展示顺序不一致的 ...

最新文章

  1. 爬虫之requests模块发送带header的请求
  2. Python零基础学习代码实践 —— 提取字符串里面的单词数
  3. Regex入门(一)
  4. Git恢复之前版本的两种方法reset、revert详解
  5. 布隆过滤器之Python+Redis
  6. 解析JVM线程同步机制
  7. 秒懂5G!通俗易懂外行也能看明白
  8. 哈尔滨工业大学计算机培养计划,哈工大计算机科学与技术专业本科生培养方案.docx...
  9. iOS 静态度制作方法详细
  10. android四周阴影效果_帮助独立开发者轻松创建令人惊叹的产品视觉效果
  11. 不知道用什么图表展示数据?看这份图表选择指南就够了
  12. java unit test怎么写_Java J Unit Test
  13. redis 设置密码 和 redis.config文件
  14. 相同MAC地址,相同IP的两天电脑为什么可以同时上网互不影响(转自Nothel的blog)
  15. ruby nokogiri 数据抓取
  16. dram和nand哪个难生产_终于有人说清楚了什么是DRAM、什么是NAND Flash
  17. php编程风格规范,PHP 编码风格规范指南
  18. 基(là)础(jī)线段树详解
  19. UI组件DevExpress WinForm入门指南 - DialogService服务
  20. c2c运营流程图_电商运营流程图模板分享,运营的核心都在这里了,快来拿走吧...

热门文章

  1. erlang csv
  2. [转载]监控 Linux 性能的 18 个命令行工具
  3. 在 Redis 上实现的分布式锁
  4. tomcat4 请求的处理——初步分析
  5. ECharts 入门真的很简单
  6. MySQL基础——DDL语言学习\数据库的建立\MySQL数据类型\MySQL常见约束\表的增删改
  7. OpenCV3学习(10.2)codebook码书法实现背景剔除
  8. 7-157 求一元二次方程的根 (20 分)
  9. 判断上三角矩阵 (15 分)
  10. PTA6、输出10个不重复的英文字母 (10 分)