芝麻_糊

导航

mabatis学习(四)----解决字段名与实体类属性名不同的冲突

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

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

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

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('banana', 23);
7 INSERT INTO orders(order_no, order_price) VALUES('dogfood', 33);
8 INSERT INTO orders(order_no, order_price) VALUES('apple',8);

二.定义实体类

 1 package me.gacl.domain;
 2 
 3 /**
 4  * Order实体类
 5  */
 6 public class Order {
 7     private int id;//id对应order_id
 8     private String orderno;//no对应order_no
 9     private String price;//price对应order_price
10 
11     public int getId() {
12         return id;
13     }
14 
15     public void setId(int id) {
16         this.id = id;
17     }
18 
19     public String getOrderno() {
20         return orderno;
21     }
22 
23     public void setOrderno(String orderno) {
24         this.orderno = orderno;
25     }
26 
27     public String getPrice() {
28         return price;
29     }
30 
31     public void setPrice(String price) {
32         this.price = price;
33     }
34 
35     @Override
36     public String toString() {
37         return "Order{" +
38                 "id=" + id +
39                 ", name='" + orderno + '\'' +
40                 ", price='" + price + '\'' +
41                 '}';
42     }
43 }

三.定义映射文件

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

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

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

四.编写测试类

测试类OrderTest.java

 1 package me.gacl.domain;
 2 
 3 import me.gacl.Util.MyBatisUtil;
 4 import org.apache.ibatis.session.SqlSession;
 5 
 6 import java.util.List;
 7 
 8 /**
 9  * 测试类
10  */
11 public class OrderTest {
12     public void testGetOrderById(){
13         SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
14         //statement是映射sql的标识字符串,me.gacl.mapping.OrderMapper是OrderMapper.xml中mapper标签的namespace属性,
15         //getOrderById是select标签的id,通select标签的id值可以找到要执行的sql语句
16         String statement = "me.gacl.mapping.OrderMapper.getOrderById";
17         //执行查询全部操作
18         Order order =  sqlSession.selectOne(statement,1);
19         //使用sqlSession执行完后需要关闭sqlSession
20         sqlSession.close();
21         System.out.println(order);
22     }
23     public void testGetOrderByList(){
24         SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
25         //statement是映射sql的标识字符串,me.gacl.mapping.OrderMapper是OrderMapper.xml中mapper标签的namespace属性,
26         //getOrderByList是select标签的id,通select标签的id值可以找到要执行的sql语句
27         String statement = "me.gacl.mapping.OrderMapper.getOrderByIdList";
28         //执行查询全部操作
29         Order order =  sqlSession.selectOne(statement,1);
30         //使用sqlSession执行完后需要关闭sqlSession
31         sqlSession.close();
32         System.out.println(order);
33     }
34     public void testGetOrderByMap(){
35         SqlSession sqlSession = MyBatisUtil.getSqlSession(true);
36         //statement是映射sql的标识字符串,me.gacl.mapping.OrderMapper是OrderMapper.xml中mapper标签的namespace属性,
37         //testGetOrderByMap是select标签的id,通select标签的id值可以找到要执行的sql语句
38         String statement = "me.gacl.mapping.OrderMapper.getOrderByIdMap";
39         //执行查询全部操作
40         Order order =  sqlSession.selectOne(statement,1);
41         //使用sqlSession执行完后需要关闭sqlSession
42         sqlSession.close();
43         System.out.println(order);
44     }
45 
46     public static void main(String[] args) {
47         OrderTest orderTest = new OrderTest();
48         //orderTest.testGetOrderById();
49         //orderTest.testGetOrderByList();
50         orderTest.testGetOrderByMap();
51     }
52 }

测试结果如下:

执行orderTest.testGetOrderById()

执行orderTest.testGetOrderByList()

 执行orderTest.testGetOrderByMap()

五.总结

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

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

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

posted on 2017-08-27 20:43  芝麻_糊  阅读(1571)  评论(0编辑  收藏  举报