今天主要的研究是关于ibatis的DAO。DAO全名是Data Access Object,有它的存在解决了数据库使用中的一个问题,就是如何面对不同的数据库资源进行相同的处理。在DAO下,规定了数据库操作的接口,于是面对不同的数据库资源,只需要分别实现相关接口就可以。提供接口API给用户能是用户更加方便的操作数据库,减少麻烦,避免一些可以避免的错误。
在使用之前,必须下载ibatis的dao包,因为在直接下载的ibatis包中是不含dao部分的。下载页面的右下角就有下载。
首先,来看一下ibatis的DAO结构,其核心就在一个dao.xml配置文件中。
- <daoConfig>
- <context id="sqlmap">
- <transactionManager type="SQLMAP">
- <property name="SqlMapConfigResource" value="com/featheast/daobasic/SqlMapConfig.xml"/>
- </transactionManager>
- <dao interface="com.featheast.daobasic.UserDao"
- implementation="com.featheast.daobasic.UserDaoImpl"/>
- </context>
- </daoConfig>
在这个配置文件中,定义了当前的上下文环境,使用的TransactionManager,这个可以直接使用前面已经用过的manager,以及相对应的一组dao接口和实现类。很直观简洁。所有的DAO都是围绕着这个配置文件展开的。
接口定义了需要操作的方法,如下所示,基本包含了常见的CRUD方法:
- public interface UserDao {
- public void insert(UserBean user);
- public void update(UserBean user);
- public int delete(UserBean user);
- public int delete(Integer id);
- public List<UserBean> getUserList(UserBean user);
- public List<Map<String, Object>> getMapList(UserBean user);
- public UserBean getById(Integer id);
- public UserBean getUser(UserBean user);
- }
然后仍然是按照前面的定义SqlMapConfig.xml 和 SqlMap.xml,分别管理transactionManager和sql映射。
最后就是完成实现接口类:
- public class UserDaoImpl extends SqlMapDaoTemplate implements UserDao {
- public UserDaoImpl(DaoManager daoManager){
- super(daoManager);
- }
- public int delete(UserBean user) {
- // TODO Auto-generated method stub
- return delete(user.getId());
- }
- public int delete(Integer id) {
- // TODO Auto-generated method stub
- return delete("UserBean.delete",id);
- }
- public UserBean getById(Integer id) {
- // TODO Auto-generated method stub
- return (UserBean)queryForObject("UserBean.getById",id);
- }
- public List<Map<String, Object>> getMapList(UserBean user) {
- // TODO Auto-generated method stub
- return queryForList("UserBean.getMapList",user);
- }
- public UserBean getUser(UserBean user) {
- // TODO Auto-generated method stub
- return null;
- }
- public List<UserBean> getUserList(UserBean user) {
- // TODO Auto-generated method stub
- return queryForList("UserBean.getUserList",user);
- }
- public void insert(UserBean user) {
- // TODO Auto-generated method stub
- insert("UserBean.insert",user);
- }
- public void update(UserBean user) {
- // TODO Auto-generated method stub
- update("UserBean.update",user);
- }
- }
首先要注意的是该类扩展了SqlMapDaoTemplate,这就可以直接在该类中调用常见的数据库操作方法而不需要生成一个SqlClient的实例。
最后是测试类:
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- DaoManager manager=GetDaoManager.getDaoManager();
- //UserDaoImpl impl=new UserDaoImpl(manager);
- UserDao impl=(UserDao)manager.getDao(UserDao.class);
- System.out.println(impl.delete(108));
- //System.out.println(impl.getById(108));
- UserBean user=new UserBean();
- user.setDay("7");
- user.setEmail("123@123.com");
- user.setMonth("1");
- user.setName("fea");
- user.setPwd("123");
- user.setQq("222");
- user.setUid("fea");
- user.setYear("1000");
- impl.insert(user);
- }
其中有很重要的一点要注意的,就是在初始化impl的时候,不能直接使用构造函数,不然就会在后面出现NEP报错,地点应该是在getTransaction()方法中,第108行。这个问题花了我半个小时,最后才在Goolge上找到一个人出了同样的问题,用UserDao impl=(UserDao)manager.getDao(UserDao.class);这个方法解决的。