这次的测试基于之前的查询操作搭建的环境,我们注意到与数据库有关的操作一般都会有事务的提交或者回滚,昨天测试的额查询操作在数据库数据的层面上并没有变动,也就不能称之为事务,今天的测试以及涉及到事务的概念了,三板斧:加载mybatis核心配置文件 —> 利用加载文件获得的资源创建会话工厂SqlSessionFactory —> 利用会话工厂创建会话对象 SqlSession 。
InputStream resourceAsStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession session = sqlSessionFactory.openSession();
会话对象session:我在源代码里找到了一些目前能用到的常见api(注意方法参数的类型以及常见的一些数据库操作方法)
void select(String var1, Object var2, ResultHandler var3);
void select(String var1, ResultHandler var2);
void select(String var1, Object var2, RowBounds var3, ResultHandler var4);
int insert(String var1);
int insert(String var1, Object var2);
int update(String var1);
int update(String var1, Object var2);
int delete(String var1);
int delete(String var1, Object var2);
void commit();
void commit(boolean var1);
void rollback();
void rollback(boolean var1);
void close();
void clearCache();
Configuration getConfiguration();
Connection getConnection();
那么今天的测试增删改能用到的api就有
插入: int insert(String var1(这个对应的是mapper文件对应的插入方法), Object var2(一般是new出来用于传递参数的与数据库表对应的实体对象));
删除:int delete(String var1, Object var2);
修改:int update(String var1, Object var2);
事务的提交:void commit();
会话资源的关闭:void close();
测试代码:
// 插入操作
@Test
public void test2() throws IOException {
// 模拟User对象
User user = new User();
user.setAge(20);
user.setName("筒影月子");
InputStream resourceAsStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession session = sqlSessionFactory.openSession();
session.insert("userMapper.save",user);
// 框架的默认事务是不提交的,所以我们需要将事务提交
session.commit();
session.close();
}
// 修改操作
@Test
public void test3() throws IOException {
User user = new User();
user.setName("筒影月子");
// 改年纪为19岁,本来是20
user.setAge(19);
// 标准三板斧:
// 通过加载总配置文件获取资源然后创建会话工厂,通过工厂生产会话对象,再利用会话对象操作数据库
InputStream resourceAsStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession session = sqlSessionFactory.openSession();
session.update("userMapper.update",user);
// 框架的默认事务是不提交的,所以我们需要将事务提交
session.commit();
session.close();
}
// 删除操作
@Test
public void test4() throws IOException {
// User user = new User();
// user.setName("筒影月子");
// user.setAge(19);
// 标准三板斧:
// 通过加载总配置文件获取资源然后创建会话工厂,通过工厂生产会话对象,再利用会话对象操作数据库
InputStream resourceAsStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession session = sqlSessionFactory.openSession();
// session.delete("userMapper.delete",user);
session.delete("userMapper.delete1","御坂美琴");
// 框架的默认事务是不提交的,所以我们需要将事务提交
session.commit();
session.close();
对应的配置文件中的配置(参考我上面给出的api进行对比增加理解)
<!-- 插入操作,参数是实体的属性-->
<insert id="save" parameterType="com.hlc.pojo.User">
insert into test.user values (#{name},#{age})
</insert>
<!-- 修改操作 -->
<update id="update" parameterType="com.hlc.pojo.User">
update test.user set name=#{name},age=#{age} where name=#{name}
</update>
<!-- 删除的两种操作,带实体对象属性的删除与对应数据库表数据的删除-->
<delete id="delete" parameterType="com.hlc.pojo.User">
delete from test.user where name=#{name}
</delete>
<delete id="delete1" parameterType="java.lang.String">
delete from test.user where name=#{name}
</delete>
这里的测试每一次都要new或者实例化工厂的方法太过于重复,这个代码的重复度太高了,采取spring容器果然是必要的。