使用Mybatis框架实现增删改查
在IDEA中创建项目,项目的目录结构和之前的完全一样,
但是UserDao接口中会依次添加一些方法来实现对数据库的增删改查,在UserDao.xml中依次实现对UserDao接口中添加的各个方法的配置,最终完成这个项目
查询所有
关于查询所有在之前的博客中都有过讲解
在UserDao
接口中添加
/**
* 查询所有用户
* @return
*/
List<User> findAll();
在UserDao.xml中的<mapper>
标签中添加
<select id="findAll" resultType="com.qjz.domain.User">
select * from stu;
</select>
resultType
参数是将查询到的表中的所有记录逐条封装到com.qjz.domain.User
类的对象中,将这些对象全部封装到一个集合中,返回一个集合
添加完成后在测试类MybatisTest
中添加一个测试方法
@Test
public void findAllTest() throws IOException {
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
List<User> users = mapper.findAll();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
运行这个方法
查找完成
保存用户
在UserDao
接口中添加
/**
* 保存用户
* @param user
*/
void saveUser(User user);
在UserDao.xml中添加
<insert id="saveUser" parameterType="com.qjz.domain.User">
insert into stu(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
</insert>
添加完成后在测试类中添加测试方法
@Test
public void saveUserTest() throws IOException {
//创建要保存的用户对象
User user = new User();
user.setUsername("qiangjingzhou");
user.setBirthday(new Date());
user.setAddress("shanxibaoji");
user.setSex("男");
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.saveUser(user);
sqlSession.close();
}
运行上面的测试方法,可以看到
并没有报错,执行之前的查找所有方法
可以看到我们创建的对象中的属性值并没有被插入到stu表中,为什么
在程序运行时自动提交事务被关闭,只能手动提交事务,必须添加一句手动提交事务的代码sqlSession.commit();
,当然这段代码必须添加在sqlSession.close();
之前
添加完成后执行测试方法,保存完成后执行查找方法
可以看出id并没有连续,这是因为在自动提交事务被关闭后,我们创建的对象的属性值构成的记录并不能被插入到表中,会发生回滚,但是因为id已经被分配,所以在再次执行保存用户的方法时会分配下一个id
在有的时候我们在执行保存用户的操作后会返回插入的记录的id数,需要对UserDao.xml中的相关内容进行修改
<insert id="saveUser" parameterType="com.qjz.domain.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into stu(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday});
</insert>
在执行插入语句之前添加一个标签 <selectKey>
,这个标签的属性值:
keyProperty
代表id在User类中对应的名称keyColumn
代表id在表中的对应的名称resultType
属性是返回值类型、我们需要让这个方法返回id这个整型数,所以设置该属性为int
order
表示在执行插入语句后执行<selectKey>
标签中的内容select last_insert_id();
这句SQL语句表示查找最后一条记录的id
在修改完上述配置后还有一个注意点,就是要修改接口中的saveUser(User user)
的方法的返回值为int
修改相应的测试类的代码
在userDao.saveUser(user);
后添加System.out.println(user.getId());
运行测试方法
每执行一个保存用户方法该值就会改变,通过这种方式就可以获取插入的记录的id
在执行完插入操作后可以查看掺入对象的id,这个id就是数据库分配给这条记录的id
还可以执行一个操作
System.out.println(user.getId());
userDao.saveUser(user);
System.out.println(user.getId());
可以看到在插入到数据库前这个对象是没有id属性的,在插入后可以看到数据库给这条记录分配的id,并且通过反射获取到这个对象的id属性值,将数据库中的id值赋给对象中的id属性,所以在插入后可以看到user对象的id属性值
更新用户
在UserDao接口中插入
/**
* 更新用户
* @param user
*/
void updateUser(User user);
在UserDao.xml中插入
<update id="updateUser" parameterType="com.qjz.domain.User">
update stu set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
在修改完配置文件后在测试方法中开始测试
通过上面两种操作的测试方法可以知道我们的测试代码中有许多重复的代码,可以将这些代码提取出来
在测试类中将之前创建代理对象的代码和提交事务、关闭sqlSession对象的代码提取到一个测试类的一个方法中
@Before //会在执行完选中的测试方法前执行被@After注解描述的方法
public void init() throws IOException {
in = Resources.getResourceAsStream("SqlMapperConfig.xml");
builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
sqlSession = factory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@After //会在执行完选中的测试方法后执行被@After注解描述的方法
public void last(){
sqlSession.commit();
sqlSession.close();
}
在将这些代码提取出来后测试代码就简单了许多
修改id为60的那条记录
@Test
public void updateUserTest() throws IOException {
init();
User user = new User();
user.setId(60);
user.setUsername("强静州");
user.setBirthday(new Date());
user.setAddress("陕西宝鸡");
user.setSex("男");
userDao.updateUser(user);
}
执行完测试方法后,执行查询所有结果,查看我们修改记录后的效果
修改完成