MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
来源:互联网 发布:mysql编写自定义函数 编辑:程序博客网 时间:2024/05/11 04:49
在此,首先说明一点任何持久性框架都需要解决一个问题,那就是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"/> FROMsl_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语句下手,通过采用别名的方式,也就是说这种方式在得到查询结果集之前就搞定了不一致问题,获取到了跟属性名称一致的结果集;
第二种方式是在获取结果集之后,对结果集下手;
3 0
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
- MyBatis解决Java实体类和表字段不一致方法
- Mybatis 实体类和表字段不一致解决方案
- Mybatis总结(3)--之数据库字段名和实体类属性名不一致
- MyBatis之实体类属性与表字段不一致的处理
- Mybatis属性和数据库表字段不一致处理
- Mybatis框架实体类字段与数据库表字段不一致导致查询该字段的值一直为null
- MyBatis学习笔记:表字段名与实体类属性名不一致的解决方法
- 解决mybatis generator生成实体类和数据库字段名不一致
- mybatis返回插入的id以及类属性和表字段不一致问题
- MyBatis 笔记(四)——实体类属性和表字段的映射
- MyBatis由浅入深学习总结之一:MyBatis入门案例
- mybatis解决数据库表列明与实体不一致问题
- 在Mybatis中,解决数据库字段名与java实体类属性名不一致的三种方式
- MyBatis学习总结(二)
- Mybatis学习总结二
- 【Dubbo实战】基础学习篇(一)
- runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)
- 极客
- Android一整套图片解决方案(fresco三级缓存框架内部已经实现)
- Integral Channel Features-论文整理
- MyBatis由浅入深学习总结之二:MyBatis解决Java实体类和数据库表字段不一致方法总结
- android支付笔记
- Codeforces Round #369 (Div. 2) [C] Coloring Trees
- Druid集连接池简单使用
- 发动机冷却系统的控制论文综述
- [新闻摘录]第一届山西省互联网大会(2015.07.03召开)概要
- matlab imwrite函数保存jpg格式图像丢失数据或改变图像
- MySQL数据类型
- iOS开发中常用到的处理异常的宏 NSAssert()