jPetStore 源码分析
来源:互联网 发布:讲故事软件 编辑:程序博客网 时间:2024/05/29 10:55
jPetStore 源码分析
jPetStore 作为ibatis的一个成功实例,此刻我们就来分析下它的结构
下面这个类是dao的初始化类,开始的静态块负责把数据库建立
...
private static final String resource = "com/ibatis/jpetstore/persistence/dao.xml";
private static final DaoManager daoManager;
static {
try {
daoManager = newDaoManager(null);
Properties props = Resources.getResourceAsProperties("properties/database.properties");
String url = props.getProperty("url");
String driver = props.getProperty("driver");
String username = props.getProperty("username");
String password = props.getProperty("password");
if (url.equals("jdbc:hsqldb:mem:jpetstore")) {
Class.forName(driver).newInstance();
Connection conn = DriverManager.getConnection(url, username, password);
try {
ScriptRunner runner = new ScriptRunner(conn, false, false);
runner.setErrorLogWriter(null);
runner.setLogWriter(null);
runner.runScript(Resources.getResourceAsReader("ddl/hsql/jpetstore-hsqldb-schema.sql"));
runner.runScript(Resources.getResourceAsReader("ddl/hsql/jpetstore-hsqldb-dataload.sql"));
} finally {
conn.close();
}
}
} catch (Exception e) {
throw new RuntimeException("Description. Cause: " + e, e);
}
}
public static DaoManager getDaoManager() {
return daoManager;
}
public static DaoManager newDaoManager(Properties props) {
try {
Reader reader = Resources.getResourceAsReader(resource);
return DaoManagerBuilder.buildDaoManager(reader, props);
} catch (Exception e) {
throw new RuntimeException("Could not initialize DaoConfig. Cause: " + e, e);
}
}
}
静态方法newDaoManager是读取dao.xml中的配置创建DaoManagerBuilder对象实例
在service层通过类似如下的语句来生产数据操作对象:
DaoManager daoMgr = DaoConfig.getDaoManager();
this.accountDao = (AccountDao) daoMgr.getDao(AccountDao.class);
AccountDao是一个数据库操作接口
这些类包括在ibatis-dao-2.jar中
在dao层通过调用template包中的一些类如:
queryForObject("getAccountByUsernameAndPassword", account);
其中getAccountByUsernameAndPassword是映射文件中配置的sql的名称,account是
配置中规定的查询条件封装类实例
下面我们来看看配置文件
<!DOCTYPE daoConfig
PUBLIC "-//ibatis.apache.org//DTD DAO Configuration 2.0//EN"
"http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
<context>
<transactionManager type="SQLMAP">
<property name="SqlMapConfigResource"
value="com/ibatis/jpetstore/persistence/sqlmapdao/sql/sql-map-config.xml"/>
</transactionManager>
<dao interface="com.ibatis.jpetstore.persistence.iface.ItemDao"
implementation="com.ibatis.jpetstore.persistence.sqlmapdao.ItemSqlMapDao"/>
<dao interface="com.ibatis.jpetstore.persistence.iface.SequenceDao"
implementation="com.ibatis.jpetstore.persistence.sqlmapdao.SequenceSqlMapDao"/>
<dao interface="com.ibatis.jpetstore.persistence.iface.AccountDao"
implementation="com.ibatis.jpetstore.persistence.sqlmapdao.AccountSqlMapDao"/>
<dao interface="com.ibatis.jpetstore.persistence.iface.CategoryDao"
implementation="com.ibatis.jpetstore.persistence.sqlmapdao.CategorySqlMapDao"/>
<dao interface="com.ibatis.jpetstore.persistence.iface.ProductDao"
implementation="com.ibatis.jpetstore.persistence.sqlmapdao.ProductSqlMapDao"/>
<dao interface="com.ibatis.jpetstore.persistence.iface.OrderDao"
implementation="com.ibatis.jpetstore.persistence.sqlmapdao.OrderSqlMapDao"/>
</context>
</daoConfig>
这是dao.xml。它在初始化DaoManagerBuilder时被调用
<transactionManager type="SQLMAP">
<property name="SqlMapConfigResource"
value="com/ibatis/jpetstore/persistence/sqlmapdao/sql/sql-map-config.xml"/>
</transactionManager>
...
引用了sql-map-config.xml配置文件
其他的配置项是对dao接口以及实现类的描述
现在我们把视线跳转到ibatis的sql-map-config.xml配置上来
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="properties/database.properties"/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property value="${driver}" name="JDBC.Driver"/>
<property value="${url}" name="JDBC.ConnectionURL"/>
<property value="${username}" name="JDBC.Username"/>
<property value="${password}" name="JDBC.Password"/>
</dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/Account.xml"/>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/Category.xml"/>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/Product.xml"/>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/Sequence.xml"/>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/LineItem.xml"/>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/Order.xml"/>
<sqlMap resource="com/ibatis/jpetstore/persistence/sqlmapdao/sql/Item.xml"/>
</sqlMapConfig>
在<transactionManager type="JDBC">配置项中配置采用通过传统JDBC commit/rollback实现事务支持
dataSource中配置的是所用的连接池类型
SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的
数据库连接池机制, 对应ibatis 实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。
sqlMap节点是配置具体dao的映射引用
以下是Account类的sql映射配置片段
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Account">
<typeAlias alias="account" type="com.ibatis.jpetstore.domain.Account"/>
...
<update id="updateAccount" parameterClass="account">
UPDATE ACCOUNT SET
EMAIL = #email#,
FIRSTNAME = #firstName#,
LASTNAME = #lastName#,
STATUS = #status#,
ADDR1 = #address1#,
ADDR2 = #address2:VARCHAR#,
CITY = #city#,
STATE = #state#,
ZIP = #zip#,
COUNTRY = #country#,
PHONE = #phone#
WHERE USERID = #username#
</update>
...
再#之间内容与pojo类的属性对应
由于ibatis采用的是“半自动化”的ORM机制,所以具体的sql语句需要自己编写。这样
sql的优化也是自己来完成的。这样对sql性能要求较高的系统是个好消息。
- jPetStore 源码分析
- Spring例子JPetStore分析---------1
- Spring例子JPetStore分析---------2
- jpetstore
- 学习Spring附带源码jpetstore安装配置
- 基于Spring例子的JPetStore分析
- Jpetstore研究(二)配置文件分析
- Spring例子JPetStore分析---------3jpetstore的各层之间的关系部分分析
- 学习Spring 附带源码jpetstore 一 安装配置篇
- 分析和学习Spring中的jpetstore用户管理
- Spring自带的JPetStore分析(一)
- Spring自带的JPetStore分析(二)
- Spring自带的JPetStore分析(三)
- Spring自带的JPetStore分析(四)
- 分析和学习Spring中的jpetstore用户管理
- 基于struts+spring+ibatis的 J2EE 开发(jpetstore分析)
- JPetStore项目分析——分析一个典型J2EE应用web层的实现
- read-JpetStore-2-进入JPetstore
- Java读写cookie
- 限制Win应用程序只运行一个实例
- 实用:用来脱口而出的100个精典英语句
- linux中的定时器命令--crontab
- 在cygwin下安装ns-2
- jPetStore 源码分析
- embership设置的问题
- 一道题
- WebSphere Application Server中配置MQ
- Solmyr 的小品文系列之一:字符串放在哪里?
- 明晰C++内存分配的五种方法的区别
- Solmyr 的小品文系列之二:模棱两可的陷阱
- CrystalReport
- Decode函数的语法