user数据库描述:
定义User类
public class User{
//属性名和数据库表的字段对应
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
//........set,get方法省略
}
1.resultType
查询结果不止一行一列时,需要使用自定义包装类来接受结果,例如查询id=1的用户信息,此时使用User类来接受结果。
1)在map.xml中编写SQL映射文件
<select
id="findUserById" parameterType="int" resultType="user">
SELECT id,username,sex,birthday,address FROM USER WHERE id=#{value}
</select>
其中:
id:标识映射文件的sql
parameterType:制定输入参数的类型,这里是int类型
#{}是占位符
resultType:指定的sql输出结果所映射的java类型
2)在SqlMapConfig.xml配置文件中加载映射文件
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
<!-- 批量加载mapper
指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
上边规范的前提是:使用的是mapper代理方法
-->
<package name="cn.itcast.mybatis.mapper"/>
</mappers>
注:这类可以单独加载,也可以批量加载。
3)对应的Mapp接口——Map.java
public interface UserMapper {
//根据id查询用户信息
public User findUserById(int id) throws Exception;
}
4)编写测试代码
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user = userMapper.findUserById(1);
System.out.println(user);
}
结果输出:
User [id=1, username=王五, sex=2, birthday=null, address=null]
注意:
1)上面输出的是一条数据,当以性别为条件时,查询出来的是多条数据,但是resultType依然配置了User类,但是在Mapper.java中,findUserById方法返回的是List<User>
<select id="findUserById" parameterType="int" resultType="user">
SELECT id,username,sex,birthday,address FROM USER WHERE id=#{value}
</select>
//根据用户名列查询用户列表
public List<User> findUserByName(String name)throws Exception;
2)如果从数据库查询出来的列名和包装类的属性名不一致,此时不会创建包装类对象,例如:
<select id="findUserById" parameterType="int" resultType="user">
SELECT id _id,username _username,sex _sex,birthday _birthday,address _address FROM USER WHERE id=#{value}
</select>
这时候可以使用resultMap。
2.resultMap
1)Map.xml映射文件中定义resultMap
<!-- 定义resultMap
将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识
-->
<resultMap type="user" id="userResultMap">
<!-- id表示查询结果集中唯一标识
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系 (对应关系)
-->
<id column="id_" property="id"/>
<!--
result:对普通名映射定义
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系 (对应关系)
-->
<result column="username_" property="username"/>
</resultMap>
2)Map.xml映射文件中编写SQL映射
<!-- 使用resultMap进行输出映射
resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>
3)SqlMapConfig配置文件中加载映射文件
<!-- 加载 映射文件 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
<!-- 批量加载mapper
指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
上边规范的前提是:使用的是mapper代理方法
-->
<package name="cn.itcast.mybatis.mapper"/>
</mappers>
3)Map.java接口中编写方法
public interface UserMapper {
//根据id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id) throws Exception;
}
4)编写测试代码
@Test
public void testFindUserByIdResultMap() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用userMapper的方法
User user = userMapper.findUserByIdResultMap(1);
System.out.println(user);
}
注:一般来说,数据库的结果集中的列名与Java实体类中属性的名称是不同的,所以需要resultMap来对列名进行转换才能映射到Java实体类。