Mybatis映射文件中数据库表列名称和POJO成员域的联系
下面是Mybatis的SQL映射文件。
<?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">
<select id="findbyname" resultType="user" parameterType="String">
SELECT * FROM user1 WHERE Login_name = #{name}
</select>
</mapper>
上面的代码表示查找出Login_name这一列等于输入的String参数的记录,并返回user类对象(pojo),可是mybatis又是如何将数据库表中的列准确的赋值给user的对象呢?
细节仍然隐藏在命名规范之中,如果数据库和列名和pojo中成员域名称相同(pojo类成员域属性建议均为小写,并且忽略数据库列名的大小写),那么返回的user类中相应属性将会被赋值数据库中的值,否则等于默认值。如下图所示。【下面password指错了,大家理解就好😂,我暂时先不修改】
如果由于种种原因,pojo成员域名称和数据库中无法保持一致呢?这是就需要xml中ResultMap的帮助了,它可以自定义的将数据库的某列和Pojo中某个成员与绑定到一起,从而替代ResultType,显然这是非常必要的!
<!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo --> <!-- id:设置ResultMap的id --> <resultMap type="com.dao.model.user" id="Usermap"> <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --> <!-- property:主键在pojo中的属性名 --> <!-- column:主键在数据库中的列名 --> <!如果pojo中没有对应任何主键的属性,则省略这部分--> <!id property="id" column="id" />
<!-- 定义普通属性 --> <result property="username" column="Login_name" /> <result property="password" column="Password" /> <result property="nsex" column="Sex" /> </resultMap>
<select id="findbyname" resultMap="Usermap" parameterType="String">
SELECT * FROM user1 WHERE Login_name = #{name}
</select>
OK,大功告成。
可能还有小伙伴质疑之前没有使用ResultMap也成功的在login.jsp成功打印出了用户名和密码啊,pojo中的username和数据库中的Login_name名称也不相同啊?这是怎么回事?其实这里是误会了,LoginController.java中只是将@ModelAttribute映射的pojo放入到了Session中,就相当于是从你的输入获得的字符串,只不过经判断后才将其打印出来,所以这个过程和数据库一毛钱的关系没有。至于和数据库有关的是判断这些字符串是否与数据库中的相符,但是代码中我们只判断返回的对象是否为null以及密码是否相符,并未判断用户名是否相符,因此名称不一样事实上对结果并没有影响。当然虽然是流程逻辑上并没有问题,但毕竟不符合代码规范,还是建议各位将数据库的列名称与类的成员属性名称一致,或者使用ResultMap将两者建立起映射绑定,以避免不必要的麻烦。