在项目开发中,数据库中的字段名不一定和实体类的类名完全相同(当然大小写忽略),那么就可以在sql映射文件中解决此问题

一.创建需要的数据库和表

编写sql脚本,在navicat for mysql中执行后生成表

 CREATE TABLE orders(
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20),
order_price FLOAT
);
INSERT INTO orders(order_no, order_price) VALUES('banana', 23);
INSERT INTO orders(order_no, order_price) VALUES('dogfood', 33);
INSERT INTO orders(order_no, order_price) VALUES('apple',8);

二.定义实体类

 package me.gacl.domain;

 /**
* Order实体类
*/
public class Order {
private int id;//id对应order_id
private String orderno;//no对应order_no
private String price;//price对应order_price public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getOrderno() {
return orderno;
} public void setOrderno(String orderno) {
this.orderno = orderno;
} public String getPrice() {
return price;
} public void setPrice(String price) {
this.price = price;
} @Override
public String toString() {
return "Order{" +
"id=" + id +
", name='" + orderno + '\'' +
", price='" + price + '\'' +
'}';
}
}

三.定义映射文件

1.首先定义OrderMapper.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">
<!--namespace一般命名成报名+映射名-->
<mapper namespace="me.gacl.mapping.OrderMapper">
<!--根据id查询对应的Order,但是这得不到我们想要的结果,因为实体类的属性名和数据库字段名不一样-->
<select id="getOrderById" parameterType="int" resultType="Order">
select * from orders where order_id=#{id}
</select>
<!--根据id查询对应的Order,可以得到我们想要的结果,因为我们将数据库中
查询到的字段名重命名,重命名后和实体类的字段名一样-->
<select id="getOrderByIdList" parameterType="int" resultType="Order">
select order_id id,order_no orderno,order_price price from orders where order_id=#{id}
</select>
<!--根据id查询对应的Order,通过resultMap指定属性名和字段名的一一对应关系-->
<select id="getOrderByIdMap" parameterType="int" resultMap="OrderResultMap">
select * from orders where order_id=#{id}
</select>
<resultMap id="OrderResultMap" type="me.gacl.domain.Order">
<!--通过id标签指定主键的对应关系-->
<!--通过result标签指定其他字段名与属性名的对应关系-->
<id property="id" column="order_id"></id>
<result property="orderno" column="order_no"></result>
<result property="price" column="order_price"></result>
</resultMap>
</mapper>

2.在mybatis-config.xml中注册映射OrderMapper.xml文件

 <!--resource值是映射文件所在的路径-->
<!--class值是映射接口类所在的路径-->
<mappers>
<!--mapper resource="mapping/userMapper.xml"></mapper>-->
<!--<mapper class="me.gacl.map.UserMapperI"></mapper>-->
<mapper resource="mapping/OrderMapper.xml"></mapper>
</mappers>

四.编写测试类

测试类OrderTest.java

 package me.gacl.domain;

 import me.gacl.Util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession; import java.util.List; /**
* 测试类
*/
public class OrderTest {
public void testGetOrderById(){
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
//statement是映射sql的标识字符串,me.gacl.mapping.OrderMapper是OrderMapper.xml中mapper标签的namespace属性,
//getOrderById是select标签的id,通select标签的id值可以找到要执行的sql语句
String statement = "me.gacl.mapping.OrderMapper.getOrderById";
//执行查询全部操作
Order order = sqlSession.selectOne(statement,1);
//使用sqlSession执行完后需要关闭sqlSession
sqlSession.close();
System.out.println(order);
}
public void testGetOrderByList(){
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
//statement是映射sql的标识字符串,me.gacl.mapping.OrderMapper是OrderMapper.xml中mapper标签的namespace属性,
//getOrderByList是select标签的id,通select标签的id值可以找到要执行的sql语句
String statement = "me.gacl.mapping.OrderMapper.getOrderByIdList";
//执行查询全部操作
Order order = sqlSession.selectOne(statement,1);
//使用sqlSession执行完后需要关闭sqlSession
sqlSession.close();
System.out.println(order);
}
public void testGetOrderByMap(){
SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
//statement是映射sql的标识字符串,me.gacl.mapping.OrderMapper是OrderMapper.xml中mapper标签的namespace属性,
//testGetOrderByMap是select标签的id,通select标签的id值可以找到要执行的sql语句
String statement = "me.gacl.mapping.OrderMapper.getOrderByIdMap";
//执行查询全部操作
Order order = sqlSession.selectOne(statement,1);
//使用sqlSession执行完后需要关闭sqlSession
sqlSession.close();
System.out.println(order);
} public static void main(String[] args) {
OrderTest orderTest = new OrderTest();
//orderTest.testGetOrderById();
//orderTest.testGetOrderByList();
orderTest.testGetOrderByMap();
}
}

测试结果如下:

执行orderTest.testGetOrderById()

执行orderTest.testGetOrderByList()

执行orderTest.testGetOrderByMap()

五.总结

当实体类属性名与数据库中字段名不一致时,mybatis进行查询操作时无法查询出结果的解决方法有以下两个:

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

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

mabatis学习(四)----解决字段名与实体类属性名不同的冲突的更多相关文章

  1. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

  2. MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...

  3. MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...

  4. MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...

  5. 四:MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...

  6. MyBatis学习总结(四)——字段名与实体类属性名不相同的冲突的解决

    表中的字段名和表对应实体类的属性名称不一定都是完全相同的,这种情况下的如何解决字段名与实体类属性名不相同的冲突.如下所示: 一.准备演示需要使用的表和数据 CREATE TABLE my_user( ...

  7. MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...

  8. MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突

    一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...

  9. MyBatis解决字段名与实体类属性名不相同的冲突(四)

    一.创建表和表数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no ), order_price FLOA ...

随机推荐

  1. Python实现一条基于POS算法的区块链

    区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的 ...

  2. 微信小程序双击事件的绑定

  3. 微信小程序地图demo完整

    <block wx:for="{{data_2}}" wx:key='index' wx:if="{{data_2.length}}"> <v ...

  4. 2.3 UML活动图

    活动图定义 活动图描述了在一个过程中,顺序的/并行的活动及其之间的关系 应用于商业过程.工作流(业务过程).复杂算法的建模 活动图是顶点和弧的集合 活动节点 动作 流 对象值 注解和约束等 活动图基本 ...

  5. 04 爬虫数据存储之Mongodb

    MongoDB 认识MongoDB MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据 ...

  6. Lowest Common Ancestor of a Binary Search Tree(Java 递归与非递归)

    题目描述: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in ...

  7. 在写makefile过程中遇到的问题

    老师布置了linux实验作业,本身不打算写了,反正也不交实验报告,但刚好项目也需要,所以就研究了makefile.不过还是要批评自己,怎么能这么的颓废呢? 刚开始做的时候出现了这样的错误,代码如下: ...

  8. vim操作(待补充)

    :wq 存盘 + 退出 (:w 存盘, :q 退出) :e 打开新文件 :q 退出 h.j.k.l,分别控制光标左.下.上.右移一格. 按Ctrl+B:屏幕往后移动一页.[常用] 按Ctrl+F:屏幕 ...

  9. 第二阶段——个人工作总结DAY09

    1.昨天做了什么:昨天学习了有关后台的知识. 2.今天打算做什么:实现后台. 3.遇到的困难:还是不知道该如何来做.

  10. 5月17 AJAX返回类型-------JSON和XML

    ajax返回类型有TEXT,JSON,XML 一.TEXT 查看之前的练习 二.JSON var js = { aa:{code:"p001",name:"张三" ...