3 CRUD详解
CRUD详解
UserMapper.xml
<?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">
<mapper namespace="com.zzb.dao.UserMapper">
<select id="getUserList" resultType="com.zzb.pojo.User">
select * from user
</select>
<select id="getUserListByLike" parameterType="String" resultType="com.zzb.pojo.User">
select * from user where name like #{value}
</select>
<select id="getUserById" parameterType="int" resultType="com.zzb.pojo.User">
select * from user where id = #{id}
</select>
<select id="getUserById2" parameterType="map" resultType="com.zzb.pojo.User">
select * from user where id = #{keyId}
</select>
<!--对象的属性可以直接取出来-->
<insert id="addUser" parameterType="com.zzb.pojo.User">
insert into user (id, name, pwd) values ( #{id}, #{name}, #{pwd});
</insert>
<update id="updateUser" parameterType="com.zzb.pojo.User">
update user set name = #{name}, pwd = #{pwd} where id = #{id};
</update>
namespace
配置文件中的namespace中的名称为对应的Mapper接口的完整包名,必须一致!
select
- select标签是mybatis中最常用的标签之一
- select语句中有很多属性
- parameterType:传入SQL语句的参数类型,如果是基本类型可以省略,也可以通过Map进行参数传递
- resultType:SQL语句的返回值类型,如果是基本类型可以省略,其他对象必须为完整的类名(含包名)或者别名
- 接口中的方法名与XML映射文件中的SQL语句ID要一一对应
- resultMap:为返回结果集映射,即实体类中的属性与数据库表中的表头名称无法一一对应时,需要进行结果集的映射,才能保证成功完整的取出数据。
根据id查询用户
1、在UserMapper接口中添加相应的方法
// 根据Id查询用户
User getUserById(int userId);
2、在UserMapper.xml中添加select语句
<select id="getUserById" resultType="com.bg.pojo.User">
SELECT * FROM user WHERE id = #{userId}
</select>
参数类型传递方法
-
直接传递参数,可以按照上述代码传递参数,也可以在接口方法的参数前添加@Param属性,显示的指定参数名。
import org.apache.ibatis.annotations.Param; // 根据Id查询用户 User getUserById(@Param("id") int userId);那么在XML配置文件中,就要做相应的修改(userId —> id)
<select id="getUserById" resultType="com.bg.pojo.User"> SELECT * FROM user WHERE id = #{id} </select> -
使用万能的Map传递参数,将需要传递的参数封装程Map,将接口修改为如下所示。
import java.util.Map; // 根据Id查询用户 User getUserById(Map<String, Object> map);XML配置文件无需修改,也可以显示的指明传入参数类型为map
<select id="getUserById" parameterType="map" resultType="com.bg.pojo.User"> SELECT * FROM user WHERE id = #{id} </select>测试时,需要将传入参数设置为Map类型:
@Test public void getUserById(){ // 首先获得SqlSession对象 SqlSession sqlSession = MyBatisTool.getSqlSession(); // 通过SqlSession对象获取Mapper接口对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // map封装参数 Map<String, Object> map = new HashMap<String, Object>(); map.put("id", 3); // 调用mapper中的函数,执行sql User user = mapper.getUserById(map); // 遍历结果,并输出 System.out.println(user.toString()); // 使用完毕后,关闭SqlSession对象 sqlSession.close(); }
insert
给数据库增加一个用户
1、在UserMapper接口中添加对应的方法
// 增加一个用户
int addUser(User user);
2、在UserMapper.xml中添加insert语句
<!--返回类型为基本类型,可以省略-->
<insert id="addUser" parameterType="com.bg.pojo.User">
INSERT INTO user(id, name, pwd) VALUES (#{id}, #{name}, #{pwd})
</insert>
注意:参数直接去User对象中对应的属性即可。
3、测试
@Test
public void addUser(){
// 首先获得SqlSession对象
SqlSession sqlSession = MyBatisTool.getSqlSession();
// 通过SqlSession对象获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper中的函数,执行sql
User user = new User(5, "赵六", "9527");
int i = mapper.addUser(user);
if(i == 1){
System.out.println("插入数据成功");
// 因为SqlSession默认关闭事务自动提交,因此插入数据成功后,我们需要手动提交事务,才能在数据库中完成插入
sqlSession.commit();
}else{
System.out.println("插入数据失败");
}
// 使用完毕后,关闭SqlSession对象
sqlSession.close();
}
注意:增、删、改操作都需要提交事务
update
通常使用update标签进行更新数据的操作。
修改用户信息
1、在UserMapper接口中添加对应的方法
// 修改一个用户
int updateUser(User user);
2、在UserMapper.xml中添加insert语句
<update id="updateUser" parameterType="com.bg.pojo.User">
UPDATE user SET name = #{name}, pwd = #{pwd} WHERE id = #{id}
</update>
3、测试
@Test
public void updateUser(){
// 首先获得SqlSession对象
SqlSession sqlSession = MyBatisTool.getSqlSession();
// 通过SqlSession对象获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper中的函数,执行sql
User user = new User(3, "张飞", "00222555");
int i = mapper.updateUser(user);
if(i == 1){
System.out.println("更新数据成功");
// 因为SqlSession默认关闭事务自动提交,因此更新数据成功后,我们需要手动提交事务,才能在数据库中完成插入
sqlSession.commit();
}else{
System.out.println("更新数据失败");
}
// 使用完毕后,关闭SqlSession对象
sqlSession.close();
}
delete
根据id删除一个用户
1、在UserMapper接口中添加对应的方法
// 删除一个用户
int deleteUser(int userId);
2、在UserMapper.xml中添加insert语句
<!--输入参数为基本数据类型,也可以省略不写-->
<delete id="deleteUser" parameterType="int">
DELETE FROM user WHERE id = #{userId};
</delete>
3、测试
@Test
public void deleteUser(){
// 首先获得SqlSession对象
SqlSession sqlSession = MyBatisTool.getSqlSession();
// 通过SqlSession对象获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper中的函数,执行sql
int i = mapper.deleteUser(2);
if(i == 1){
System.out.println("删除数据成功");
// 因为SqlSession默认关闭事务自动提交,因此删除数据成功后,我们需要手动提交事务,才能在数据库中完成插入
sqlSession.commit();
}else{
System.out.println("删除数据失败");
}
// 使用完毕后,关闭SqlSession对象
sqlSession.close();
}
模糊查询
在UserMapper接口中添加对应的方法
// 模糊查询
User getUserByLike(String s);
方法1:java代码中添加sql通配符
<!--模糊查询-->
<select id="getUserByLike" resultType="com.bg.pojo.User">
SELECT * FROM user WHERE name LIKE #{s}
</select>
@Test
public void getUserByLike(){
// 首先获得SqlSession对象
SqlSession sqlSession = MyBatisTool.getSqlSession();
// 通过SqlSession对象获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper中的函数,执行sql
User user = mapper.getUserByLike("%张%");
// 遍历结果,并输出
System.out.println(user.toString());
// 使用完毕后,关闭SqlSession对象
sqlSession.close();
}
方法2:在sql语句中拼接通配符
<!--模糊查询-->
<select id="getUserByLike" resultType="com.bg.pojo.User">
SELECT * FROM user WHERE name LIKE "%"#{s}"%"
</select>
@Test
public void getUserByLike(){
// 首先获得SqlSession对象
SqlSession sqlSession = MyBatisTool.getSqlSession();
// 通过SqlSession对象获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 调用mapper中的函数,执行sql
User user = mapper.getUserByLike("王");
// 遍历结果,并输出
System.out.println(user.toString());
// 使用完毕后,关闭SqlSession对象
sqlSession.close();
}
小结:
- 所有的增删改操作需要显示的提交事务,或者在获取SqlSession的时候显示指定开始事务自动提交。
- 接口所有的普通参数,尽量写实@Param参数,显示声明参数名
- 可以考虑使用map传递参数,方便、简单。
- 为了规范操作,在SQL的配置文件中,我们尽量将Parameter参数和resultType都写上。

浙公网安备 33010602011771号