项目结构
parameterType参数概述
使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装 类.
注意事项
基本类型和 String 我们可以直接写类型名称,也可以使用包名.类名的方式,例如: java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是 mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名, 而我们的是实体类并没有注册别名,所以必须写全限定类名。
以下这些都是支持的默认别名。
源码
TypeAliasRegistery.class 的源码。
Mybatis使用ognl表达式解析对象字段的值, #{}或者${}括号中的值为pojo属性名称.
OGNL表达式:
Object Graphic Navigation Language
对象 图 导航 语言
它是通过对象的取值方法来获取数据. 在写法上把get给省略了.
比如: 我们获取用户的名称
类中的写法: user.getUsername();
OGNL表达式写法: user.username
Mybatis中为什么直接写username, 而不是用user.呢:
因为在parameterType中已经提供了属性所属的类, 所以此时不需要写对象名
传递 pojo 包装对象
-
概述与需求
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查 询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。 Pojo 类中包含 pojo。 需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 user 属性中。 注意: Pojo类 就是 JavaBean类
-
持久层接口方法
/** * 根据QueryVo中的条件查询用户 * @param vo * @return */ public List<User> findByVo(QueryVo vo);
-
实体类User
package com.xiaoge.domain; import java.util.Date; /** * @Author: 潇哥 * @DateTime: 2020/3/4 下午4:03 * @Description: TODO */ public class User { private Integer id; private String username; private String address; private String sex; private Date birthday; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", address='" + address + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + '}'; } }
-
实体类QueryVo
package com.xiaoge.domain; /** * @Author: 潇哥 * @DateTime: 2020/3/6 下午3:49 * @Description: TODO */ public class QueryVo { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
配置文件
-
UserDao.xml
<!--根据queryVo的条件查询用户--> <select id="findByVo" resultType="com.xiaoge.domain.User" parameterType="com.xiaoge.domain.QueryVo"> select * from user where username like #{user.username} </select>
测试方法
-
MybatisTest
package com.xiaoge.test; import com.xiaoge.dao.UserDao; import com.xiaoge.domain.QueryVo; import com.xiaoge.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; /** * @Author: 潇哥 * @DateTime: 2020/3/4 下午4:22 * @Description: 测试mybatis的crud操作 */ public class MybatisTest { private InputStream is; private SqlSession session; private UserDao userDao; /** * 初始化 获取代理对象 */ @Before // 用于在测试方法之前执行 public void init() throws IOException { // 1. 加载配置文件 is = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2. 获取SqlSessionFactory SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(is); // 3. 获取SqlSession对象 session = factory.openSession(); // 4. 获取代理对象 userDao = session.getMapper(UserDao.class); } @After // 用与在测试方法之后执行 public void destroy() throws IOException { // 1. 提交事务(提交事务以后才会映射进数据库, 不提交的话, 它会自动回滚) session.commit(); // 2. 释放资源 if (session != null) { session.close(); } if (is != null) { is.close(); } } /** * 测试使用QueryVo作为查询条件 */ @Test public void findByVoTest() { // 创建对象 User user = new User(); QueryVo vo = new QueryVo(); // 给user的username赋值 user.setUsername("%王%"); // 把user度夏宁封装进QueryVo中 vo.setUser(user); // 调用方法 List<User> users = userDao.findByVo(vo); for (User u : users) { System.out.println(u); } // 运行结果 User{id=41, username='老王', address='北京', sex='男', birthday=Wed Feb 28 07:47:08 CST 2018} User{id=42, username='小二王', address='北京金燕龙', sex='女', birthday=Sat Mar 03 05:09:37 CST 2018} User{id=43, username='小二王', address='北京金燕龙', sex='女', birthday=Mon Mar 05 01:34:34 CST 2018} User{id=46, username='老王', address='北京', sex='男', birthday=Thu Mar 08 07:37:26 CST 2018} User{id=55, username='王五 last insertid', address='北京', sex='男', birthday=Fri Mar 06 15:17:43 CST 2020} } }