4. 案例优化
大约 1 分钟
案例优化
通过上面的效果演示大家会发现每个案例都有很多的重复代码。完全可以简化操作
单独提供SqlSessionFactory单例方法
package com.bobo.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.Date;
public class DbUtils {
private static SqlSessionFactory factory;
public static SqlSessionFactory getInstance(){
if(factory == null){
InputStream in = null;
try{
in = Resources.getResourceAsStream("mybatis-cfg.xml");
}catch (Exception e){
e.printStackTrace();
}
synchronized (DbUtils.class){
if(factory == null){
factory = new SqlSessionFactoryBuilder().build(in);
}
}
}
return factory;
}
}
声明接口及实现类
package com.bobo.dao;
import com.bobo.pojo.User;
import java.util.List;
public interface IUserDao {
int addUser(User user);
int updateUser(User user);
int deleteUser(Integer id);
List<User> queryById(Integer id);
}
package com.bobo.dao.impl;
import com.bobo.pojo.User;
import com.bobo.dao.IUserDao;
import com.bobo.utils.DbUtils;
import java.util.List;
public class UserDaoImpl implements IUserDao {
@Override
public int addUser(User user) {
return DbUtils.getInstance().openSession().insert("com.bobo.dao.IUserDao.addUser",user);
}
@Override
public int updateUser(User user) {
return DbUtils.getInstance().openSession().insert("com.bobo.dao.IUserDao.updateUser",user);
}
@Override
public int deleteUser(Integer id) {
return DbUtils.getInstance().openSession().insert("com.bobo.dao.IUserDao.updateUser",id);
}
@Override
public List<User> queryById(Integer id) {
return DbUtils.getInstance().openSession().selectList("com.bobo.dao.IUserDao.queryById", id);
}
}
可以发现Dao实现类中的方法是实现是有很多可以相互约定的操作,如果相互都按照约定来执行的话,那么我们完全可以省略掉Dao的实现类,通过代理对象来实现
@Test
public void test03(){
// 获取一个Dao接口的代理对象
IUserDao dao = (IUserDao) Proxy.newProxyInstance(IUserDao.class.getClassLoader()
, new Class[]{IUserDao.class}
, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(IUserDao.class.getName()+"." + method.getName());
return DbUtils
.getInstance()
.openSession()
.selectList(IUserDao.class.getName()+"." + method.getName(),args[0]);
}
});
// dao.addUser(null);
//dao.updateUser(null);
List<User> list = dao.queryById(18);
for (User user : list) {
System.out.println(user);
}
}