parameterType 配置参数
使用说明
使用SQL 语句传参,使用标签的 parameterType 属性来设定。该属性的取值可以
是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,本章节将介绍如何使用实体类的包装类作为参数传递。
注意事项
基 本 类 型 和 String 我 们 可 以 直 接 写 类 型 名 称 , 也 可 以 使 用 包 名 . 类 名 的 方 式 ,例 如 :java.lang.String。实体类类型,目前我们只能使用全限定类名。
究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。在今天课程的最后一个章节中将讲解如何注册实体类的别名。
传递 pojo 包装对象(使用QueryVo作为查询条件)
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
Pojo 类中包含 pojo。
需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。
编写 QueryVo
package com.keafmd.domain; /** * Keafmd * * @ClassName: QueryVo * @Description: * @author: 牛哄哄的柯南 * @date: 2021-02-08 21:08 */ public class QueryVo { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
编写持久层接口
IUserDao:
package com.keafmd.dao; import com.keafmd.domain.QueryVo; import com.keafmd.domain.User; import org.apache.ibatis.annotations.Select; import java.util.List; /** * Keafmd * * @ClassName: IUserDao * @Description: 用户的持久层接口 * @author: 牛哄哄的柯南 * @date: 2021-02-06 19:29 */ public interface IUserDao { /** * 根据QueryVo中的条件查询用户 * @param vo * @return */ List<User> findUserByVo(QueryVo vo); }
持久层接口的映射文件
IUserDao.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"> <mapper namespace="com.keafmd.dao.IUserDao"> <!--根据QueryVo的条件查询用户--> <select id="findUserByVo" parameterType="com.keafmd.domain.QueryVo" resultType="com.keafmd.domain.User"> select * from user where username like #{user.username} </select> </mapper>
测试包装类作为参数
MybatisTest:
package com.keafmd.test; import com.keafmd.dao.IUserDao; import com.keafmd.domain.QueryVo; import com.keafmd.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; /** * Keafmd * * @ClassName: MybatisTest * @Description: 测试类,测试crud操作 * @author: 牛哄哄的柯南 * @date: 2021-02-08 15:24 */ public class MybatisTest { private InputStream in; private SqlSession sqlsession; private IUserDao userDao; @Before // 用于在测试方法执行前执行 public void init()throws Exception{ //1.读取配置文件,生成字节输入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.使用工厂生产SqlSession对象 sqlsession = factory.openSession(); //4.使用SqlSession创建Dao接口的代理对象 userDao = sqlsession.getMapper(IUserDao.class); } @After // 用于在测试方法执行后执行 public void destory() throws Exception{ //提交事务 sqlsession.commit(); //6.释放资源 sqlsession.close(); in.close(); } /** * 测试使用QueryVo作为查询条件 * @throws Exception */ @Test public void testFindUserByVo() throws Exception { QueryVo vo = new QueryVo(); User user = new User(); user.setUsername("%王%"); vo.setUser(user); //5.执行使用QueryVo作为查询条件 List<User> users = userDao.findUserByVo(vo); for (User u : users) { System.out.println(u); } } }
输出结果:
以上就是Mybatis的参数深入的全部内容。