Mybatis的学习总结(一)——使用配置文件实现增删改查
在使用Mybatis作为持久层来进行操作数据库,有很多的操作都是一样的,基本上都是先得到session,然后调用session提供的相关方法进行操作,接着提交session,最后关闭session。那么,对于实体类而言,基本的操作都是些增删改查操作。没有必要为了不同的实体类,编写多个重复的dao层。那么,可以编写一套通用的增删改查操作模板。ok,现在让我们先来写一个有关于该模板的一个接口。
public interface IBaseDao<T> { //save public void save(T t); //delete public boolean delete(T t); //update public boolean update(T t); //search public List<T> search(T t); //size public int size(); }
接口写好了,下面让我们来写一下该接口的一个实现类:
public class BaseDao{ public void save(String statement , Object obj) { SqlSession session = MyBatisUnit.getSession(); try{ session.insert(statement , obj); session.commit(); }finally{ session.close(); } } public boolean delete(String statement , Object obj) { int num = 0; SqlSession session = MyBatisUnit.getSession(); try{ num = session.delete(statement , obj); session.commit(); }finally{ session.close(); } return num != 0; } public boolean update(String statement , Object obj) { int num = 0; SqlSession session = MyBatisUnit.getSession(); try{ num = session.update(statement, obj); session.commit(); }finally{ session.close(); } return num != 0; } public List search(String statement , Object obj) { List result = null; SqlSession session = MyBatisUnit.getSession(); try{ result = session.selectList(statement, obj); session.commit(); }finally{ session.close(); } return result; } public int size(String statement) { SqlSession session = MyBatisUnit.getSession(); Integer result = null; try{ result = session.selectOne(statement); session.commit(); }finally{ session.close(); } if(result != null) return result.intValue(); return 0; } }
另外,在Mybatis提供的帮助文档的时候,有这么一句话:
SqlSessionFactory 一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。没有理由来处理或重 新创建它。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。 这样的 操作将被视为是非常糟糕的。 因此 SqlSessionFactory 的最佳范围是应用范围。 有很多方法可 以做到, 最简单的就是使用单例模式或者静态单例模式。
我编写的SqlSessionFactory就是根据上面的这句话来实现的,不过我对其进行了一个封装,我帮Mybatis需要的SqlSessionFactory以及SqlSession封装成了MybatisUnit静态类,该类的代码为:
public class MyBatisUnit { private static final class LazyHolder { private static InputStream is = MyBatisUnit.class.getClassLoader() .getResourceAsStream("config.xml"); private static final SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); } public static SqlSessionFactory getSessionFactory() { return LazyHolder.sessionFactory; } public static SqlSession getSession() { return getSessionFactory().openSession(); } public static SqlSession getSession(boolean isAutoCommit) { return getSessionFactory().openSession(isAutoCommit); } }
好了,以上的基本操作都完成了,现在,让我们使用上面的类,来完成一个具体的实体类的增删改查操作。
public class SalaryDao implements IBaseDao<salary> { BaseDao dao = new BaseDao(); @Override public void save(salary sal) { dao.save("cn.jiang.mapper.salaryMapper.save", sal); } @Override public boolean delete(salary sal) { return dao.delete("cn.jiang.mapper.salaryMapper.delete", sal); } @Override public boolean update(salary sal) { return dao.update("cn.jiang.mapper.salaryMapper.update", sal); } @Override public List<salary> search(salary sal) { return dao.search("cn.jiang.mapper.salaryMapper.search", sal); } }
其实,到这里差不多就完成了。但是我还想在多说一句,其实我之前在用Mybatis进行操作的时候,使用int、String作为查询或者删除的参数,后面经过公司的一个师兄指点之后,我把它改成了类作为查询的参数,在写配置文件的时候,通过对属性的判断,来实现不同的操作方式。这样能够简化我们代码的编写量。下面,让我贴出我写的配置文件:
<!-- search --> <select id="search" parameterType="cn.jiang.domain.salary" resultMap="salaryEmployee"> select * from tb_salary <where> <choose> <when test="salary_id != 0"> salary_id = #{salary_id} </when> <when test="bank_name != null"> bank_name = #{bank_name} </when> </choose> </where> </select>
这样,可以通过传递的salary类,来实现是全部查询还是通过salary_id或者bank_name来进行查询。
到这里,就结束了。不当之处,欢迎各位批评指正。