JavaWeb框架学习文章索引点这里
输入映射:
例1,从数据库user(id,name,age,tel)中查询出年龄大于20并且名字里面有张三的数据。
表情况和数据如下:
由于我们这里进行的是一个综合查询,建议使用包装的pojo(简单的javabean),所以我们为User类创建包装类UserCustom,该类直接继承User类。然后创建一个UserQueryVo类,添加UserCustom属性。
在UserMapper.java中编写查询:
public interface UserMapper {
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
}
返回值类型是List类型,参数类型为上面定义的UserQueryVo。
编写UserMapper.xml中编写:
<select id="findUserList" parameterType="com.hhh.dao.UserQueryVo" resultType="com.hhh.dao.UserCustom">
select * from user where age > #{userCustom.age} and name like '%${userCustom.name}%'
</select>
由于我们传入的参数类型为UserQueryVo,所以这里可以直接使用它的属性userCustom.age的方式来表示这里查询的占位符
而返回参数为UserQueryVo,需要注意的是,这里不管返回的数据是单项的还是多项的都需要使用com.hhh.dao.UserCustom作为返回类型,由于我们方法定义的时候
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
返回类型是list,所以实际调用的时候会返回一个list。如果是单项查询需要返回pojo类型的时候,应定义方法为
public UserCustom findUser(UserQueryVo userQueryVo) throws Exception;
测试类:
@Test
public void test3() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//由于创建的是源码包,所以可以直接读
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//设置传入参数条件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setName("张三");
userCustom.setAge(20);
userQueryVo.setUserCustom(userCustom);
//调用方法返回查询结果
List<UserCustom> list = mapper.findUserList(userQueryVo);
System.out.println("list:"+list.toString());
sqlSession.close();
}
输出结果:
输出映射:
例2,输出例1中满足条件的查询结果总数个数。
编写方法:
public int findUserCount(UserQueryVo userQueryVo) throws Exception;
编写xml:
<select id="findUserCount" parameterType="com.hhh.dao.UserQueryVo" resultType="int">
select count(*) from user where age > #{userCustom.age} and name like '%${userCustom.name}%'
</select>
测试方法:
@Test
public void test4() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//由于创建的是源码包,所以可以直接读
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
//设置参入参数条件
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setName("张三");
userCustom.setAge(20);
userQueryVo.setUserCustom(userCustom);
//调用方法返回查询结果
int count = mapper.findUserCount(userQueryVo);
System.out.println("count:"+count);
sqlSession.close();
}
结果:
以上查询结果是简单类型int。有时候查询结果可能是pojo,pojo列表,生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList ,也就是例1中也提到过的。
例3,查询出来的列名和pojo属性名不一致的时候,可以使用resultMap
注意:
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象,不一致的属性的值为null。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系
编写xml
<!-- type是resultMap的最终返回类型,id是对resultMap的标识 -->
<resultMap type="com.hhh.dao.User" id="userResultMap">
<!-- id是查询结果集中的唯一标识,id1是查询出来的列名,id是属性名 -->
<id column="id1" property="id"/>
<!-- result是查询结果集中的不唯一标识, -->
<result column="name1" property="name"/>
</resultMap>
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
select id id1,name name1 from user where id = #{id}
</select>
编写方法
public User findUserByIdResultMap(int id) throws Exception;
测试类:
@Test
public void test5() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//由于创建的是源码包,所以可以直接读
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserByIdResultMap(3);
System.out.println(user.toString());
sqlSession.close();
}
结果:
s