一、概要
从前面两个例子(JDBC和MyBatis )来说,明明操作并不复杂,为什么要那么麻烦地用MyBatis替换JDBC呢? 这简要总结了使用MyBatis代替JDBC的优点和缺点。
1 ) MyBatis封装了JDBC,优化了连接的获得和释放。 虽然可以隐藏jbc的繁杂和代码的重复,但是如果系统简单的话就不存在使用MyBatis的好处了。
2 ) MyBatis使用对象操作数据库,简化数据库和Java代码之间的转换过程,降低开发者学习数据库的难度;
3 )屏蔽不同数据库之间的差别化。 生成动态SQL。
4 ) MyBatis提供1级和2级缓存(需要配置为打开)、强大的动态sql、自动化的会话管理,比手工维护更方便、更安全。
当然,用MyBatis替换JDBC操作也是要付出成本的。 也就是说,性能不如本机JDBC高。
2、引入反射
在上例中,您可以看到JDBC需要检查一个字段,然后逐一检索。 在正式系统上使用时,需要在返回页面之前处理ResultSet,使用起来非常麻烦。 请看下面的例子。
从这个例子可以看出,在数据有很多列的情况下,我们的操作非常麻烦。 此外,代码还有利于重用,给工作带来不必要的重复。 通过使用Java的反射,可以很容易地处理这段代码的一部分。
当然,在此讨论之前,请先了解ResultSetMetaData (结果集中的元数据)。 使用它可以简化结果集的处理。 使用ResultSetMetaData后,可以按如下方式简化上面视频中的代码:
resultsetmetadatarsmd=RS.get元数据(; int count=rsmd.getColumnCount (; while(RS.next ) ) {地图,对象线=新地图}; //line.put (用户),RS.getstring ) )用户); 可以向//map添加所有数据列//此处省略添加。 使用mysql库的用户表//line.put(‘host )、RS.getstring )。 //以上的代码可以替换为如下的for(intI=1; I=计数; I )字符串列名=rsmd.getcolumn名称(I; line.put (列名,RS.getobject(I ); 列表添加(线); }
当然,在这些代码中,返回的只有Map,它可以解决大多数问题,但在实际的业务系统中,为了替换Map,需要使用更明确的Java对象。 有没有办法修改上面的代码,将返回的Map返回给User对象? 方法当然有。 请看下面的代码。
首先定义用户对象
公共类用户{私有测试用户}; 私有身份验证字符串; //此处不定义过多的字段。 公共字符串获取器() {返回用户; 公共语音用户(字符串用户) { this.user=用户; }公共认证字符串() {返回认证字符串; } publicvoidsetauthenticationstring (stringauthenticationstring ) this.authenticationstring=认证; }
然后,从结果集中检索数据并将其转换为User,如下所示: try { stmt=连接.创建语句(; RS=stmt .执行查询(SQL; //resultsetmetadatarsmd=RS.get元数据(; //int count=rsmd.getColumnCount (; while(RS.next ) ) {地图,对象线=新地图}; //line.put (用户),RS.getstring ) )用户); 可以向//map添加所有数据列/////此处省略添加。 使用mysql库中的用户表//line.put (“主机”,RS.getstring )。 //以上的代码可以如下替换//for(intI=1; I=计数; I )//字符串列名称=rsmd.getcolumn名称(I; //line.put (列名,RS.getobject(I ); //}用户用户=新用户(; 用户. setuser (用户获取) )用户); 用户.身份验证字符串(RS .获取字符串)身份验证_字符串); 添加(用户; //list.add (线路); 缓存(表达式) { e .打印堆栈跟踪}; 更新(连接、stmt、rs ); }
从上面的代码中可以看到,返回的结果正一步步向MyBatis靠近(当然这是MyBatis这边的)。 在下一部分学习反射后,重新改造该业务代码,使其成为更接近myBatis的轻量级持久层框架。
下一部分:反射