mybatis中<>
- 作者: 网兼加569476996
- 来源: 51数据库
- 2020-09-28
<!-- 注解式事务管理 --<br><tx:annotation-driven transaction-manager="transactionManager" /<br><!-- 自动扫描 mybatis mapper接口 --<br><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"<br><property name="basePackage" value="com.test.tt.mapper" /<br><property name="sqlSessionFactory" ref="sqlSessionFactory"</property</bean<!-- 数据源2--<br><!-- proxool连接池 --<br><bean id="dataSource_d2" class="org.logicalcobwebs.proxool.ProxoolDataSource"<br><property name="alias" value="${d2.alias}" /<br><property name="driver" value="${driver}" /<br><property name="driverUrl" value="${d2.driverUrl}" /<br><property name="user" value="${d2.user}" /<br><property name="password" value="${d2.password}" /<br><property name="houseKeepingTestSql" value="${house-keeping-test-sql}" /<br><property name="maximumConnectionCount" value="${maximum-connection-count}" /<br><property name="minimumConnectionCount" value="${minimum-connection-count}" /<br><property name="prototypeCount" value="${prototype-count}" /<br><property name="simultaneousBuildThrottle" value="${simultaneous-build-throttle}" /<br><property name="trace" value="${trace}" /</bean<br><bean id="sqlSessionFactory_d2" class="org.mybatis.spring.SqlSessionFactoryBean"<br><property name="dataSource" ref="dataSource_d2" /<br><property name="configLocation" value="classpath:mybatis-d2-config.xml"</property</bean<bean id="transactionManager_d2"<br>class="org.springframework.jdbc.datasource.DataSourceTransactionManager"<br><property name="dataSource" ref="dataSource_d2" /</bean<br><!-- 注解式事务管理 --
java代码 usermapper mapper = mapperfactory.createmapper(usermapper.class, datasourceenvironment.hd); user user = mapper.getuserbyid(162l); system.out.println(user); ok,到此基本上所有的工作就完成了,以上的方式就可以支持多个数据源了。 但是代码还不够优雅,以上代码我们发现datasourceenvironment这个枚举变量在客户端,mapperfactory以及datasourceenvironment 中传来传去,我们应该尽量减少一个类对外界类的耦合,也就是不符合java编程原则中的迪米特法则。 好了,那我们来改良一下。 将mapperfactory设计成枚举策略模式: java代码 /** * mapper creator * @author boyce * @version 2014-3-28 */ public enum mapperfactory { hd { private sqlsessionfactory sqlsessionfactory; @override public t createmapper(class clazz) { return createmapper(clazz, this); } @override protected void createsqlsessionfactory() { sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream, this.name()); } @override public sqlsessionfactory getsqlsessionfactory() { return sqlsessionfactory; } }, ho { private sqlsessionfactory sqlsessionfactory; @override public t createmapper(class clazz) { return createmapper(clazz, this); } @override protected void createsqlsessionfactory() { sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream, this.name()); } @override public sqlsessionfactory getsqlsessionfactory() { return sqlsessionfactory; } }; /** * create a mapper of environment by mapper class * @param clazz mapper class * @param environment a datasource environment * @return a mapper instance */ public abstract t createmapper(class clazz); /** * create sqlsessionfactory of environment */ protected abstract void createsqlsessionfactory(); /** * get sqlsessionfactory */ public abstract sqlsessionfactory getsqlsessionfactory(); private static inputstream inputstream = null; static { try { inputstream = resources.getresourceasstream("mybatis/mybatis.xml"); ho.createsqlsessionfactory(); hd.createsqlsessionfactory(); } catch (ioexception e) { e.printstacktrace(); } finally { ioutils.closequietly(inputstream); } } @suppresswarnings("unchecked") private static t createmapper(class clazz, mapperfactory mapperfactory) { sqlsession sqlsession = mapperfactory.getsqlsessionfactory().opensession(); mapper mapper = sqlsession.getmapper(clazz); return (t)mapperproxy.bind(mapper, sqlsession); } /** * mapper proxy * executing mapper method and close sqlsession * @author boyce * @version 2014-4-9 */ private static class mapperproxy implements invocationhandler { private mapper mapper; private sqlsession sqlsession; private mapperproxy(mapper mapper, sqlsession sqlsession) { this.mapper = mapper; this.sqlsession = sqlsession; } private static mapper bind(mapper mapper, sqlsession sqlsession) { return (mapper) proxy.newproxyinstance(mapper.getclass().getclassloader(), mapper.getclass().getinterfaces(), new mapperproxy(mapper, sqlsession)); } /** * execute mapper method and finally close sqlsession */ public object invoke(object proxy, method method, object[] args) throws throwable { object object = null; try { object = method.invoke(mapper, args); } catch(exception e) { e.printstacktrace(); } finally { sqlsession.close(); } return object; } } } 客户端使用场景: java代码 usermapper mapper = mapperfactory.ho.createmapper(usermapper.class); user user = mapper.getuserbyid(162l); system.out.println(user);
java代码 usermapper mapper = mapperfactory.createmapper(usermapper.class, datasourceenvironment.hd); user user = mapper.getuserbyid(162l); system.out.println(user); ok,到此基本上所有的工作就完成了,以上的方式就可以支持多个数据源了。 但是代码还不够优雅,以上代码我们发现datasourceenvironment这个枚举变量在客户端,mapperfactory以及datasourceenvironment 中传来传去,我们应该尽量减少一个类对外界类的耦合,也就是不符合java编程原则中的迪米特法则。 好了,那我们来改良一下。 将mapperfactory设计成枚举策略模式: java代码 /** * mapper creator * @author boyce * @version 2014-3-28 */ public enum mapperfactory { hd { private sqlsessionfactory sqlsessionfactory; @override public t createmapper(class clazz) { return createmapper(clazz, this); } @override protected void createsqlsessionfactory() { sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream, this.name()); } @override public sqlsessionfactory getsqlsessionfactory() { return sqlsessionfactory; } }, ho { private sqlsessionfactory sqlsessionfactory; @override public t createmapper(class clazz) { return createmapper(clazz, this); } @override protected void createsqlsessionfactory() { sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream, this.name()); } @override public sqlsessionfactory getsqlsessionfactory() { return sqlsessionfactory; } }; /** * create a mapper of environment by mapper class * @param clazz mapper class * @param environment a datasource environment * @return a mapper instance */ public abstract t createmapper(class clazz); /** * create sqlsessionfactory of environment */ protected abstract void createsqlsessionfactory(); /** * get sqlsessionfactory */ public abstract sqlsessionfactory getsqlsessionfactory(); private static inputstream inputstream = null; static { try { inputstream = resources.getresourceasstream("mybatis/mybatis.xml"); ho.createsqlsessionfactory(); hd.createsqlsessionfactory(); } catch (ioexception e) { e.printstacktrace(); } finally { ioutils.closequietly(inputstream); } } @suppresswarnings("unchecked") private static t createmapper(class clazz, mapperfactory mapperfactory) { sqlsession sqlsession = mapperfactory.getsqlsessionfactory().opensession(); mapper mapper = sqlsession.getmapper(clazz); return (t)mapperproxy.bind(mapper, sqlsession); } /** * mapper proxy * executing mapper method and close sqlsession * @author boyce * @version 2014-4-9 */ private static class mapperproxy implements invocationhandler { private mapper mapper; private sqlsession sqlsession; private mapperproxy(mapper mapper, sqlsession sqlsession) { this.mapper = mapper; this.sqlsession = sqlsession; } private static mapper bind(mapper mapper, sqlsession sqlsession) { return (mapper) proxy.newproxyinstance(mapper.getclass().getclassloader(), mapper.getclass().getinterfaces(), new mapperproxy(mapper, sqlsession)); } /** * execute mapper method and finally close sqlsession */ public object invoke(object proxy, method method, object[] args) throws throwable { object object = null; try { object = method.invoke(mapper, args); } catch(exception e) { e.printstacktrace(); } finally { sqlsession.close(); } return object; } } } 客户端使用场景: java代码 usermapper mapper = mapperfactory.ho.createmapper(usermapper.class); user user = mapper.getuserbyid(162l); system.out.println(user);
推荐阅读
