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提供的解决方式来解决字段名和属性名的映射关系的。