一、parameterType(输入类型)
1.1 传递简单类型
<!-- 根据用户id查询用户 --> <select id="queryUserById" parameterType="int" resultType="cn.itcast.mybatis.pojo.User"> SELECT * FROM `user` WHERE id = #{id} </select> <!-- 根据用户名模糊查询用户 --> <select id="queryUserByUsername" parameterType="string" resultType="cn.itcast.mybatis.pojo.User"> SELECT * FROM `user` WHERE username LIKE ‘%${value}%‘ </select>
使用#{}占位符,或者${}进行sql拼接
1.2 传递pojo对象
<!-- 保存用户 --> <insert id="saveUser" parameterType="cn.itcast.mybatis.pojo.User"> INSERT INTO `user`(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address}); </insert>
Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。
1.3 传递pojo包装对象
包装对象:Pojo类中的一个属性是另外一个pojo。
需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中。
1.3.1 编写QueryVo
public class QueryVo { // 包含其他的pojo private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
1.3.2 Mapper.xml文件
在UserMapper.xml中配置sql:
<!-- 使用包装类型查询用户 --> <select id="queryUserByQueryVo" parameterType="queryVo" resultType="user"> SELECT * FROM `user` WHERE username LIKE ‘%${user.username}%‘ </select>
1.3.3 Mapper接口
在UserMapper接口中添加方法:
/** * 根据包装类型查询用户 * @param queryVo * @return */ List<User> queryUserByQueryVo(QueryVo queryVo);
1.3.4 测试方法
@Test public void testQueryUserByQueryVo() throws Exception { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper执行查询,使用包装对象 QueryVo queryVo = new QueryVo(); // 设置user条件 User user = new User(); user.setUsername("张"); // 设置到包装对象中 queryVo.setUser(user); // 执行查询 List<User> list = userMapper.queryUserByQueryVo(queryVo); for (User user2 : list) { System.out.println(user2); } // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
二、resultType(输出类型)
2.1 输出简单类型
需求:查询用户表数据条数
sql:SELECT count(*) FROM `user`
2.1.1 Mapper.xml文件
在UserMapper.xml中配置sql:
<!-- 查询用户数据条数 --> <select id="queryUserCount" resultType="int"> SELECT COUNT(*) FROM `user` </select>
2.1.2 Mapper接口
在UserMapper添加方法:
/** * 查询用户数据条数 * @return */ int queryUserCount();
2.1.3 测试方法
@Test public void testQueryUserCount() throws Exception { // mybatis和spring整合,整合之后,交给spring管理 SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建Mapper接口的动态代理对象,整合之后,交给spring管理 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 使用userMapper执行查询用户数据条数 int count = userMapper.queryUserCount(); System.out.println(count); // mybatis和spring整合,整合之后,交给spring管理 sqlSession.close(); }
2.2 输出pojo对象
<select id="queryUserById" parameterType="int" resultType="cn.itcast.mybatis.pojo.User"> SELECT * FROM `user` WHERE id = #{id} </select>
2.3 输出pojo列表
<!-- 根据用户名模糊查询用户 --> <select id="queryUserByUsername" parameterType="string" resultType="cn.itcast.mybatis.pojo.User"> SELECT * FROM `user` WHERE username LIKE ‘%${value}%‘ </select>
三、resultMap
resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
需求:查询订单表order的所有数据
sql:SELECT id, user_id, number, createtime, note FROM `order`
3.1 声明pojo对象
数据库表如下图:
Order对象:
public class Order { // 订单id private int id; // 用户id private Integer userId; // 订单号 private String number; // 订单创建时间 private Date createtime; // 备注 private String note; get/set。。。 }
3.2 Mapper.xml文件
创建OrderMapper.xml配置文件,如下:
<?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:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 --> <mapper namespace="cn.itcast.mybatis.mapper.OrderMapper"> <!-- 查询所有的订单数据 --> <select id="queryOrderAll" resultType="order"> SELECT id,user_id,number,createtime,note FROM `order` </select> </mapper>
3.3 Mapper接口
public interface OrderMapper { /** * 查询所有订单 * @return */ List<Order> queryOrderAll(); }
3.4 测试方法
public class OrderMapperTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws Exception{ SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); } @Test public void testQueryOrderAll() throws Exception { // 获取sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取OrderMapper OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); // 执行查询 List<Order> list = orderMapper.queryOrderAll(); for (Order order : list) { System.out.println(order); } sqlSession.close(); } }
3.5 测试效果
发现userId为null
解决方案:使用resultMap
3.6 使用resultMap
由于上边的mapper.xml中sql查询列(user_id)和Order类属性(userId)不一致,所以查询结果不能映射到pojo中。
需要定义resultMap,把orderResultMap将sql查询列(user_id)和Order类属性(userId)对应起来。
改造OrderMapper.xml,如下:
<?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:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 --> <mapper namespace="cn.itcast.mybatis.mapper.OrderMapper"> <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo --> <!-- id:设置ResultMap的id --> <resultMap type="order" id="orderResultMap"> <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id --> <!-- property:主键在pojo中的属性名 --> <!-- column:主键在数据库中的列名 --> <id property="id" column="id" /> <!-- 定义普通属性 --> <result property="userId" column="user_id" /> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> </resultMap> <!-- 查询所有的订单数据 --> <select id="queryOrderAll" resultMap="orderResultMap"> SELECT id,user_id,number,createtime,note FROM `order` </select> </mapper>
3.7 测试效果