`
阅读更多

准备使用 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 接口,以备应用的进一步扩展。

 

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

 

静态变量:线程非安全。

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

 

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

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

局部变量:线程安全。

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

 

 

 

分享到:
评论

相关推荐

    用excel制作排序动画算法vba源码

    用excel制作排序动画算法vba源码

    ACM、NOI 和 CSP 比赛的经验,基本背景介绍

    ACM、NOI 和 CSP 比赛的经验,基本背景介绍

    高分springboot毕设+vue候鸟监测数据管理系统-Java源码.zip

    本项目是一个基于Spring Boot和Vue.js的候鸟监测数据管理系统,旨在提供一个高效、便捷的平台,用于收集、存储、分析和展示候鸟迁徙数据。项目的主要功能包括实时数据采集、数据分析、数据可视化以及用户管理。通过使用Spring Boot框架,后端实现了强大的数据处理能力和稳定的API服务,确保了系统的高性能和高可用性。前端则采用Vue.js框架,提供了友好的用户界面和流畅的用户体验。 系统能够实时接收来自不同监测点的数据,并通过大数据分析技术,自动识别候鸟的种类和迁徙路径。数据分析模块还提供了多种统计图表,帮助研究人员直观地理解数据背后的趋势和模式。此外,系统还具备用户权限管理功能,确保不同级别的用户只能访问相应的功能和数据。 开发此项目的目的是为了满足学术研究和实际应用的需求,同时为计算机相关专业的学生提供一个完整的实战案例,帮助他们更好地理解和应用现代软件开发技术。

    智慧餐厅点餐管理系统ssm.zip

    基于SSM的毕业设计源码

    基于java的网上报名系统SSM.zip

    基于SSM的毕业设计源码

    校园短期闲置资源置换平台--论文.zip

    基于SSM的毕业设计源码

    金华学校社团管理系统的开发与实现ssm.zip

    基于SSM的毕业设计源码

    图像对抗样本检测综述,图像对抗样本检测综述

    图像对抗样本检测综述

    就业信息管理系统.zip

    基于springboot的毕业设计源码

    技术资料分享STM32F102x8B-DS-CH-V2很好的技术资料.zip

    技术资料分享STM32F102x8B_DS_CH_V2很好的技术资料.zip

    技术资料分享sd卡协议(物理层)很好的技术资料.zip

    技术资料分享sd卡协议(物理层)很好的技术资料.zip

    ssm员工在线知识培训考试平台.zip

    基于SSM的毕业设计源码

    解决 pip 安装过程中出现的SyntaxError invalid syntax错误技巧

    内容概要:当遇到‘pip install xxx’命令时出现 SyntaxError: invalid syntax 错误时,文中总结了多个可能的原因以及解决方案,包括确认命令执行环境、Python 与 pip 版本一致性检查、正确安装 pip、确保命令格式无误、使用虚拟环境规避版本冲突、合理使用代理与镜像源加快下载等问题。 适合人群:适用于有一定 Python 开发经验,尤其是经常需要利用 pip 安装外部库的技术工作者。 使用场景及目标:旨在帮助开发者快速诊断并修复在 pip 安装过程中可能出现的各种 SyntaxError 类型的异常,提高工作效率和项目稳定性。 其他说明:文档还提供了几个典型的报错实例及其对应的解决策略,有助于深入理解常见问题背后的具体机制。同时强调,在解决问题前要先排除自身操作失误的可能性,比如是否不小心在 Python 解释器内部运行了本来应当在外壳命令行下执行的操作等基本常识点也是不可忽视的重要方面。

    Mysql高可用部署文档+Mysql安装包

    mysql安装

    map_mode_escape_1.28.13.12700.pak

    map_mode_escape_1.28.13.12700.pak

    基于springboot+mybatis+mysql+redis实现购物商城前后台管理系统【含源码+数据库】

    一、系统说明 基于springboot开发的轻量级单体架构购物商城网站,并分为用户、商户、后台三大模块。基于springboot开发的轻量级单体架构购物商城网站,并分为用户、商户、后台三大模块。 用户模块能够进行商品搜索浏览、在线下单、微信支付等功能; 商户模块则可以对收益情况以及订单成交情况进行查看、并且可对商品进行上下架和增加删除等操作; 后台模块可进行群发消息通知、RBAC权限管理、商户的停用启用以及商城的广告海报设置等功能 二、功能描述 1、前台模块 登录页面 商城主页 我的账户 系统消息 购买记录 购物车 商品详情 店铺页面 搜索结果 下单页面 支付页面 商户主页 店铺相关 商品相关 优惠相关 会员相关 订单相关 2、后台模块 登录页面 后台主页 广告设置 订单列表 商户相关 会员相关 权限管理等

    macOS_Sequoia_15.1.password(imacos.top).rdr.split.019

    macOS_Sequoia_15.1.password(imacos.top).rdr.split.019

    MySQL 5.7从入门到精通 第20章 MySQL管理利器——MySQL Utilities 共5页.pptx

    【课程大纲】 第1章 初始MySQL 共19页.pptx 第2章 MySQL的安装与配置 共14页.pptx 第3章 数据库的基本操作 共11页.pptx 第4章 数据表的基本操作 共26页.pptx 第5章 数据类型和运算符 共17页.pptx 第6章 MySQL函数 共76页.pptx 第7章 查询数据 共48页.pptx 第8章 插入、更新与删除数据 共10页.pptx 第9章 索引 共11页.pptx 第10章 存储过程和函数 共19页.pptx 第11章 视图 共20页.pptx 第12章 触发器 共11页.pptx 第13章 用户管理 共25页.pptx 第14章 数据备份与还原 共21页.pptx 第15章 MySQL日志 共22页.pptx 第16章 性能优化 共18页.pptx 第17章 MySQL Workbench5.2 的使用 共15页.pptx 第18章 MySQL Replication 共27页.pptx 第19章 MySQL Cluster 共49页.pptx 第20章 MySQL管理利器——MySQL Utilities 共5页.pptx 第21章 读写分离的利器——MySQL Proxy 共5页.pptx 第22章 PHP操作MySQL数据库 共7页.pptx 第23章 新闻发布系统数据库设计 共6页.pptx 第24章 论坛管理系统数据库设计 共6页.pptx

    HBase 安装与基本操作指南

    内容概要:本文档详述了HBase的安装流程及基本操作方法,涵盖安装的前提条件、具体步骤和常用数据处理操作,帮助开发者理解和掌握HBase的使用技巧。 适合人群:对NoSQL数据库感兴趣的软件开发者和技术爱好者。 使用场景及目标:适用于希望部署个人开发测试环境,或在小规模生产环境中采用HBase作为数据存储解决方案的技术人员。 其他说明:文档不仅介绍了如何安装配置HBase,还展示了HBase命令行界面的基本操作,如创建、插入、检索、更新和删除记录等功能。

    高分springboot毕设+vue家政预约平台的设计与实现-Java源码.zip

    本项目是一个基于Spring Boot和Vue的家政预约平台设计与实现,旨在提供一个高效、便捷的家政服务预约系统。项目的主要目标是通过现代化的技术手段,优化家政服务的预约流程,提升用户体验,并为家政服务提供者提供一个管理订单和客户信息的有效工具。 在功能方面,该平台允许用户浏览不同类型的家政服务,如保洁、月嫂、家教等,并根据需求进行在线预约。系统支持用户注册与登录,个性化服务推荐,以及预约确认和支付功能。此外,家政服务提供者可以通过后台管理系统查看和处理预约请求,管理个人信息和服务介绍。 技术实现上,后端采用Spring Boot框架,确保系统的稳定性和高效性,前端则使用Vue.js构建用户友好的界面。这种前后端分离的架构设计不仅提高了开发效率,也便于系统的维护和升级。 本项目的开发不仅是为了完成一项毕业设计,更是为了通过实际操作加深对Java及相关Web开发技术的理解,适合计算机相关专业学生及Java学习者作为实战练习的项目。

Global site tag (gtag.js) - Google Analytics