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来进行查询。

      到这里,就结束了。不当之处,欢迎各位批评指正。

      

转载于:https://www.cnblogs.com/jiang2016/p/5326292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值