删除操作
在持久层接口(UserDao)中添加删除方法,如下:
/**
* 删除用户
* @param id
*/
void deleteUser(int id);
在UserDao接口的映射配置文件中添加如下内容:
<!--删除用户-->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{uid}
</delete>
注意: 该标签和insert
处于同一层级,当只有一个参数且为基本数据类型时,#{}
中的内容可以随便写(相当于一个占位符),如deleteUser
方法中的参数为id,这里可以写uid,iid等等都可以。
在测试类中添加如下测试方法,运行该测试方法即可看到效果:
/**
* 测试删除用户
*/
@Test
public void testDelete() {
userDao.deleteUser(50);
}
更新(修改)操作
在持久层接口(UserDao)中添加修改方法,如下:
/**
* 更新用户
* @param user
*/
void updateUser(User user);
在UserDao接口的映射配置文件中添加如下内容:
<!--更新用户-->
<update id="updateUser" parameterType="com.zfnotes.beans.User">
update user set username=#{username}, sex=#{sex}, address=#{address}, birthday=#{birthday} where id=#{id};
</update>
在测试类中添加如下测试方法,运行该测试方法即可看到效果:
/**
* 测试更新
*/
@Test
public void testUpdate() {
User user = new User();
user.setId(50);
user.setUsername("六六");
user.setAddress("河南省");
user.setSex("女");
user.setBirthday(new Date());
userDao.updateUser(user);
}
根据id(主键值)查询用户
在持久层接口(UserDao)中添加根据id(主键值)查询用户的方法,如下:
/**
* 根据id查询用户
* @param id
*/
User findById(int id);
在UserDao接口的映射配置文件中添加如下内容:
<!--根据id查询用户-->
<select id="findById" resultType="com.zfnotes.beans.User">
select * from user where id=#{id};
</select>
在测试类中添加如下测试方法,运行该测试方法即可看到效果:
/**
* 测试根据id查询User
*/
@Test
public void testFindById() {
User user = userDao.findById(41);
System.out.println(user);
}
模糊查询
模糊查询username
中包含王
字的用户信息
方式一
在持久层接口(UserDao)中添加模糊查询方法,如下:
/**
* 根据名称模糊查询
* @param username
* @return
*/
List<User> findByName(String username);
在UserDao接口的映射配置文件中添加如下内容:
<!--根据名称模糊查询-->
<select id="findByName" parameterType="string" resultType="com.zfnotes.beans.User">
select * from user where username like #{name};
</select>
在测试类中添加如下测试方法,运行该测试方法即可看到效果:
/**
* 测试根据名称模糊查询
*/
@Test
public void testFindByName() {
List<User> users = userDao.findByName("%王%");
for (User user: users){
System.out.println(user);
}
}
方式二
持久层接口(UserDao)中内容不变,将UserDao接口的映射配置文件中的内容修改成如下内容:
<!--根据名称模糊查询-->
<select id="findByName" parameterType="string" resultType="com.zfnotes.beans.User">
select * from USER where username like '%${value}%';
</select>
将测试类中的内容修改如下:
/**
* 测试根据名称模糊查询
*/
@Test
public void testFindByName() {
List<User> users = userDao.findByName("王");
for (User user: users){
System.out.println(user);
}
}
两种方式的区别(推荐使用第一种)
- 第一种使用PreparedStatement的参数占位符,
#{}
中的内容随意填写,只起占位作用。由于没有在sql语句中写%
,所以传参时要携带%
,当然也可以将sql语句该为select * from user where username like '%' #{name} '%'
,此时就不需要在传参时携带%
了。注意%
和#{}
要有空格,表示字符串拼接。 - 第二种方式是字符串拼接SQL语句,注意
${}
中的内容只能写value。这种方式可能会造成SQL注入。
使用聚合函数
在持久层接口(UserDao)中添加查询用户总数的方法,如下:
/**
* 查询总用户数
* @return
*/
int findTotal();
在UserDao接口的映射配置文件中添加如下内容:
<!--查询总用户数-->
<select id="findTotal" resultType="int">
select count(*) from USER;
</select>
在测试类中添加如下测试方法,运行该测试方法即可看到效果:
/**
* 测试查询总用户数
*/
@Test
public void testFindTotal() {
System.out.println("用户总数为: "+userDao.findTotal());
}
使用包装对象传递查询条件
新建MyQuery类,将User类型的对象引用作为其中一个属性,内容如下:
package com.zfnotes.beans;
public class MyQuery {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
在持久层接口(UserDao)中添加查询方法如下:
/**
* 根据MyQuery中的条件查询用户
* @param mq
* @return
*/
List<User> findUserByMq(MyQuery mq);
在UserDao接口的映射配置文件中添加如下内容,user.username
使用的是OGNL表达式:
<!--根据queryVo中的条件查询用户-->
<select id="findUserByMq" resultType="com.zfnotes.beans.User">
select * from USER where username=#{user.username};
</select>
在测试类中添加如下测试方法,运行该测试方法即可看到查询成功:
/**
* 测试使用MyQuery作为查询条件
*/
@Test
public void testFindByMq() {
MyQuery mq = new MyQuery();
User user = new User();
user.setUsername("王二");
mq.setUser(user);
List<User> users = userDao.findUserByMq(mq);
for (User u:users){
System.out.println(u);
}
}