本文共 4651 字,大约阅读时间需要 15 分钟。
在demomybatis的基础上,新建dao包,持久层,其中有IUserDao接口:
package com.bit.dao;import com.bit.po.user;//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exceptionpublic interface IUserDao { public int addUser(user user1) throws Exception; public int modifyUser(int id,user user2)throws Exception; public int delUser(int id)throws Exception; public user queryUser(int id)throws Exception;}
并写其实现类UserDaoImpl:(部分方法略,只体现查找)
package com.bit.dao;import com.bit.po.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;import java.io.InputStream;public class UserDaoImpl implements IUserDao { //需要使用sqlSessionFactory和sqlSession private SqlSessionFactory sqlSessionFactory=null; //无参构造,new UserDaoImpl时也能new SqlSessionFactory public UserDaoImpl() { String mybatisConfigFile="sqlMapConfig.xml"; InputStream is=null; try { is=Resources.getResourceAsStream(mybatisConfigFile); sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } @Override public user queryUser(int id) throws Exception { SqlSession sqlSession=sqlSessionFactory.openSession(); user user1=sqlSession.selectOne("test.queryUserById",id); return user1; }}
新建一个测试类MyBatisTest2,它相当于客户端,此时的测试类中不需要new SqlSessionFactory和SqlSession了:
package com.bit;import com.bit.dao.IUserDao;import com.bit.dao.UserDaoImpl;import com.bit.po.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;public class MybatisTest2 { //只需要Dao //此时没有Spring,自行创建 private IUserDao iUserDao=new UserDaoImpl(); @Test public void queryUser(){ try { user user1 = iUserDao.queryUser(2); System.out.println(user1);}catch (Exception ex){ ex.printStackTrace();}}}
运行结果为:
接口修改方法如下:
package com.bit.dao;import com.bit.po.user;import java.util.List;//因为该接口位于dao层,所以错误的东西应该让客户的页面看到,所以应往上抛Exceptionpublic interface IUserDao { public user queryUserById(int myid)throws Exception; public ListqueryUserByName(String name)throws Exception; public void modifyUser(user user1) throws Exception; public void delUser(int id)throws Exception; public user queryUser(int id)throws Exception;}
如果用户有很多个订单,难道需要很多个Impl类? 利用动态代理,代理对象,像反射一样,运行期创建。因此不再需要UserDaoImpl。
那么只剩下接口,没有实现类。——通过代理Proxy,动态代理需要实现一些规则。约定优于配置。
在mapper包下新建user.xml:
> update user set username=#{ userName} where userid=#{ userID}; delete from user where userid=#{ value};
新建单元测试MybatisTest3:
package com.bit;import com.bit.dao.IUserDao;import com.bit.po.user;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import java.io.IOException;import java.io.InputStream;public class MybatisTest3 { private SqlSessionFactory sqlSessionFactory; @Before public void testInit() { String mybatisConfigFile="sqlMapConfig.xml"; InputStream is=null; try { is=Resources.getResourceAsStream(mybatisConfigFile); sqlSessionFactory=new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } //测queryById //使用mapper动态代理 @Test public void test() { SqlSession sqlSession=sqlSessionFactory.openSession(); //代理对象与被代理对象实现同一接口,所以生成的代理对象也实现了IUserDao这个接口 try { IUserDao userDao=sqlSession.getMapper(IUserDao.class); user user1=userDao.queryUserById(3); System.out.println(user1); } catch (Exception ex) { ex.printStackTrace();} finally { sqlSession.close(); } }}
再把user.xml的名字改成与接口名一致,并且放在同一个包下:
可以将dao层改名为mapper层。(现在改名叫mapper了。)
总结:
规则1:workspace一致,
2:方法名与id名一致 3.方法参数与ParameterType一致 4.方法返回值与ResultType一致 5.接口与xml名字一致 6.接口与xml在同一个包下 7.通过包扫描转载地址:http://objh.baihongyu.com/