2、使用Mybatis框架实现增删改查操作
上一篇:1、第一个Mybatis程序
2.1、准备工作
- 由于测试方法执行前都需要获取SqlSession对象和Dao/Mapper接口的代理对象,所以我们将获取两个对象的代码写在 init()方法中,并在 init()上加
@Before
注解(表示在测试方法执行之前执行); - 由于测试方法执行后都需要提交事务和释放资源,所以我们将提交事务和释放资源的代码写在 destroy()方法中,并在 destroy()上加
@After
注解(表示在测试方法执行之后执行); - 由于在 destroy() 方法中需要关闭SqlSession,在其他测试方法中需要userDao代理 对象,所以将两个对象抽取到方法外提升作用域;
- 在测试类中加入如下代码:
private SqlSession sqlSession;
private UserDao userDao;
@Before
public void init() {
// 1、获取SqlSession对象
sqlSession = MybatisUtils.getSqlSession();
// 2、获取UserDao的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
@After
public void destroy() {
// 1、提交事务(Mybatis的插入、删除、更新等采用了事务管理)
sqlSession.commit();
// 2、释放资源
sqlSession.close();
}
2.2、增
-
编写Dao/Mapper接口对应的方法
// 1、增加用户 int addUser(User user);
-
编写方法对应的Mapper.xml中的SQL语句
<!-- 1、添加用户 --> <insert id="addUser" parameterType="com.mybatis.pojo.User"> insert into user (username, password, sex, birthday, address) values (#{username}, #{password}, #{sex}, #{birthday}, #{address}) </insert>
-
编写测试方法及进行测试
@Test public void addUser() { // 1、执行添加方法 userDao.addUser(new User(null,"黄瑾晨","h321456","男",new Date(),"遵义市-红花岗区")); }
-
测试结果
2.3、删
-
编写Dao/Mapper接口对应的方法
// 2、根据id删除用户 int deleteUser(int id);
-
编写方法对应的Mapper.xml中的SQL语句
<!-- 2、根据id删除用户 --> <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete>
-
编写测试方法及进行测试
@Test public void deleteUser() { // 1、执行根据id删除用户方法 userDao.deleteUser(5); }
-
测试结果
2.4、改
-
编写Dao/Mapper接口对应的方法
// 3、更改用户信息 int updateUser(User user);
-
编写方法对应的Mapper.xml中的SQL语句
<!-- 3、更改用户信息 --> <update id="updateUser" parameterType="com.mybatis.pojo.User"> update user set username=#{username},password=#{password},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id} </update>
-
编写测试方法及进行测试
@Test public void updateUser() { User user = new User(); user.setId(4); user.setUsername("苏安然"); user.setPassword("s778855"); user.setSex("男"); user.setBirthday(new Date()); user.setAddress("贵阳市-观山湖区"); // 执行更新用户信息方法 userDao.updateUser(user); }
-
测试结果
2.5、查
-
编写Dao/Mapper接口对应的方法
// 4、查询所有用户信息 List<User> findAll(); // 5、根据id查找用户信息 User findById(int id);
-
编写方法对应的Mapper.xml中的SQL语句
<!-- 4、查新所有用户信息 --> <select id="findAll" resultType="com.mybatis.pojo.User"> select * from user </select> <!-- 5、根据id查询用户信息 --> <select id="findById" parameterType="int" resultType="com.mybatis.pojo.User"> select * from user where id = #{id} </select>
-
编写测试方法及进行测试
@Test public void findAll() { // 1、执行查询所有方法 List<User> users = userDao.findAll(); // 2、打印查询结果 for(User user: users) { System.out.println(user); } } @Test public void findById() { // 1、执行根据id查询用户方法 User users = userDao.findById(3); // 2、打印查询结果 System.out.println(users); }
-
测试结果
2.6、使用Map传参
-
当实体类参数过多、数据库表字段过多时,我们可以考虑使用Map;
- 使用Map传参,直接在SQL语句中取出key即可!【parameterType=“map”】
- 使用对象传参,直接在SQL语句中取出对象的属性即可!【parameterType=“Object”】
- 使用一个基本类型传参,可直接在SQL中取到!【parameterType=“基本类型” 可以不写这个属性】
- 多个参数用Map或者注解!
-
编写Dao/Mapper接口
// 6、使用Map传参查询用户 User findByNameAndPwd(Map<String, Object> map);
-
编写Mapper.xml
<!-- 6、通过Map传参查询用户信息 --> <select id="findByNameAndPwd" parameterType="map" resultType="com.mybatis.pojo.User"> select * from user where username = #{name} and password = #{pwd} </select>
-
编写测试方法及进行测试
@Test public void findByNameAndPwd() { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "苏瑞韩"); map.put("pwd", "s653249"); User user = userDao.findByNameAndPwd(map); System.out.println(user); }
-
执行结果
2.7、模糊查询
-
Java代码执行时,传入通配符% %
List<User> users = userDao.findLike("%苏%");
<!-- 7、根据名称模糊查询 --> <select id="findLike" parameterType="string" resultType="com.mybatis.pojo.User"> select * from user where username like #{value} </select>
-
在SQL拼接中使用通配符(不安全,存在SQL注入问题)
List<User> users = userDao.findLike("苏");
<!-- 7、根据名称模糊查询 --> <select id="findLike" parameterType="string" resultType="com.mybatis.pojo.User"> select * from user where username like "%"#{value}"%" </select>
-
执行findLike()模糊查询
@Test public void findLike() { List<User> users = userDao.findLike("%苏%"); // List<User> users = userDao.findLike("苏"); for (User user:users) { System.out.println(user); } }
-
执行结果
2.7、源码
-
UserDao.java
/** * 用户持久层 */ public interface UserDao { // 1、增加用户 int addUser(User user); // 2、根据id删除用户 int deleteUser(int id); // 3、更改用户信息 int updateUser(User user); // 4、查询所有用户信息 List<User> findAll(); // 5、根据id查找用户信息 User findById(int id); // 6、使用Map传参查询用户 User findByNameAndPwd(Map<String, Object> map); // 7、模糊查询 List<User> findLike(String value); }
-
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"> <!-- namespace属性的值为UserDao接口的全限定类名 --> <mapper namespace="com.mybatis.dao.UserDao"> <!-- 1、添加用户 --> <insert id="addUser" parameterType="com.mybatis.pojo.User"> insert into user (username, password, sex, birthday, address) values (#{username}, #{password}, #{sex}, #{birthday}, #{address}) </insert> <!-- 2、根据id删除用户 --> <delete id="deleteUser" parameterType="int"> delete from user where id = #{id} </delete> <!-- 3、更改用户信息 --> <update id="updateUser" parameterType="com.mybatis.pojo.User"> update user set username=#{username},password=#{password},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id} </update> <!-- 4、查新所有用户信息 --> <select id="findAll" resultType="com.mybatis.pojo.User"> select * from user </select> <!-- 5、根据id查询用户信息 --> <select id="findById" parameterType="int" resultType="com.mybatis.pojo.User"> select * from user where id = #{id} </select> <!-- 6、通过Map传参查询用户信息 --> <select id="findByNameAndPwd" parameterType="map" resultType="com.mybatis.pojo.User"> select * from user where username = #{name} and password = #{pwd} </select> <!-- 7、根据名称模糊查询 --> <select id="findLike" parameterType="string" resultType="com.mybatis.pojo.User"> select * from user where username like #{value} </select> </mapper>
-
UserDaoTest.java
public class UserDaoTest { private SqlSession sqlSession; private UserDao userDao; @Before public void init() { // 1、获取SqlSession对象 sqlSession = MybatisUtils.getSqlSession(); // 2、获取UserDao的代理对象 userDao = sqlSession.getMapper(UserDao.class); } @After public void destroy() { // 1、提交事务(Mybatis的插入、删除、更新等采用了事务管理) sqlSession.commit(); // 2、释放资源 sqlSession.close(); } @Test public void addUser() { // 1、执行添加方法 userDao.addUser(new User(null,"黄瑾晨","h321456","男",new Date(),"遵义市-红花岗区")); } @Test public void deleteUser() { // 1、执行根据id删除用户方法 userDao.deleteUser(5); } @Test public void updateUser() { User user = new User(); user.setId(4); user.setUsername("苏安然"); user.setPassword("s778855"); user.setSex("男"); user.setBirthday(new Date()); user.setAddress("贵阳市-观山湖区"); // 执行更新用户信息方法 userDao.updateUser(user); } @Test public void findAll() { // 1、执行查询所有方法 List<User> users = userDao.findAll(); // 2、打印查询结果 for(User user: users) { System.out.println(user); } } @Test public void findById() { // 1、执行根据id查询用户方法 User users = userDao.findById(3); // 2、打印查询结果 System.out.println(users); } @Test public void findByNameAndPwd() { Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "苏瑞韩"); map.put("pwd", "s653249"); User user = userDao.findByNameAndPwd(map); System.out.println(user); } @Test public void findLike() { List<User> users = userDao.findLike("%苏%"); // List<User> users = userDao.findLike("苏"); for (User user:users) { System.out.println(user); } } }
以上为Mybatis简单的CRUD操作!