mybatis实现MySQL数据库的增删改查之三

现在我们解决一下属性名和字段名不一致的问题

实体类的属性如下:

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>

 

posted @ 2020-12-30 20:39  柒间  阅读(78)  评论(0编辑  收藏  举报