使用SQLMaps 进行对象关系映射

使用SQLMaps 进行对象关系映射,第1张

引论 随着Hibernate逐渐成为其他架构之首 现今的许多工作都是在对象关系(OR)映射域上进行 但是 那些对象关系映射工具有一个问题 大部分数据库管理员似乎对这些对象关系(OR)映射工具所产生的查询不放心 不幸的是 这些数据库管理员不了解 架构所产生的查询是多么的优越 并且使你的应用程序更加灵活 他们觉得随着数据库成为应用程序的主要瓶颈 应该完全控制SQL查询 以便他们能分析和调试以促进性能 但有个问题是 如果不使用对象关系(OR)映射工具 那么你将花费很多资源在书面形式上和维护低级JDBC代码 由于以下原因 每个JDBC应用程序都将含有重复代码 连接和事务管理 设置java对象为查询参数 转换SQL ResultSets 为 java 对象 生成查询字符串 iBatis 的 SQLMaps 架构帮助我们在相当大的程度上减少了正常情况下访问关系数据库的java代码的总量 它考虑到了当前三个比较关心的问题 所以它可以将一个简单的 JavaBean 对象映射到 PreparedStatement 参数和 ResultSet 值 SQLMaps 的原理其实很简单 提供一个简单的架构来提供 %的JDBC功能 这篇文章是关于如何使用 SQLMaps 架构的进阶辅导 我们将建立一个简单的 Struts 应用程序并且用 SQLMaps 配置它为开始 接着 我们将演示如何执行基本的数据库 *** 作比如 SELECT INSERT UPDATE 等等 然后 我们将演示 SQLMaps 为连接和事务管理提供的 *** 作 在最后 我们将试着使用一些高级的 SQLMaps 功能部件比如缓存和分页 SQLMaps 的基本思想 使用 SQLMaps 架构 你必须建立一个XML文件列出所有你希望在应用程序中执行的SQL查询 对于每个SQL查询 你来指定哪个java类可以交换参数和ResultSet(结果集) 在你的java代码中 如果你想要执行一个特殊的查询 你需要创建一个对象来传递查询参数和必要的条件 然后传递这个对象和查询的名字让 SQLMaps 执行 一旦查询被执行 SQLMaps 将为你指定的接受查询结果的类创建一个句柄 并且将它和数据库返回的ResultSet 中的值存储在一起 一个简单的使用SQLMaps的应用程序(Hello World) 我们将创建一个简单的Struts应用程序开始来演示什么是使用SQLMaps的应用程序所需要的 这个例子的代码是来自以下资源部分 在这个例子中 我们用一个Jsp页面要求用户输入contactId属性 一旦它被提交 我们用它在CONTACT 表中搜索一个连接 并且用另一个Jsp页面展示给用户 接下来一步一步说明 拷贝ibatis sqlmap jar 和 ibatis mon jar 到你的 web inf/lib 文件夹中 在你的java源文件夹中创建一个 SqlMapConfig xml 文件 像这样 <sqlMapConfig><settings useStatementNamespaces= false /><transactionManager type= JDBC ><dataSource type= SIMPLE ><property name= JDBC Driver value= ibm db jdbc app DB Driver /><property name= JDBC ConnectionURL value= jdbc:db :SAMPLE /><property name= JDBC Username value= db admin /><property name= JDBC Password value= admin db /></dataSource></transactionManager><sqlMap resource= Contact xml /></sqlMapConfig>SqlMapConfig xml 是SQLMaps的部署描述信息 包括以下元素 <sqlMapConfig>是文件的根元素 <settings>被用来定义应用程序级别的设置 例如 useStatementNamespaces 属性被用来定义是否要用准备说明的全限定名 它可以有一些另外的属性用于控制缓存和初始化 要知道更进一步的细节请查看文档 <transactionManager> 被用来定义你想要在你的应用程序中使用的事务管理 在我们的例程中 我们要用Connection 对象的 mit 和 rollback 方法来管理事务 所以我们用JDBC作为事项管理程序 它包含 <dataSource> 作为子元素 <dataSource>用来定义你要使用的连接管理的类型 在我们的例程中 我们要用SQLMaps自带的连接池实现 如此我们将使用一个SIMPLE类型的数据源 为了建立连接池 SQLMaps要求像JDBC驱动名称 URL 和密码这些信息 因此 我们使用<property>元素来传递这些信息 稍后 我们将更加详细地讨论各种各样可用的事务和连接管理选项 <sqlMap>元素被用来表明 SQLMap 配置文件 这些文件 如早先讨论的 列出了你希望执行的SQL查询 创建一个JavaBean类 Contact java 有属性 firstName lastName 和 contactId 和相应的get set方法 这个类将被用来向ResultSet传递查询参数并读取值 public class Contact implements Serializable{  private String firstName;  private String lastName;  private int contactId;  //Getter setter methods for firstName //lastName and contactId property} 建立一个Contact xml文件 我们将在文件中列出所有要执行的与表Contact有关的SQL查询 <sqlMap namespace= Contact ><typeAlias alias= contact type= ntact Contact / ><select id= getContact parameterClass= int resultClass= contact >select CONTACTID as contactId FIRSTNAME as firstName LASTNAME as lastName from  ADMINISTRATOR CONTACT where CONTACTID = #id#</select></sqlMap>文件中使用的标签如下 <sqlMap>是文件的根元素 正常情况下 你的应用程序将有不止一个表 由于你要把与不同表有关的查询分开成不同的名称空间(namespace) <namespace> 元素就是被用来指定在此文件中查询应被放置的名称空间 <typeAlias> 用来说明Contact 类的全限定名的一个简称 在此说明后 这个简称可以被用来替代全限定名 在SQLMaps架构中 <select> 元素用来声明SQLMaps架构中的SELECT查询 它的值就是你能指定的要执行的查询 id属性被用来指定通知SQLMaps 执行特殊查询的名称 parameterClass 被用来指定传递查询参数的类 resultClass 提供从ResultSet返回值的类的名称 在Action类的 execute() 方法内 我们建立了一个SqlMapClient的句柄 它被用来和SQLMaps相互作用 我们必须向SqlMapClientBuilder传递SqlMapConfig xml文件 它被用来读取配置设置 DynaActionForm contactForm =(DynaActionForm)form;Reader configReader =Resources getResourceAsReader( SqlMapConfig xml );SqlMapClient sqlMap =SqlMapClientBuilder buildSqlMapClient(configReader);Contact contact = (Contact)sqlMap queryForObject( getContact contactForm get( contactId ));request setAttribute( contactDetail contact);return mapping findForward( success );当你要执行一个SELECT 查询时 应该使用 SQLMaps 的 queryForObject 方法 在Contact xml文件中 我们已经指定parameterClass为int 所以我们在传递查询的名称的时候传递一个integer作为contactId (i e getContact) SQLMaps 将返回一个Contact 类的对象 基本数据库 *** 作 现在我们要返回我们的所关注的使用SQMLaps如何表示一些基本的数据库 *** 作 Insert *** 作我们从如何执行一个开始Insert *** 作开始 <insert id= insertContact parameterClass= contact >INSERT INTO ADMINISTRATOR CONTACT( CONTACTID FIRSTNAME LASTNAME)VALUES(#contactId# #firstName# #lastName#);</insert><insert> 元素被用来声明一个Insert的SQL查询 它有一个parameterClass 属性用来指明哪个JavaBean类将被用来传递(request)请求参数 在插入新的记录时 我们要使用contactId属性的值 所以我们必须在SQL查询中使用一个#contactId# public void contactInsert() throws SQLException IOException {sqlMap startTransaction();try {sqlMap startTransaction();Contact contact = new Contact();contact setContactId( );contact setFirstName( John );contact setLastName( Doe );sqlMap insert( insertContact contact);mitTransaction();} finally{sqlMap endTransaction();}}在我们的java代码中 我们建立了一个Contact 对象 存放它的值 然后调用sqlMap insert()方法 传递我们要执行的查询的名称和 Contact 这个方法将插入一个新的Contact并且返回新插入的Contact的主键 缺省情况下 SQLMaps 把每个DML方法当作工作的一个单元 但是你能使用 startTransaction mitTransaction 和 endTransaction 方法来划分事务处理 通过调用 startTransaction() 方法你可以启动一个事务处理 此方法也能从连接池中获得一个连接 在这个事务中 这个连接对象将被用来执行查询 如果这个事务的所有查询都被成功执行 应该调用 mitTransaction 方法提交你的改动 不考虑你的事务成功与否 lishixinzhi/Article/program/Java/gj/201311/27482

1、模式模式又称概念模式或逻辑模式,对应于概念级

它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)

它是由数据库管理系统提供的数据模式描述语言(DataDescriptionLanguage,DDL)来描述、定义的,体现、反映了数据库系统的整体观

2、外模式外模式又称子模式,对应于用户级

它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示

外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据

用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据 *** 纵语言(DataLanguage,DML)对这些数据记录进行

外模式反映了数据库的用户观

3、内模式内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式翱物理结构,对应着实际存储在外存储介质上的数据库

内模式由内模式描述语言来描述、定义,它是数据库的存储观

在一个数据库系统中,只有唯一的数据库,因而作为定义、描述数据库存储结构的内模式和定义、描述数据库逻辑结构的模式,也是惟一的,但建立在数据库系统之上的应用则是非常广泛、多样的,所以对应的外模式不是惟一的,也不可能是惟一的

三级模式间的映射数据库的三级模式是数据库在三个级别(层次)上的抽象,使用户能够逻辑地、抽象地处理数据而不必关心数据在计算机中的物理表示和存储

实际上,对于一个数据库系统而言一有物理级数据库是客观存在的,它是进行数据库 *** 作的基础,概念级数据库中不过是物理数据库的一种逻辑的、抽象的描述(即模式),用户级数据库则是用户与数据库的接口,它是概念级数据库的一个子集(外模式)

用户应用程序根据外模式进行数据 *** 作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系,将外模式与模式联系起来,当模式发生改变时,只要改变其映射,就可以使外模式保持不变,对应的应用程序也可保持不变;另一方面,通过模式一内模式映射,定义建立数据的逻辑结构(模式)与存储结构(内模式)间的对应关系,当数据的存储结构发生变化时,只需改变模式一内模式映射,就能保持模式不变,因此应用程序也可以保持不变

用xml配置时就需要每建一个表就hibernate-cfg-xml里加入它的映射。如果不用加入此代码就实现映射就要用注解的方式,系统会根据你的注解自动映射对应的数据表,实现几乎xml文件的零配置。

例如:

@Entity

@Table(name="user_info") //这个注解表明这个类对应数据表user_info

public class UserInfo implements Serializable{

//这里是mysql数据库的配置例子,相关配置请查阅相关资料

@Id

@Basic(optional=false)

@GeneratedValue(strategy=GenerationTypeIDENTITY)

//这个类是一个POJO(简单java对象),相当于对数据表的一个映射,定义每个数据表的字段,

//并提供getter,setter方法。假如user_info有name,sex两个字段

private String name;

private String sex;

public String getName(){

return name;

}

public void setName(String name){

thisname=name;

}

//sex属性同上

}

在hibernate的xml映射文件中可以配置实体属性与数据库字段间的对应关系。如下:

<property name="salary" precision="2" scale="10" length="255"

column="salary" type="string" update="true" insert="true"

lazy="false" unique="false" not-null="false">

</property>

前提是你数据源配置正确

映射文件中:

注意看class属性:

name是你的model类(包名+类名)

table是你数据库里的表名

catalog是你的数据库名

<hibernate-mapping>

<class name="comcwxmodelXsb" table="XSB" schema="dbo" catalog="XSCJ">

</class>

</hibernate-mapping>

10、SQL Server 2000 使用 *** 作系统文件映射数据库,这些文件都有哪些? 1、主要数据文件:主要用于存储数据,也包含数据库的启动信息。 (2 分) 2、次要数据文件:这些文件含有不能置于主要数据库文件中的所有数据。 (2 分) 3、事务日志:这些文件包含恢复数据库的日志信息。 (1 分)

库。 通常使用以下两种方法来映射继承关系: 1)将基类映射到一张表,每个子类映射到一张表。在基类对应的表中定义主键,而在 子类对应的表中定义外键。 2)将每个子类映射到一张表,没有基类表。在每个子类的表中包括基类的所有属性。 这种方法适用于子类的个数不多,基类属性比较少的情况。

以上就是关于使用SQLMaps 进行对象关系映射全部的内容,包括:使用SQLMaps 进行对象关系映射、数据库三级映射是什么、mapper配置数据库是set类型的数据怎么配置映射关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9532314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存