1.表的设计:
2.实体类
public class User {
private int id;
private String name;
private String password;
}
3.Mapper映射文件
<?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">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="org.dao.UserDao">
<!--查询语句-->
<select id="getUserById" resultType="org.pojo.User">
select * from mybatis.user where id = #{id}
</select>
</mapper>
4.测试类
public class UserDaoTest {
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession =null;
try {
//第二步:执行SQL
sqlSession = MybatisUtils.getSqlSession();
UserDao userMapper = sqlSession.getMapper(UserDao.class);
User user = userMapper.getUserById(1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} catch (Error error){
error.printStackTrace();
} finally {
//第三步:关闭sqlSession
sqlSession.close();
}
}
}
5.结果
6.问题分析:password没有获取到?
sql语句:select * from user where id = #{id}
可以看做sql select id,name,pwd from user where id = #{id}
,mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPassword() , 所以password返回null ; 【自动映射】
7.解决方案
7.1.取别名
<select id="getUserById" resultType="org.pojo.User">
select userId,userName,pwd as password where id = #{id}
</select>
7.2.使用结果集映射->ResultMap
//结果集映射
<resultMap id = "UserMap" type = "User">
//column是数据库中的字段,property是实体类中的属性
<result column = "id" property = "id"/> //可以省略
<result column = "name" property = "name"/> //可以省略
<result column = "pwd" property = "password"/>
</resultMap>
<select id = "getUserById" resultMap="UserMap">
select * from user where id = #{id}
</select>
- resultMap 元素是 MyBatis 中最重要最强大的元素
- ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
- ResultMap 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们
当然了,如果世界真的有那么简单就好了
To be continue…