玩转MyBatis02——增删改查
上一节我们搭建了 MyBatis 的环境,并简单实现了一个查询所有用户的 SQL 语句。本节,我将带领大家学习一下常用的增删改查的常用 SQL 语句。MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。官方文档地址
1. select
1.1 不带参数
- UserMapper 接口编写
// 查询所有用户
List<User> getUserList();
- UserMapper.xml编写
<!--select查询语句, resultType 写集合的范型的类型-->
<select id="getUserList" resultType="com.jason.pojo.User">
select *
from mybatis.user
</select>
- 测试类中用例编写
@Test
public void queryAllUserTest() {
// 获取 SqlSession 对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
// 执行 SQL
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
// 关闭 SqlSession
sqlSession.close();
}
1.2 带一个参数
- UserMapper 接口编写
// 根据用户ID查询用户信息
User getUserInfoById(int id);
- UserMapper.xml编写
<!--select查询语句, resultType 写集合的范型的类型-->
<select id="getUserInfoById" resultType="com.jason.pojo.User">
select * from mybatis.user where id=#{id}
</select>
- 测试类中用例编写
@Test
public void queryUserByIdTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int userId = 1;
User user = mapper.getUserInfoById(userId);
System.out.println(user);
// 关闭 SqlSession
sqlSession.close();
}
1.3 带多个参数(@Param)
- UserMapper 接口编写
// 根据用户名和密码查询用户 @Param
User getUserByNP(@Param("username") String username, @Param("password") String password);
- UserMapper.xml编写
<select id="getUserByNP" resultType="com.jason.pojo.User">
select * from mybatis.user where name = #{username} and pwd = #{password}
</select>
注意:xml 文件中 #{x} 中的 x 需要与 UserMapper 接口中@Param(“x”) 中的 x 保持一致!!!
- 测试类中用例编写
@Test
public void queryUserByNPTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserByNP("Jason", "123456");
System.out.println(user);
sqlSession.close();
}
1.4 带多个参数(Map)
- UserMapper 接口编写
// 根据用户名和密码查询用户 Map
User getUserByNPMap(Map<String, Object> map);
- UserMapper.xml编写
<!--直接取 Map 中的 key 即可-->
<select id="getUserByNPMap" parameterType="map" resultType="com.jason.pojo.User">
select * from mybatis.user where name = #{username} and pwd = #{pwd}
</select>
注意:xml 文件中 #{x} 中的 x 取的是 Map 中对应 key 的 value
- 测试类中用例编写
@Test
public void queryUserByNPMapTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<>();
map.put("username", "Jason");
map.put("pwd", "123456");
User user = mapper.getUserByNPMap(map);
System.out.println(user);
sqlSession.close();
}
注意: Map 中对应 key 为 SQL 中的动态参数即可,无需有序
- 参数少时可以用 @Param 注解,参数较多时推荐使用 Map
- Map. 传递参数,直接在 SQL 中取出 key 即可!(parameterType=“map” )
- 对象传递参数,直接在 SQL 中取对象的属性即可!(insert 中的 parameterType=“com.jason.pojo.User”)
- 只有一个基本类型参数的情况下,可以直接在 SQL 中取!
- @Param 传递的参数,直接在 SQL 中取即可
1.5 模糊查询
- UserMapper 接口编写
// 模糊查询
List<User> getUserListNameLike(String namePre);
- UserMapper.xml编写
<select id="getUserListNameLike" resultType="com.jason.pojo.User">
select * from mybatis.user where name like #{username}
</select>
注意:xml 文件中 #{x} 中的 x 需要与 UserMapper 接口中@Param(“x”) 中的 x 保持一致!!!
- 测试类中用例编写
@Test
public void queryUserLikeTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUserListNameLike("%j%");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
- 注意模糊查询时,需要带通配符 %%
2. insert
- UserMapper 接口编写
// 新增用户
int addUser(User user);
返回值时影响的行数!
- UserMapper.xml编写
<insert id="addUser" parameterType="com.jason.pojo.User">
insert into mybatis.user (id, name, pwd)
values (#{id}, #{name}, #{pwd})
</insert>
- 测试类中用例编写
@Test
public void addUserTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(5, "Nathan", "123");
// 返回影响的行数, res >= 1, 为0时实际为插入失败
int res = mapper.addUser(user);
System.out.println(res);
sqlSession.commit();
sqlSession.close();
}
注意:增、删、改操作需要提交事务!
3. update
- UserMapper 接口编写
// 修改用户信息
int updateUser(User user);
返回值时影响的行数!
- UserMapper.xml编写
<update id="updateUser" parameterType="com.jason.pojo.User">
update mybatis.user set name = #{name} where id = #{id}
</update>
- 测试类中用例编写
@Test
public void updateUserTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User(5, "New Name", "456");
// 返回影响的行数
int res = mapper.updateUser(user);
System.out.println(res);
sqlSession.commit();
sqlSession.close();
}
注意:增、删、改操作需要提交事务!
4. delete
- UserMapper 接口编写
// 根据用户ID删除用户
int deleteUserById(int userId);
返回值时影响的行数!
- UserMapper.xml编写
<delete id="deleteUserById" parameterType="int">
delete from mybatis.user where id = #{id}
</delete>
- 测试类中用例编写
@Test
public void deleteUserByIdTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int res = mapper.deleteUserById(5);
System.out.println(res);
sqlSession.commit();
sqlSession.close();
}
注意:增、删、改操作需要提交事务!