`
阅读更多

准备使用 SQL Map
SQL Map 架构能应用于设计不好的数据库模型甚至是设计不好的对象模型。尽管如此,
您在设计数据库模型和对象模型时,还是应该遵循最佳的设计原则。这样,您会获得更好的
性能和更简洁清晰的设计方案。
设计最容易开始的地方是分析应用的业务逻辑。分析什么是应用的业务对象,什么是数
据模型以及两者之间的关系。作为快速入门第一个例子,我们使用一个简单的 Java Bean
Person 类。

 

Person.java  
package examples.domain; //imports implied…. public class Person { private int id; private String firstName; private String lastName; private Date birthDate; private double weightInKilograms; private double heightInMeters; public int getId () { return id; } 

 Person 类有了,如何将 Person 类映射成数据表呢?SQL Map 对 Java Bean 和数据表之间
的关系没有限制,如一个数据表映射成一个 Java Bean,或多个表映射成一个 Java Bean,或
多个 Java Bean 映射成一个数据表等。因为使用 SQL Map 您可以充分发挥 SQL 语句的全部
潜力而很少限制。下面这个例子,我们使用一个简单的表,将一个表映射成一个 Java Bean,
Java Bean 和表是一对一的关系。 

Person.sql  
CREATE TABLE PERSON( PER_ID NUMBER (5, 0) NOT NULL, PER_FIRST_NAME VARCHAR (40) NOT NULL, PER_LAST_NAME VARCHAR (40) NOT NULL, PER_BIRTH_DATE DATETIME , PER_WEIGHT_KG NUMBER (4, 2) NOT NULL, PER_HEIGHT_M NUMBER (4, 2) NOT NULL, PRIMARY KEY (PER_ID) )  

 SQL Map 的配置文件
现在准备好了学习环境,让我们从学习 SQL Map 的配置文件开始,配置文件是 SQL
MAP 的配置信息统一设置的地方。
SQL Map 配置文件是 XML 文件,我们可以它设置各种属性,JDBC DataSource 和 SQL
Map。在配置文件中,可以方便地统一配置 DataSource 不同的实现。SQL Map 框架包括
DataSource 的 iBATIS 实现:SimpleDataSource 类, Jakarta DBCP(Commons),和可通过 JNDI
上下文查找的 DataSource(即应用服务器中的 DataSource)。详细的使用方法在以后的章节
讨论。在本例中,我们使用 Jakarta DBCP。对于上面的例子,配置非常简单,如下所示:

数据源名称(data source name,DSN)是包含了有关某个特定数据库信息的数据结构,这个信息是开放式数据库连接驱动能够连接到数据库上必需的信息。DSN存储在注册表或作为一个单独的文本文件,DSN里面包含的信息有名称、目录和数据库驱动器,以及用户ID和密码(根据DSN的类型)。开发人员为每个数据库创建一个独立的DSN。为了连接到某个数据库,开发人员需要在程序中指定DSN。相反,没有DSN的连接则需要在程序中指定所有必要的信息。

 

大多数的应用不仅需要从数据库中读取数据,还需要修改数据。我们已有了一个
SELECT 查询语句的 mapped statement 简单例子,下面看看 INSERT,UPDATE 和 DELETE
的 mapped statement 什么样子。幸运的是,它们其实没什么区别。接下来,我们完成 Person
SQL Map 其他部分,以实现修改数据的功能。

 

写道
Person.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Person"> <!-- Use primitive wrapper type (e.g. Integer) as parameter and allow results to be auto-mapped results to Person object (Java Bean) properties --> <select id="getPerson" parameterClass=”int” resultClass="examples.domain.Person"> SELECT PER_ID as id, PER_FIRST_NAME as firstName, PER_LAST_NAME as lastName, PER_BIRTH_DATE as birthDate, PER_WEIGHT_KG as weightInKilograms, PER_HEIGHT_M as heightInMeters FROM PERSON WHERE PER_ID = #value# </select>
<!-- Use Person object (Java Bean) properties as parameters for insert. Each of the parameters in the #hash# symbols is a Java Beans property. --> <insert id="insertPerson" parameterClass="examples.domain.Person"> INSERT INTO PERSON (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) VALUES (#id#, #firstName#, #lastName#, #birthDate#, #weightInKilograms#, #heightInMeters#) </insert>
<!-- Use Person object (Java Bean) properties as parameters for update. Each of the parameters in the #hash# symbols is a Java Beans property. --> <update id="updatePerson" parameterClass="examples.domain.Person"> UPDATE PERSON SET PER_FIRST_NAME = #firstName#, PER_LAST_NAME = #lastName#, PER_BIRTH_DATE = #birthDate#, PER_WEIGHT_KG = #weightInKilograms#, PER_HEIGHT_M = #heightInMeters# WHERE PER_ID = #id# </update>
<!-- Use Person object (Java Bean) “id” properties as parameters for delete. Each of the parameters in the #hash# symbols is a Java Beans property. --> <delete id="deletePerson" parameterClass="examples.domain.Person"> DELETE PERSON WHERE PER_ID = #id# </delete>

 

好了,我们完成了所有的配置文件和映射文件,就剩下的应用的编码工作了。首先要设
置SQL Map,读入刚创建好的SQL Map XML配置文件。为简化这个工作,可以使用SQL Map
架构中提供的 Resources 类。
String resource = “com/ibatis/example/sql-map-config.xml”; Reader reader = Resources.getResourceAsReader (resource); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
以上的 SqlMapClient 对象是线程安全,并且应持久生存。对于一个特定的应用,只需
进行一次 SqlMap 配置。因此,它可以作为基类的一个静态对象(即 DAO 对象的基类),或
者,如果您想让它有更大的作用范围,可以把它封装在方便使用的类中。例如:

写道
public class MyAppSqlConfig { private static final SqlMapClient sqlMap; static { try { String resource = “com/ibatis/example/sql-map-config.xml”; Reader reader = Resources.getResourceAsReader (resource); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (Exception e) { // If you get an error at this point, it matters little what it was. It is going to be // unrecoverable and we will want the app to blow up good so we are aware of the // problem. You should always log such errors and re-throw them in such a way that // you can be made immediately aware of the problem. e.printStackTrace(); throw new RuntimeException (“Error initializing MyAppSqlConfig class. Cause: ”+e); }
} public static getSqlMapInstance () { return sqlMap; }
}

 从数据库读取对象
既然 SqlMap 对象已完成初始化,就可以方便地使用它了。首先,我们用它从数据库中
读取一个 Person 对象。(在本例中,假设 PERSON 表中已存在 10 条记录,PER_ID 从 1 到
10)。
要从数据库中得到一个 Person 对象,只需要 SqlMap 实例,mapped statement 的名字和
一个 Person ID 号。让我们读入 PER_ID 是 5 的 Person 对象。
… SqlMapClient sqlMap = MyAppSqlMapConfig.getSqlMapInstance(); // as coded above … Integer personPk = new Integer(5); Person person = (Person) sqlMap.queryForObject (“getPerson”, personPk);

 

把对象写入数据库
现在已有了一个从数据库中读出的Person对象,接着修改Person对象的height和weight
属性,并将它写入数据库。
… person.setHeightInMeters(1.83); // person as read from the database above person.setWeightInKilograms(86.36); … sqlMap.update(“updatePerson”, person);

 

类似地,也可以创建一个新的 Person 对象。
Person newPerson = new Person(); newPerson.setId(11); // you would normally get the ID from a sequence or custom table newPerson.setFirstName(“Clinton”); newPerson.setLastName(“Begin”); newPerson.setBirthDate (null); newPerson.setHeightInMeters(1.83); newPerson.setWeightInKilograms(86.36); … sqlMap.insert (“insertPerson”, newPerson);

 

快速入门结束了,接下来就要考虑一些新手喜欢出现的错误

1) 在 parameterMap 和 resultMap 中,字段数据类型是 java.sql.Types 类定义的常量名
称。常用的数据类型包括 BLOB,CHAR,CLOB,DATE,LONGVARBINARY,
INTEGER,NULL,NUMERIC,TIME,TIMESTAMP 和 VARCHAR 等。
2) 对于数据表中 NULLBALE 的字段,必须在 parameterMap 和 resultMap 中指定字段
的数据类型。
3) 对于数据类型是 DATE,CLOB 或 BLOB 的字段,最好在 parameterMap 和 resultMap
中指定数据类型。
4) 对于二进制类型的数据,可以将 LONGVARBINARY 映射成 byte[]。
5) 对于文本类型较大的数据,可以将 CLOB 映射成 String。
6) Java Bean 必须拥有缺省的构造器(即无参数的构造器)。
7) Java Bean 最好实现 Serializable 接口,以备应用的进一步扩展。

 

补充:线程安全:线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。 

 

静态变量:线程非安全。

静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

 

实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。

实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

局部变量:线程安全。

每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

 

 

 

分享到:
评论

相关推荐

    iBatis文档

    这个压缩包包含了关于iBatis 2.0的开发文档,对于理解并使用iBatis进行数据操作具有重要的参考价值。 `iBatis_to_MyBatis.html` 文件可能是一个关于iBatis到MyBatis转型的指南。MyBatis是iBatis的后续版本,它在...

    ibatis api,ibatis文档,ibatis说明文档

    Ibatis文档是学习和解决问题的重要资源,它包含了详细的API参考、配置指南、最佳实践和常见问题解答。通过阅读文档,你可以了解如何配置Ibatis、创建Mapper接口和XML映射文件,以及如何处理复杂的查询和关联。 在...

    SPRING JAVA IBATIS文档

    SPRING JAVA IBATIS文档 SPRING JAVA IBATIS文档 SPRING JAVA IBATIS文档 SPRING JAVA IBATIS文档 SPRING JAVA IBATIS文档

    Spring 整合 iBATIS 文档 详解 加 源代码

    《Spring 整合 iBATIS 全面指南》 在Java企业级开发中,Spring框架以其强大的功能和...《Spring整合iBATIS文档详解》和提供的源代码是学习这一主题的宝贵资源,建议读者仔细研读,亲手实践,以提升自己的开发技能。

    ibatis文档及demo

    综上所述,Ibatis文档及demo包含的内容广泛,涵盖了Ibatis的基本概念、配置、SQL映射、参数映射、结果集映射、动态SQL、映射器接口、MyBatis Generator的使用、缓存机制以及事务管理等多个方面。学习并理解这些知识...

    ibatis 文档查询

    【标题】:深入理解iBATIS的查询机制 【描述】:本文将详细解析iBATIS框架中的查询功能,包括处理复杂对象关系、XML映射和数据集操作,旨在帮助开发者充分利用iBATIS进行高效数据库操作。 【标签】:iBATIS、查询...

    Ibatis文档

    这个名为"Ibatis文档"的压缩包包含了关于Ibatis的详细配置信息,非常适合初学者学习和参考。以下是对Ibatis及其核心概念的深入解析。 **1. 概述** Ibatis 是一个SQL映射框架,它将SQL语句与Java代码分离,允许...

    ibatis 文档

    通过阅读并实践这个压缩包中的Ibatis文档,你可以深入了解如何配置和使用Ibatis,掌握如何设计和编写SQL映射文件,以及如何在实际项目中整合Ibatis与Spring等其他框架。此外,中英文资料的结合有助于更好地理解和...

    iBatis文档\ibatis.doc

    本文档将详细讲解iBatis的核心概念、快速入门以及高级特性。 ### iBatis 快速启动 #### 准备工作 在开始使用iBatis之前,确保你已经安装了Java运行环境,并配置了相应的JDBC驱动,这将使iBatis能够与数据库进行...

    ibatis官方中文文档

    《iBatis官方中文文档》是开发者们学习和掌握iBatis框架的重要参考资料,它包含了iBatis的详细使用说明和一系列技术要点。iBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,极大地提高了...

    spring+ibatis集成文档

    ### Spring与iBatis集成开发详解 #### 一、引言 在Java企业级应用开发领域,Spring框架因其强大的依赖注入(DI)和面向切面编程(AOP)能力而备受青睐;而iBatis(现称为MyBatis)则以其简洁的SQL映射功能而闻名。...

    ibatis api 帮助文档+IBATIS 开发文档

    **IBATIS API 帮助文档与IBATIS开发文档详解** IBATIS,一个由iBATIS公司开发的开源持久层框架,是Java世界中广泛使用的数据访问接口(DAO)工具。它允许开发者将SQL语句直接写在XML配置文件中,实现了SQL与Java...

    我的ibatis文档

    【压缩包子文件的文件名称列表】: "IBATIS",这个文件名可能代表了整个MyBatis框架的源码或者是一份详细的MyBatis教程文档。如果是一个源码文件,读者可以深入研究其内部结构,理解每一个类和方法的作用。如果是文档...

    iBatis的中文文档和英文文档

    iBatis文档包含了详细的使用指南、API参考以及最佳实践,对于学习和使用iBatis至关重要。 《iBATIS-SqlMaps-2_en.pdf》是iBatis 2的英文官方文档,涵盖了以下主要知识点: 1. **介绍**:讲解iBatis的基本理念,...

Global site tag (gtag.js) - Google Analytics