标签:
假设我们有这么一个需求:用户信息的综合查询,需要传入的查询条件很复杂(可能包括用户信息,其他的信息,比如商品,订单)
我们的思想是:传入到select中的parameterType是一个包装类,里面可以有很多的东西。
我们已经有一个user.java po类了,但我们查询的条件可能是比user这个类更复杂的。我们为了方便扩展就要延伸出一个userCustom extend user 这么一个类。
案例如下:
先给出案例结构:
上面的案例说明如下:SqlMapConfig.xml是总的配置文件。mapper/userMapper.xml是这个案例的配置文件。User.java是针对数据库的实体类。UserCustom.java是User.java的实现类。UserQueryVo.java是包装类。userMapper.java是Mapper接口类。Mybatis_mappertest.java是测试代码。
第一步:
SqlMapConfig.xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- properties的配置必须写在typeAliases的上面 --> <properties resource="db.properties"></properties> <!-- 配置别名 --> <typeAliases> <!-- 针对别名定义 type:类型的路径 alias:别名 --> <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> </typeAliases> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <!-- 把映射文件(sqlmap/user.xml)加载进sqlMapConfig.xml--> <mappers> <!-- 把mapper.xml加载进sqlMapConfig.xml--> <!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致 且在一个目录中。 当着这个规范的前提是:使用mapper代理方法。 --> <mapper resource="mapper/userMapper.xml"/> </mappers> </configuration>
第二步:
<?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"> <!-- nanmespace:命名空间。 作用就是对sql进行分类话管理,理解Sal分离 注意:使用mapper代理方式,namespace有特殊重要的作用 --> <mapper namespace="cn.itcast.mybatis.mapper.userMapper"> <!-- 这里的id要和Mapp接口里面的函数名字一模一样。parameterType表示输入的类型, resultType表示输出的类型。
UserQueryVo里面有一个UserCustom, #{userCustom.sex} 里面写的是UserQueryVo里面的属性(userCustom)的属性(sex)
--> <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom"> SELECT * FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#{userCustom.username} </select> </mapper>
第三步:
User.java代码和UserCustom.java:
package cn.itcast.mybatis.po; import java.util.Date; public class User { private int id;//主键 private String username;//用户的名称 private Date birthday;//生日 private String sex;//性别 private String address;//地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
package cn.itcast.mybatis.po; public class UserCustom extends User { }
第四步:写UserQueryVo.java包装类
package cn.itcast.mybatis.po; public class UserQueryVo { //用户的查询条件 private UserCustom userCustom; public UserCustom getUserCustom() { return userCustom; } public void setUserCustom(UserCustom userCustom) { this.userCustom = userCustom; } }
第五步:userMapper.java是Mapper接口类
package cn.itcast.mybatis.mapper; import java.util.List; import cn.itcast.mybatis.po.User; import cn.itcast.mybatis.po.UserCustom; import cn.itcast.mybatis.po.UserQueryVo; public interface userMapper { //这个名字(findUserById)和UserMapper.xml里面的id要一模一样 //注意这里写的是返回的List.这样代码内部就会调用selectList,但是在userMapper.xml中要写的是 //resultType="cn.itcast.mybatis.po.User" /* * <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom"> SELECT * FROM USER WHERE user.sex= #{userCustom.sex} AND user.username=#{userCustom.username} </select> * * */ public List<UserCustom> findUserList(UserQueryVo userQueryVo); }
第六步:
编写Mybatis_mappertest.java测试代码。
package cn.itcast.mybatis.first; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; 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.Before; import org.junit.Test; import cn.itcast.mybatis.Dao.UserMapper; import cn.itcast.mybatis.mapper.userMapper; import cn.itcast.mybatis.po.User; import cn.itcast.mybatis.po.UserCustom; import cn.itcast.mybatis.po.UserQueryVo; public class Mybatis_mappertest { private SqlSessionFactory sqlSessionFactory; @Before public void setup() throws IOException { String resource="SqlMapConfig.xml"; InputStream inputStream= Resources.getResourceAsStream(resource); //主要是生成SqlsessionFactory。 this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } @Test public void testMaper() { SqlSession sqlSession=null; sqlSession=sqlSessionFactory.openSession(); //生成代理类 userMapper userMapper=sqlSession.getMapper(userMapper.class); //创建包装对象,设置查询条件 UserQueryVo userQueryVo=new UserQueryVo(); UserCustom userCustom=new UserCustom(); userCustom.setSex("1"); userCustom.setUsername("王"); //给包装类设置设置查询条件 userQueryVo.setUserCustom(userCustom); userMapper.findUserList(userQueryVo); } }
结果:运行正常。
14Mybatis_输入映射(传递pojo的包装对象)——很重要
标签:
原文地址:http://www.cnblogs.com/shenxiaoquan/p/5778146.html