一、创建表和表数据

  1. CREATE TABLE orders(
  2. order_id INT PRIMARY KEY AUTO_INCREMENT,
  3. order_no VARCHAR(20),
  4. order_price FLOAT
  5. );
  6. INSERT INTO orders(order_no, order_price) VALUES('a1', 23);
  7. INSERT INTO orders(order_no, order_price) VALUES('a2', 33);
  8. INSERT INTO orders(order_no, order_price) VALUES('a3', 22);

二、创建实体类Order.java

  1. package codeRose.dao;
  2.  
  3. public class Order {
  4. //实体类的中属性名与表中字段名不一致
  5. private int id;
  6. private String orderNO;
  7. private float price;
  8. public int getId() {
  9. return id;
  10. }
  11. public void setId(int id) {
  12. this.id = id;
  13. }
  14. public String getOrderNO() {
  15. return orderNO;
  16. }
  17. public void setOrderNO(String orderNO) {
  18. this.orderNO = orderNO;
  19. }
  20. public float getPrice() {
  21. return price;
  22. }
  23. public void setPrice(float price) {
  24. this.price = price;
  25. }
  26. @Override
  27. public String toString() {
  28. return "Order [id=" + id + ", orderNO=" + orderNO + ", price=" + price + "]";
  29. }
  30.  
  31. }

三、编写sql映射文件orderMapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="codeRose.mapping.ordeMapper">
  4. <!--
  5. 根据id查询得到一个order对象,使用这个查询是查询不到我们想要的结果的,
  6. 这主要是因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录
  7. -->
  8. <select id="getOrderById" parameterType="int"
  9. resultType="codeRose.dao.Order">
  10. select * from orders where order_id=#{id}
  11. </select>
  12.  
  13. <!--
  14. 根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
  15. 这是因为我们将查询的字段名都起一个和实体类属性名相同的别名,这样实体类的属性名和查询结果中的字段名就可以一一对应上
  16. -->
  17. <select id="selectOrder" parameterType="int"
  18. resultType="codeRose.dao.Order">
  19. select order_id id, order_no orderNo,order_price price from orders where order_id=#{id}
  20. </select>
  21.  
  22. <!--
  23. 根据id查询得到一个order对象,使用这个查询是可以正常查询到我们想要的结果的,
  24. 这是因为我们通过<resultMap>映射实体类属性名和表的字段名一一对应关系 -->
  25. <select id="selectOrderResultMap" parameterType="int" resultMap="orderResultMap">
  26. select * from orders where order_id=#{id}
  27. </select>
  28. <!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
  29. <resultMap type="codeRose.dao.Order" id="orderResultMap">
  30. <!-- 用id属性来映射主键字段 -->
  31. <id property="id" column="order_id"/>
  32. <!-- 用result属性来映射非主键字段 -->
  33. <result property="orderNo" column="order_no"/>
  34. <result property="price" column="order_price"/>
  35. </resultMap>
  36. </mapper>

四.在配置文件conf.xml中注册sql映射文件orderMapper.xml

  1. <!-- 注册sql映射文件 -->
  2. <mappers>
  3. <!-- 包名/文件名 -->
  4. <mapper resource="codeRose/mapping/userMapper.xml"/>
  5. <mapper resource="codeRose/mapping/orderMapper.xml"/>
  6.  
  7. </mappers>

五、编写单元测试类(Junit)

  1. import org.apache.ibatis.session.SqlSession;
  2.  
  3. import codeRose.dao.Order;
  4. import codeRose.util.MyBatisUtil;
  5.  
  6. public class Test2 {
  7.  
  8. public void testById(){
  9.  
  10. SqlSession sqlSession=MyBatisUtil.getSqlSession();
  11. //映射sql标识的字符串
  12. String statement="codeRose.mapping.orderMapper.getOrderById";
  13. Order order=sqlSession.selectOne(statement,1);
  14. sqlSession.close();
  15. System.out.println(order);//
  16.  
  17. }
  18. public void testSelectOrder(){
  19. SqlSession sqlSession = MyBatisUtil.getSqlSession();
  20. String statement="codeRose.mapping.orderMapper.selectOrder";
  21. Order order =sqlSession.selectOne(statement, 1);
  22. sqlSession.close();
  23. System.out.println(order);
  24.  
  25. }
  26. public void testSelectOrder2(){
  27. SqlSession sqlSession = MyBatisUtil.getSqlSession();
  28. String statement ="codeRose.mapping.orderMapper.orderResultMap";
  29. Order order =sqlSession.selectOne(statement, 1);
  30. sqlSession.close();
  31. System.out.println(order);
  32.  
  33. }
  34.  
  35. }

执行单元测试的结果:

  1、testGetOrderById方法执行查询后返回一个null。

  2、testGetOrderById2方法和testGetOrderById3方法执行查询后可以正常得到想要的结果。

六、总结

  上面的测试代码演示当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题以及针对问题采用的两种办法:

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

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

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

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

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

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

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

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

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

  4. MyBatis——解决字段名与实体类属性名不相同的冲突

    原文:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况 ...

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

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

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

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

  7. Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html     http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...

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

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

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

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

随机推荐

  1. 8个新鲜的PHP常用代码

       /**      * +----------------------------------------------------------      * 生成UUID 单机使用      * ...

  2. SwingBench---ORACLE压力测试工具

    SwingBench---ORACLE压力测试工具 ◆描述SwingBench是Oracle UK的一个员工在一个被抛弃的项目的基础上开发的.目前稳定版本2.5,基于JDK.该工具是免费的,可以在作者 ...

  3. C语言的函数类型

    C语言的函数类型与返回值类型不一致时出现,是以函数类型为标准; 而如果在java与c#语言中上述情况是编译错误的;

  4. Spring DM所提供的Bundle监听接口OsgiBundleApplicationContextListener

    通过使用Spring DM提供的监听接口,我们可以更好的对服务进行管控,其实该接口也非常简单就能使用上,只要自定义一个类实现OsgiBundleApplicationContextListener接口 ...

  5. 5分钟快速入门 - Less

    下面给大家讲解下Less,纯手工,入门级别,相信没学过的人阅读完后就懂了,以下是我要讲的四点: 简单介绍 Less CSS 是一个使用广泛的 CSS 预处理器. 对 CSS 进行扩展,减少很多 CSS ...

  6. EM and GMM(Theory)

    Part 1: Theory 目录: What's GMM? How to solve GMM? What's EM? Explanation of the result What's GMM? GM ...

  7. cli/php.ini和fpm/php.ini的区别

    1. 当从命令行执行PHP binary时,cli/php.ini会被使用,你可以通过在命令行运行php --ini来查看. 2. 当PHP运行做为FPM时,会使用fpm/phh.ini,其中一种情况 ...

  8. maven 常用脚本

    Maven库: http://repo2.maven.org/maven2/ Maven依赖查询: http://mvnrepository.com/ Maven常用命令: 1. 创建Maven的普通 ...

  9. KEEP!

    [list][*]别问我前端有没有前途,我不知道,我只知道我现在喜欢前端,以后也应该喜欢.[*]别问我前端的工作好不好找,不管哪一职位,工作好不好找都是看你的水平.[*]别问我前端累不累,这世界就没有 ...

  10. CSS中padding和margin以及用法

    CSS中padding与margin 1.padding:内边距,表示控件内容相对于边缘的距离. 2.margin:外边距,表示控件边缘相对于父空间的边缘. 参考:http://www.studyof ...