模糊查询聚合函数以及查询条件对象的使用

二次信任 提交于 2019-12-05 20:23:47

接上篇 前面操作相同 数据库相同
一、模糊查询 示例 通过用户名查询用户
1、接口中添加相应的抽象方法
/
模糊查询 查询结果封装成List
* */
List findByName(String username);
2、在映射文件中进行相应的配置

3、添加测试类
@Test
public void testFindByName(){
IUserDao userDao = session.getMapper(IUserDao.class);
//因为配置映射文件是没有指明模糊查询的标志 所以在测试类中要进行说明 添加%的标志
List users = userDao.findByName("%王%");
//List users = userDao.findByName("王");
for(User user:users){
System.out.println(user);
}
}
测试结果:
User{id=41, username='老王', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018, address='北京'}
User{id=43, username='小王', sex='女', birthday=Sun Mar 04 11:34:34 CST 2018, address='深圳'}
User{id=45, username='二王', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018, address='南京'}
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'}

注意:这里还可以有第二种配置映射文件的方式

配置了映射文件之后 我们进行测试类的书写
@Test
public void testFindByName(){
IUserDao userDao = session.getMapper(IUserDao.class);
//List users = userDao.findByName("%王%");
List users = userDao.findByName("王");
for(User user:users){
System.out.println(user);
}
}
注意:这里因为在配置映射文件的时候已经指明了模糊查询的标志 所以在这里我们不需要对其再次进行说明
测试结果:
User{id=41, username='老王', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018, address='北京'}
User{id=43, username='小王', sex='女', birthday=Sun Mar 04 11:34:34 CST 2018, address='深圳'}
User{id=45, username='二王', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018, address='南京'}
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'}

那么这两种配置方式有什么不同呢???
看控制台打印的信息:两种方式的sql语句是不一样的
(第一种)Preparing: SELECT * from user WHERE username like ?
(第二种)Preparing: SELECT * from user where username like '%王%'
这就要说明${}和#{}的区别了
(1)#{}可以实现preparedstatement向占位符中设置值 自动进行jdbc类型和java类型之间的转换 有效防止sql注入 如果parameterType传输单个简单类型 {}中可以是任意值
(2)${}传入的内容拼接在sql中且不进行jdbc类型的转换 如果parameterType传输单个简单类型{}中只能是value

二、使用聚合函数 示例:查询总记录数
1、在接口类中添加方法
/
计算总记录数
* */
public int findTotal();
2、在映射文件中进行相应的配置

3、添加相应的测试类
@Test
public void testFindTotal(){
IUserDao userDao = session.getMapper(IUserDao.class);
int count = userDao.findTotal();
System.out.println(count);
}
输出结果:8

三、查询条件对象
为什么需要查询条件对象?现实中可能查询的条件并不单一 并不仅仅是通过用户ID 用户的姓名来进行查询 可能需要用户的其他信息作为查询条件 这时候我们的查询条件就是综合性的查询条件 可以使用传递包装类的形式来传递参数
1、首先我们需要创建一个查询条件对象 假设我们这里根据用户名查询信息 但是我们将查询条件放到QueryVo的user属性中
public class QueryVo {
private User user;
private List ids;

public List<Integer> getIds() {
    return ids;
}

public void setIds(List<Integer> ids) {
    this.ids = ids;
}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

}

2、在持久层中添加相应的方法
/

* */
List findUserByVo(QueryVo vo);
3、书写相应的映射配置文件

4、书写相应的测试类
@Test
public void testFindByVo(){
IUserDao userDao = session.getMapper(IUserDao.class);
User user = new User();
QueryVo vo = new QueryVo();
user.setUsername("小二王");

    vo.setUser(user);
    List<User> users = userDao.findUserByVo(vo);
    System.out.println(users);
    for(User u:users){
        System.out.println(u);
    }
}

测试结果:
User{id=41, username='老王', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018, address='北京'}
User{id=43, username='小王', sex='女', birthday=Sun Mar 04 11:34:34 CST 2018, address='深圳'}
User{id=45, username='二王', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018, address='南京'}
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!