在项目开发中,数据库中的字段名不一定和实体类的类名完全相同(当然大小写忽略),那么就可以在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. English trip V1 - B 15. Giving Personal Information 提供个人信息 Teacher:Solo Key: Do/Does

    In this lesson you will learn to answer simple questions about yourself.  本节课讲学到回答关于自己的一些简单问题 课上内容(L ...

  2. 时钟中断TIMER_BH(bottom_half)实现分析

    017-12-6 16:27:35时钟中断TIMER_BH(bottom_half)实现分析1.3.1001. 时钟0号中断安装    setup_x86_irq(0, &irq0);@arc ...

  3. mac下 配置homebrew 和java home

    1.terminal下输入   /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...

  4. VitrualBox、vagrant、homestead的关系

    VitrualBox 是一款非常强大的免费虚拟机软件,使用者可以在 VitrualBox 上安装并运行 Linux.Windows.Mac OS X 等操作系统,类似的软件还有 VMware Vagr ...

  5. HTTP的连接过程

    一.HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1.域名解析 2.发起TCP的3次握手 3. Web浏览器向Web服务器发送http请求命令  ...

  6. CF-877E-线段树+哈希

    http://codeforces.com/problemset/problem/877/E 给出一颗有根树,没个节点上有一个值0/1,有两种操作,一个是选中一个节点,对他所对应的那个子树上所有节点的 ...

  7. Boosting

    Boosting is a greedy alogrithm. The alogrithm works by applying the weak learner sequentially to wei ...

  8. express中app.get和app.use的解析

    app.get(path,callback)中的callback只能是函数 app.use(path,callback)中的callback既可以是router对象又可以是函数 当其是router对象 ...

  9. Git中的文件上传、修改、撤消修改和删除

     1.添加文件.提交文件 1.1在learngit目录下创建一个readme.txt文件,并且输入内容. 1.2添加文件到版本库learngit 1.2.1使用git add 文件告诉Git把文件添加 ...

  10. CSS知识点(三)

    十三.标准文档流. 标准文档流下有哪些微观现象? 1.空白折叠现象 多个空格会被合并成一个空格显示到浏览器页面中.img标签换行写.会发现每张图片之间有间隙,如果在一行内写img标签,就解决了这个问题 ...