MyBatis 中使用 Mapper 简化代码的方法
前面文章所写的增删改查是存在问题的。每执行一次SQL,都要开启一次会话,并且需要提交并关闭,主要问题就是冗余代码过多,模板化代码过多。
例如,我想开发一个UserDao,可能是下面这样:
简化前的UserDao
publicclassUserDao{ privateSqlSessionFactorysqlSessionFactory=SqlSessionFactoryUtils.getInstance(); publicUsergetUserById(Integerid){ SqlSessionsqlSession=sqlSessionFactory.openSession(); Useruser=(User)sqlSession.selectOne("com.antonio.hello.mybatis.mapper.UserDao.getUserById",id); sqlSession.close(); returnuser; } publicIntegeraddUser(Useruser){ SqlSessionsqlSession=sqlSessionFactory.openSession(); intinsert=sqlSession.insert("com.antonio.hello.mybatis.mapper.UserDao.addUser",user); sqlSession.commit(); sqlSession.close(); returninsert; } publicIntegeraddUser2(Useruser){ SqlSessionsqlSession=sqlSessionFactory.openSession(); intinsert=sqlSession.insert("com.antonio.hello.mybatis.mapper.UserDao.addUser2",user); sqlSession.commit(); sqlSession.close(); returninsert; } publicIntegerdeleteUserById(Integerid){ SqlSessionsqlSession=sqlSessionFactory.openSession(); intdelete=sqlSession.delete("com.antonio.hello.mybatis.mapper.UserDao.deleteUserById",id); sqlSession.commit(); sqlSession.close(); returndelete; } publicIntegerupdateUser(Useruser){ SqlSessionsqlSession=sqlSessionFactory.openSession(); intdelete=sqlSession.delete("com.antonio.hello.mybatis.mapper.UserDao.updateUser",user); sqlSession.commit(); sqlSession.close(); returndelete; } publicListgetAllUser(){ SqlSessionsqlSession=sqlSessionFactory.openSession(); List users=sqlSession.selectList("com.antonio.hello.mybatis.mapper.UserDao.getAllUser"); sqlSession.close(); returnusers; } }
对应的UserMapper.xml
然后,和这个UserDao对应的,还有一个UserMapper.xml:
select*fromuserwhereid=#{id}; insertintouser(username,address)values(#{username},#{address}); selectuuid(); insertintouser(id,username,address)values(#{id},#{username},#{address}); deletefromuserwhereid=#{id} updateusersetusername=#{username}whereid=#{id}; select*fromuser;
此时,我们分析这个UserDao,发现它有很多可以优化的地方。每个方法中都要获取SqlSession,涉及到增删改的方法,还需要commit,SqlSession用完之后,还需要关闭,sqlSession执行时需要的参数就是方法的参数,sqlSession要执行的SQL,和XML中的定义是一一对应的。这是一个模板化程度很高的代码。
简化后的UserDao
既然模板化程度很高,我们就要去解决它,原理很简单,就是前面Spring中所说的动态代理。我们可以将UserDao简化成一个接口:
packagecom.antonio.hello.mybatis.mapper; publicinterfaceUserDao{ UsergetUserById(Integerid); IntegeraddUser(Useruser); IntegeraddUser2(Useruser); IntegerdeleteUserById(Integerid); IntegerupdateUser(Useruser); ListgetAllUser(); }
使用这个接口,完全可以代替上面的UserDao,为什么呢?因为这个接口提供了UserDao所需要的最核心的东西,根据这个接口,就可以自动生成UserDao:
- 首先,UserDao中定义了SqlSessionFactory,这是一套固定的代码
- UserMapper所在的包+UserMapper类名+UserMapper中定义好的方法名,就可以定位到要调用的SQL
- 要调用SqlSession中的哪个方法,根据定位到的SQL节点就能确定
配置并使用
因此,我们在MyBatis开发中,实际上不需要自己提供UserDao的实现,我们只需要提供一个UserMapper即可。然后,我们在MyBatis的全局配置中,配置一下UserMapper:
然后,加载配置文件,获取UserMapper,并调用它里边的方法:
publicclassMain2{ publicstaticvoidmain(String[]args){ SqlSessionFactoryinstance=SqlSessionFactoryUtils.getInstance(); SqlSessionsqlSession=instance.openSession(); UserMappermapper=sqlSession.getMapper(UserMapper.class); ListallUser=mapper.getAllUser(); System.out.println(allUser); } }
注意,在Maven中,默认情况下,Maven要求我们将XML配置、properties配置等,都放在resources目录下,如果我们强行放在java目录下,默认情况下,打包的时候这个配置文件会被自动忽略掉。对于这两个问题,我们有两种解决办法:
不忽略XML配置:
我们可以在pom.xml中,添加如下配置,让Maven不要忽略我在java目录下的XML配置:
src/main/java **/*.xml src/main/resources
按照Maven的要求来
按照Maven的要求来,将xml文件放到resources目录下,但是,MyBatis中默认情况下要求,UserMapper.xml和UserMapper接口,必须放在一起,所以,我们需要手动在resources目录下,创建一个和UserMapper接口相同的目录存放UserMapper.xml。这样,我们就不需要在pom.xml文件中添加配置了,因为这种写法同时满足了Maven和MyBatis的要求。
到此这篇关于MyBatis中使用Mapper简化代码的方法的文章就介绍到这了,更多相关MyBatis使用Mapper简化代码内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!