接上篇 前面操作相同 数据库相同
一、模糊查询 示例 通过用户名查询用户
1、接口中添加相应的抽象方法
/*
* 模糊查询 查询结果封装成List
* */
List
2、在映射文件中进行相应的配置
3、添加测试类
@Test
public void testFindByName(){
IUserDao userDao = session.getMapper(IUserDao.class);
//因为配置映射文件是没有指明模糊查询的标志 所以在测试类中要进行说明 添加%的标志
List
//List
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
List
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
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
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='天津'}