现在我们解决一下属性名和字段名不一致的问题
实体类的属性如下:
1 public class User { 2 private int id; 3 private String name; 4 private String password; 5 }
接口:
1 public interface UserMapper { 2 3 //根据id查询用户 4 User getUserById(int id); 5 6 }
xml映射文件:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.qijian.dao.UserMapper"> 6 7 <select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User"> 8 select * from mybatis.user where id = #{id}; 9 </select> 10 11 </mapper>
测试类:
1 public class UserDaoTest { 2 @Test 3 public void testGetUserLike() throws IOException { 4 SqlSession sqlSession = MyBatisUtils.getSqlSession(); 5 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 6 User user = userMapper.getUserById(1); 7 8 System.out.println(user); 9 10 sqlSession.close(); 11 12 }
运行结果如下:
这里会发现password的值变成了null。下面我们来分析一下为什么会这样?
mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() , 所以password返回null ; 【自动映射】
解决办法一:
修改SQL语句:
1 <select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User"> 2 select id,name,pwd as password from mybatis.user where id = #{id}; 3 </select>
解决办法二:
resultMap
元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets
数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap
能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。(注意resultType和resultMap两者只能存在一个
)
1 <resultMap id="UserMap" type="com.qijian.pojo.User"> 2 <result column="pwd" property="password"/> 3 </resultMap> 4 <select id="getUserById" resultMap="UserMap"> 5 select * from mybatis.user where id = #{id} 6 </select>