(二)增删改查
1.namespace
UserMapper中namespace的包名要和Dao/Mapper接口的包名一致
<mapper namespace="dao.UserDao">
2.MyBatis使用事务
-
mybatis默认开启事务(若在mybatis的配置文件中,transactionManager标签的type设为jdbc的话),也就是mybatis默认关闭自动提交。
-
若要对数据库进行修改操作,必须调用sqlSession.commit()方法。
3.语句参数
- id对应绑定接口的方法
- resultType对应返回类型中的泛型
- parameterType对应参数类型
4.流程(insert举例)
-
在UserDao.java接口中添加方法
//插入一个用户 int addAUser(User user);
-
在UserMapper.xml中添加sql语句
<!--#后的变量名是对象的属性名--> <insert id="addAUser" parameterType="pojo.User"> insert into mybatiss.user values (#{id},#{name},#{pwd}); </insert>
-
写测试方法
//增删改查需要提交事务 @Test public void addAUser() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); int rs = userDao.addAUser(new User(4, "小蓝", "123")); if (rs > 0) System.out.println("插入成功"); //提交事务 sqlSession.commit(); sqlSession.close(); }
5.代码
-
UserDao
package dao; public interface UserDao { //查询所有用户列表 List<User> getUserList(); //根据id查询用户 User getUserById(int id); //插入一个用户 int addAUser(User user); //修改用户 int updateUser(User user); //删除用户 int deleteUser(int id); }
-
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绑定一个对应的Dao接口--> <mapper namespace="dao.UserDao"> <!--id对应绑定接口的方法,resultType对应返回类型中的泛型,parameterType对应参数类型--> <select id="getUserList" resultType="pojo.User"> select * from mybatiss.user </select> <!--#取参数值--> <select id="getUserById" parameterType="int" resultType="pojo.User"> select * from mybatiss.user where id = #{id} </select> <!--#后的变量名是对象的属性名--> <insert id="addAUser" parameterType="pojo.User"> insert into mybatiss.user values (#{id},#{name},#{pwd}); </insert> <update id="updateUser" parameterType="pojo.User"> update mybatiss.user set name=#{name},pwd=#{pwd} where id=#{id}; </update> <delete id="deleteUser" parameterType="int"> delete from mybatiss.user where id =#{id}; </delete> </mapper>
-
UserDaoTest
package dao; public class UserDaoTest { @Test public void test() { //获得SqlSession对象 SqlSession sqlSession = MybatisUtils.getSqlSession(); //getMapper UserDao mapper = sqlSession.getMapper(UserDao.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } //关闭sqlSession sqlSession.close(); } @Test public void getUseById() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); User user = userDao.getUserById(2); System.out.println(user); sqlSession.close(); } //增删改查需要提交事务 @Test public void addAUser() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); int rs = userDao.addAUser(new User(4, "小蓝", "123")); if (rs > 0) System.out.println("插入成功"); //提交事务 sqlSession.commit(); sqlSession.close(); } @Test public void updateUser() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); int rs = userDao.updateUser(new User(4, "小蓝", "321")); if (rs > 0) System.out.println("修改成功"); //提交事务 sqlSession.commit(); sqlSession.close(); } @Test public void deleteUser() { SqlSession sqlSession = MybatisUtils.getSqlSession(); UserDao userDao = sqlSession.getMapper(UserDao.class); int rs = userDao.deleteUser(4); if (rs > 0) System.out.println("删除成功"); //提交事务 sqlSession.commit(); sqlSession.close(); } }
6.注意
- 增删改查需要提交事务
- resource绑定mapper,需要使用路径/
7.万能Map
当实体类或数据库中表的字段过多时,应当考虑使用Map。
UserDao
//只修改用户的部分信息
int updateUser2(Map<String,Object> map);
UserMapper.xml
<!--#后的变量名为map的key-->
<update id="updateUser2" parameterType="map">
update mybatiss.user set pwd=#{userPwd} where id=#{userId};
</update>
UserDaoTest
@Test
public void updateUser2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
Map<String,Object> map = new HashMap<>();
map.put("userId",1);
map.put("userPwd","555");
int rs = userDao.updateUser2(map);
if (rs > 0)
System.out.println("修改成功");
//提交事务
sqlSession.commit();
sqlSession.close();
}
*Map传递参数,直接在sql中取出key即可。
对象传递参数,直接在sql中取对象的属性即可。
只有一个基本类型参数的情况下,可以直接在sql中取到。
多个参数用Map,或注解。
8.模糊查询
1.传递通配符% %
UserDao
//模糊查询用户
List<User> getUsersLike(String value);
UserMapper.xml
<select id="getUsersLike" parameterType="String" resultType="pojo.User">
select * from mybatiss.user where name like #{value}
</select>
UserDaoTest
@Test
public void getUsersLike() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUsersLike("%绿%");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}