Mybatis学习笔记来自B站狂神说Java Mybatis系列视频~
视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx
纯个人手打,可能会有错误,欢迎指正交流探讨~
个人邮箱:[email protected]
4、ResultMap结果集映射
要解决的问题:属性名和字段名不一致
环境:新建一个项目,将之前的项目拷贝过来
1. 查询为null的问题
-
查看之前的数据库字段名
id,username,pwd
- java实体类设计
public class User { private Integer id; private String username; private String password;//如果与数据库对应的话,应该是pwd,这里改为password
- 接口
- mapper映射文件
<!--根据id查询用户--> <select id="getUserbyid" parameterType="int" resultType="com.gang.pojo.User"> select * from mybatis.user where id=#{id}; </select>
- 测试
@Test public void test2(){ SqlSession sqlSession=MybatisUtils.getSqlSession(); UserDao userDao=sqlSession.getMapper(UserDao.class); User user=userDao.getUserbyid(1); System.out.println(user); sqlSession.close(); }
- 结果:
- User{id=1, username=‘zhangsan’, pwd=‘null’}
- 查询结果password为空,说明出现了问题。
- 分析:
-
select * from user where id = #{id} 可以看做
select id,name,pwd from user where id = #{id}
- 而mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() , 所以password返回null ; 【自动映射】
-
2. 解决方案
- 方案一:在sql语句中为列名指定别名,别名和实体类的属性名一致
<!--根据id查询用户-->
<select id="getUserbyid" parameterType="int" resultType="com.gang.pojo.User">
select id,name,pwd as password from mybatis.user where id=#{id};
</select>
- 方案二:使用结果集映射–> ResultMap [推荐]
<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
<!-- 在这里通过一个resultMap="UserMap" 结果集映射实现>
select id , name , pwd from user where id = #{id}
</select>
3. ResultMap
自动映射
-
元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBCresultMap
数据提取代码中解放出来。ResultSets
- 实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份
能够代替实现同等功能的长达数千行的代码。resultMap
-
ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
你已经见过简单映射语句的示例了,但并没有显式指定
。比如:resultMap
<select id="selectUserById" resultType="map">
select id , name , pwd
from user
where id = #{id}
</select>
上述语句只是简单地将所有的列映射到
HashMap
的键上,这由
resultType
属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为模型。
ResultMap
最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。
手动映射
- 返回值类型为ResultMap
<select id="selectUserById" resultMap="UserMap"> select id , name , pwd from user where id = #{id} </select>
- 编写resultMap 实现手动映射
<resultMap id="UserMap" type="User"> <!-- id为主键 --> <id column="id" property="id"/> <!-- column是数据库表的列名 , property是对应实体类的属性名 --> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultMap>