mabatis学习(四)----解决字段名与实体类属性名不同的冲突
在项目开发中,数据库中的字段名不一定和实体类的类名完全相同(当然大小写忽略),那么就可以在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学习(四)----解决字段名与实体类属性名不同的冲突的更多相关文章
- 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
[转]MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013307.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这 ...
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习笔记(四)——解决字段名与实体类属性名不相同的冲突
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4264425.html 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演 ...
- 四:MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结(四)——字段名与实体类属性名不相同的冲突的解决
表中的字段名和表对应实体类的属性名称不一定都是完全相同的,这种情况下的如何解决字段名与实体类属性名不相同的冲突.如下所示: 一.准备演示需要使用的表和数据 CREATE TABLE my_user( ...
- MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...
- MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突
一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), ...
- MyBatis解决字段名与实体类属性名不相同的冲突(四)
一.创建表和表数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no ), order_price FLOA ...
随机推荐
- maven---->配置,指令,插件,使用
maven是用于java的自动化构建工具. 1.下载:http://maven.apache.org/download.cgi 下载下面截图标红处的文件 然后直接解压可以得到文件夹,得到如下文件夹 不 ...
- yarn hadoop-2.3.0 installation cluster Centos 64bits
Apache Hadoop -2.2.0 - How to Install a Three Nodes Cluster http://tonylixu.blogspot.ca/2014/02/apac ...
- Lua常用封装方法
Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...
- mac 下配置Android sdk
1.通过homebrew进行安装 地址:https://brew.sh/index_zh-cn.html 2.homebrew install android sdk 3.找到路径如: /Users ...
- 『TensorFlow』SSD源码学习_其八:网络训练
Fork版本项目地址:SSD 作者使用了分布式训练的写法,这使得训练部分代码异常臃肿,我给出了部分注释.我对于多机分布式并不很熟,而且不是重点,所以不过多介绍,简单的给出一点训练中作者的优化手段,包含 ...
- harbor安装
一.下载安装包https://github.com/goharbor/harbor/releases wget https://storage.googleapis.com/harbor-releas ...
- leetcode-algorithms-4 Median of Two Sorted Arrays
leetcode-algorithms-4 Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of siz ...
- 转载-Mac下面的SecureCRT(附破解方案) 更新到最新的8.0.2
原帖地址:http://bbs.feng.com/read-htm-tid-6939481.html,爱死楼主了,哈哈 真心感谢 继续更新到8.3.0的破解,整体的破解方案都发生了的变化首先还是去ht ...
- subline 自己使用的插件
http://blog.csdn.net/jianhua0902/article/details/43761899 https://www.cnblogs.com/qingkong/p/5039527 ...
- 元类应用ORM实现
首先看下一个简单的例子 # 需求 import numbers class Field: pass class IntField(Field): # 数据描述符 def __init__(self, ...