resultset接口的方法 resultset获取数据
- 软件开发
- 2023-08-13
- 342
ibatis是如何找到dao层的介绍本质还是很简单的,原来用JDBC实现的时候,你得写各种类,类里面写好各种操作SQL的语句,现在用了XML以后,只不过是把这些信息保存...
ibatis是如何找到dao层的
介绍
本质还是很简单的,原来用JDBC实现的时候,你得写各种类,类里面写好各种操作SQL的语句,现在用了XML以后,只不过是把这些信息保存到XML中了,运行的时候还是会有类来执行SQL语句的,这个类是怎么来的呢?是Mybatis框架利用:动态代理和反射机制这2种机制,来帮你把这个类给创建出来,简单总结一下原理,你可以去看看mybatis的源码,类不多,还是比较容易理清楚的,我帮你总结一下大概流程
Mybatis的运行分为两部分,第一部分是读取配置文件缓存到Coufiguration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程。
Mybatis实现的基本原理是利用:动态代理和反射机制。动态代理中用到JDK动态代理和CGLIB代理。这两者的区别是,JDK动态代理是接口的,CGLIB代理是对于类的。Mybatis中这两种代理都用到过,Mapper中用到的是JDK动态代理,在延迟加载的时候用到CGLIB代理。
(1)构建SqlSessionFactory过程SqlSessionFactory是Mybatis的核心类,主要功能时提供创建Mybatis的核心接口SqlSession,我们需要创建SqlSessionFactory,为此我们提供配置文件和相关参数。通过SqlSessionFactoryBuilder去构建。
首先通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML文件,读取配置参数,并将读取的数据存入这个org.apache.ibatis.session.Configuration类中。其次使用Configuration对象去创建SqlSessionFactory。
(2)构建ConfigurationConfiguration的作用;
1)读取配置文件,包括基础配置的XML文件和映射器的XML文件
2)初始化基础配置,比如Mybatis的别名等,一些重要的类对象,例如,插件、映射器、ObjectFactory和typeHandler对象。
3)提供单例,为后续创建SqlSessionFactory服务并提供配置的参数。
4)执行一些重要的对象方法,初始化配置信息。
(3)映射器的内部组成一般而言映射器有三部分组成,MappedStatement、SqlSource和BoundSql。
MappedStatement:它保存了一个映射器的节点(select|delete|update)。包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、paramterType、resultType、languageDriver等重要配置信息。
SqlSource:提供BoundSql的地方,它是MappedStatement的一个属性。是一个接口,主要作用是根据参数和其它的规则组装SQL。
BoundSql:建立SQL和参数的地方。常用用用三个参数:SQL,parameterObject、parameterMappings。
(4)构建SqlSessionFactorysqlsessionFactory=newSqlSessionFactoryBuilder().build(inputStream);
(5)SqlSession运行过程
SqlSession是一个接口,使用它并不复杂。我们构建SqlSessionFactory就可以轻松容易地拿到Sqlseesion了。
1)映射器的动态代理
Mapper映射是通过动态代理来实现的。映射器的xml命名空间对应的便是这个接口的全路径,那么它根据全路径和方法名便能够绑定起来,通过动态代理技术,让这个接口跑起来。
2)SqlSession下的四大对象
映射器其实就是一个动态代理对象,进入到了MapperMethod的execute方法。它经过简单的判断就进入了SqlSession的删除、更新、插入和选择等方法。
Mapper的执行其实就是通过Executor、StatementHandler、ParameterHandler和ResultHandler来完成数据操作和结果的返回。
Executor:执行器,由它来调度StatementHandler、Parameterhandler、ResultHandler等来执行对应的SQL。
StatementHandler:使用数据的Statement执行操作,它是四大对象的核心,起到承上启下的作用。
ParameterHandler:用于SQL对参数的处理。
ResultHandler:进行最后数据集(ResultSet)的封装返回处理。
1)执行器(Executor):它是一个真正执行Java和数据交互的地方。在Mybatis中有三种执行器。SIMPLE(简单执行器,这是默认的)、REUSE(重用预处理语句)和Batch(执行重用语句和批量更新,它是针对批量专用的执行器)。
2)数据库会话器(StatementHandler):专门来处理数据库会话的。
3)参数处理器(ParameterHandler):对预编译语句进行参数处理。
4)结果处理器(ResultSetHandler):组装结果集的返回。
(5)总结SqlSession是通过Executor创建StatementHandler来运行的,而StatementHandler要经过下面的三步。Prepared预编译SQL、parametersize设置参数和query/update执行SQL。
其中parametersize是调用parameterHandler的方法去设置的,而参数是根据类型处理器typeHandler去处理。query/update方法通过resultHandler进行处理结果的封装,如果是update语句,它就返回整数,否则它就通过typeHandler处理结果类型,然后用ObjectFactory提供的规则组装对象,返回给调用者,这就是SqlSession执行的过程。
result接口详解
ResultSet接口提供了一整套的定位方法这些可以在记录集中定位的任意一行,具体有:publicbooleanabsolute(introw);该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行,参数row指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算,不是相对的行号。
executeQuery()是干什么用的实现什么功能啊
使用JDBC连接数据库需要四步,第一步加载驱动程序;
第二步,连接数据库;
第三步,访问数据库;
第四步,执行查询;其中在第四步执行查询时,要用statement类的executeQuery()方法来下达select指令以查询数据库,executeQuery()方法会把数据库响应的查询结果存放在ResultSet类对象中供我们使用。即语句:
Stringsql="select*from"+tableName;ResultSetrs=s.executeQuery(sql);
beanhandler是什么
是ResultSetHandler接口的实现,负责将第一个ResultSet行转换为JavaBean。这个类是线程安全的。
resultsetmetadata rsmd = rs.getmetadata;是什么意思
ResultSetMetaDatarsmt=rs.getMetaData();
得到结果集(rs)的结构,比如字段数、字段名等。
使用rs.getMetaData().getTableName(1))就可以返回表名
rs.getMetaData().getColumnCount()
取得列数
例子:
ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTABLE2");//得到查询结果,一个数据集
ResultSetMetaDatarsmd=rs.getMetaData();
intnumberOfColumns=rsmd.getColumnCount();//得到数据集的列数
“Execute”,的作用是什么
“Execute”是JAVA语言的一种,作用是执行动态的SQL语句或非运行时创建的PL/SQL块,动态创建和执行SQL语句。Execute语句的方法:方法executeQuery用于产生单个结果集的语句,例如SELECT语句。
被使用最多的执行SQL语句的方法是executeQuery。
这个方法被用来执行SELECT语句,它几乎是使用最多的SQL语句。
方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQLDDL(数据定义语言)语句,例如CREATETABLE和DROPTABLE。
INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。
executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。
对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零。使用executeUpdate方法是因为在createTableCoffees中的SQL语句是DDL(数据定义语言)语句。创建表,改变表,删除表都是DDL语句的例子,要用executeUpdate方法来执行。
你也可以从它的名字里看出,方法executeUpdate也被用于执行更新表SQL语句。
实际上,相对于创建表来说,executeUpdate用于更新表的时间更多,因为表只需要创建一次,但经常被更新。方法execute:用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能。execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。
当执行某个已存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
因为方法execute处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。
例如,假定已知某个过程返回两个结果集,则在使用方法execute执行该过程后,必须调用方法getResultSet获得第一个结果集,然后调用适当的getXXX方法获取其中的值。
要获得第二个结果集,需要先调用getMoreResults方法,然后再调用getResultSet方法。
如果已知某个过程返回两个更新计数,则首先调用方法getUpdateCount,然后调用getMoreResults,并再次调用getUpdateCount。
对于不知道返回内容,则情况更为复杂。
如果结果是ResultSet对象,则方法execute返回true;如果结果是Javaint,则返回false。如果返回int,则意味着结果是更新计数或执行的语句是DDL命令。在调用方法execute之后要做的第一件事情是调用getResultSet或getUpdateCount。
调用方法getResultSet可以获得两个或多个ResultSet对象中第一个对象;或调用方法getUpdateCount可以获得两个或多个更新计数中第一个更新计数的内容。豆瓣:https://www.douban.com
本文链接:http://xinin56.com/ruanjian/411.html