在进入主题之前先提一下sqlSession。sqlSession是一个面向用户(程序员)的接口。
sqlSession中提供了很多操作数据库的方法,如: selectOne(返回单个对象)、selectList(返回单个或多个对象)。sqlSession是线程不安全的,在sqlSession实现了类中除了接口的方法(操作数据库的方法)还有数据域数据。
所以,sqlSession最佳应用场合在方法体内,定义成局部变量使用
在原始的dao开发方法,程序员需要写接口和实现类(本实例中user.xml和user.java在前文中已经提到过故不赘述)。
接口代码如下:
public interface UserDao { //根据id查询用户 public void findUserById(int id); //根据id删除用户 public void deleteUserById(int id); //更新用户 public void updateUser(User user) throws ParseException; }
而且根据以上的结论可以知道需要向dao实现类注入sqlSessionFactory,在方法体内通过sqlSessioFactory在方法体内创建sqlSession。
实现类如下:
public class UserDaoimpl implements UserDao { private SqlSessionFactory sqlSessionFactory; public UserDaoimpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } //根据id查询用户 @Override public void findUserById(int id) { SqlSession sqlSession=sqlSessionFactory.openSession(); User user=sqlSession.selectOne("test.findUserById", id); System.out.println(user); sqlSession.close(); } //根据id删除用户 @Override public void deleteUserById(int id) { SqlSession sqlSession=sqlSessionFactory.openSession(); sqlSession.delete("test.deleteUserById",1); sqlSession.commit(); sqlSession.close(); } //更新用户 @Override public void updateUser(User user) throws ParseException { SqlSession sqlSession=sqlSessionFactory.openSession(); sqlSession.insert("test.insertUser",user); sqlSession.commit(); sqlSession.close(); } }
接下来就是测试代码了,注意测试代码中@before注解,这个注解的意思是在所有的test之前执行该注解里的内容,即执行测试之前生成sqlSessionFactory。
public class DaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void setup() throws IOException{ InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void findUserByIdTest(){ UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.findUserById(1); System.out.println(user); } @Test public void insertUserTest(){ UserDao userDao = new UserDaoImpl(sqlSessionFactory); userDao.insertUser(new User("大凯","1",new Date(),"河北")); } @Test public void deleteUserTest(){ UserDao userDao = new UserDaoImpl(sqlSessionFactory); userDao.deleteUser(30); } @Test public void updateUserTest(){ UserDao userDao = new UserDaoImpl(sqlSessionFactory); userDao.updateUser(new User(31,"毛蛋","1",new Date(),"江西"));; } }
好了,大家可以看到在实现类里还是有很多重复代码,这显然不是我们想看到的,所以这种原始dao方法还有瑕疵,具体怎么改进请看接下来的更新。。。