一. 问题引入
在之前的项目中,我们的实体类的属性名和数据库的字段名都按照相应的规范对应,比如Book类的bookId,在数据库中对应的字段名便是book_id。但是如果我们的实体类与数据库的字段名没有按照相应的规范一一对应,便无法查到指定的数据。举个例子,我们将Book实体类修改为:
package io.zhangjia.entity; public class Book { private Integer bid; private String bookName; private String bookAuthor; private Double bookPrice; public Book() { } public Book(String bookName, String bookAuthor, Double bookPrice) { ...... } public Book(Integer bid, String bookName, String bookAuthor, Double bookPrice) { ...... } //get And set ..... @Override public String toString() { ...... } }
而此时的数据库字段名为分别为:book_id , name, author,price,也就是说,我们的实体类,与数据库的字段名没有一个是一一对应的,我们试一下在这种情况下,是否能查到指定的数据:
首先编写指定接口:
public interface BookMapper { Book queryById(Integer bookId); }
接下来配置mybatis-config.xml,配置内容可以参照一《Mybatis:增删改查》一文中的第四节。
最后编写对应的BookMapper.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"> <mapper namespace="io.zhangjia.mapper.BookMapper"> <select id="queryById" parameterType="int" resultType="book" > SELECT * FROM book WHERE BOOK_ID = #{bookId} #这里其实写bookId或者bid都可以,不影响结果 </select> </mapper>
最后编写测试类:
package io.zhangjia.util; import io.zhangjia.entity.Book; import io.zhangjia.mapper.BookMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(true); BookMapper mapper = sqlSession.getMapper(BookMapper.class); Book book = mapper.queryById(39); System.out.println("book = " + book); sqlSession.close(); inputStream.close(); } } 输出: ... DEBUG [main] - ==> Preparing: SELECT * FROM book WHERE BOOK_ID = ? DEBUG [main] - ==> Parameters: 39(Integer) DEBUG [main] - <== Total: 1 book = null ...
可以看到,虽然total是1,但是book为null,也就是说并没有查到。由此可以证明我们之前的观点。
二. 解决方案
为了解决上面的问题,我们除了遵守指定的命名规范外,还可以通过为数据库字段设置别名的方法,解决这个问题,将BookMapper.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"> <mapper namespace="io.zhangjia.mapper.BookMapper"> <select id="queryById" parameterType="int" resultType="book" > SELECT book_id bid, name book_name, author book_author, price book_price FROM book WHERE BOOK_ID = #{bookId} #这里其实写bookId或者bid都可以,不影响结果 </select> </mapper>
此时便可以正确的查到数据了,除了上面的方法外,Mybatis也为我们提供了解决方案,我们通过resultMap元素来解决。
在resultMap 中,我们可以设置id和result标签,id用来映射唯一字段,一般为数据表的id。result用于映射其他字段。
id和result的column的值为数据库的列名,property的值为实体类的属性名,两者一一对应。编写好resultMap后,我们便可以将select元素中的resultType更改为resultMap,其值便是resultMap的id。
<?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"> <mapper namespace="io.zhangjia.mapper.BookMapper"> <resultMap id="bookResultMap" type="book"> <id column="book_id" property="bid" /> <result column="name" property="bookName" /> <result column="author" property="bookAuthor" /> <result column="price" property="bookPrice" /> </resultMap> <select id="queryById" parameterType="int" resultMap="bookResultMap" > SELECT * FROM book WHERE BOOK_ID = #{bookId} #这里其实写bookId或者bid都可以,不影响结果 </select> </mapper>
此时便可以正确的查到数据了。
请登录之后再进行评论