Struts 2.1.6 精简实例系列教程(3):新闻管理Model层的开发(整合iBatis)
本期开始讲Model层的开发,整合iBatis框架,iBatis是Apache旗下Java数据持久层的框架,跟Hibernate是同一类型的框架。大家可到它的官方网站去下载http://ibatis.apache.org/java.cgi,如下图:
我这里下载的是当前最新版本iBatis 2.3.4 , 下载之后,解压包是这样的:
我们在lib目录下,找到“ibatis-2.3.4.726.jar”文件,加入到我们项目的lib目录下,就行。在这里,我们先说下怎么学习这个iBatis框架:上图中,有个simple_example的文件夹,它里面就包含了一个超级简单且容易理解的例子,大家可以去学习一下。By the way,如果你学过Hibernate的话,你会发觉iBatis要比Hibernate好学很多。关于Hibernate和iBatis的争论,网上有很多,大家有兴趣可以去了解一下。
好,我们先建立数据库和设计数据库吧。我这项目用的是MySQL 5.0。生成数据库和数据表的SQL语句如下:
create database simpledb;
create table article
(
??? ID int auto_increment not null primary key,
??? TITLE varchar(25),
??? AUTHOR varchar(25),
??? CONTENT text,
??? PUBTIME date
);
?
这是我们常见的新闻表及其中的字段。
接下来,写一个与表对应的新闻类,Article.java,这个其实是POJO类,代码如下:
package?cn.simple.pojo;
import?java.util.Date;
public?class?Article?
{
????
????private?int?id;
????private?String?title;
????private?String?author;
????private?String?content;
????private?Date?pubtime;
????
????/**?*//***********getter和setter方法***********/
????public?int?getId()?
{
????????return?id;
????}
????public?void?setId(int?id)?
{
????????this.id?=?id;
????}
????public?String?getTitle()?
{
????????return?title;
????}
????public?void?setTitle(String?title)?
{
????????this.title?=?title;
????}
????public?String?getAuthor()?
{
????????return?author;
????}
????public?void?setAuthor(String?author)?
{
????????this.author?=?author;
????}
????public?String?getContent()?
{
????????return?content;
????}
????public?void?setContent(String?content)?
{
????????this.content?=?content;
????}
????public?Date?getPubtime()?
{
????????return?pubtime;
????}
????public?void?setPubtime(Date?pubtime)?
{
????????this.pubtime?=?pubtime;
????}
????
}
?
有了数据表和实体类,现在来写两者之间映射的配置文件Article.xml。代码如下:
<?xml?version="1.0"?encoding="UTF-8"??>
<!DOCTYPE?sqlMap??????
????PUBLIC?"-//ibatis.apache.org//DTD?SQL?Map?2.0//EN"??????
????"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap?namespace="Article">
????<!--?Use?type?aliases?to?avoid?typing?the?full?classname?every?time.?-->
????<typeAlias?alias="Article"?type="cn.simple.pojo.Article"?/>
????<!--
????????Result?maps?describe?the?mapping?between?the?columns?returned?from?a
????????query,?and?the?class?properties.?A?result?map?isn't?necessary?if?the
????????columns?(or?aliases)?match?to?the?properties?exactly.
????-->
????<resultMap?id="ArticleResult"?class="Article">
????????<result?property="id"?column="ID"?/>
????????<result?property="title"?column="TITLE"/>
????????<result?property="author"?column="AUTHOR"/>
????????<result?property="content"?column="CONTENT"/>
????????<result?property="pubtime"?column="PUBTIME"/>
????</resultMap>
????<!--
????????Select?with?no?parameters?using?the?result?map?for?Account?class.
????-->
????<select?id="selectAllArticles"?resultMap="ArticleResult">
????????select?*?from?article
??????</select>
????<!--
????????A?simpler?select?example?without?the?result?map.?Note?the?aliases?to
????????match?the?properties?of?the?target?result?class.
????-->
????<select?id="selectArticleById"?parameterClass="int"?resultClass="Article">
????????select
????????ID?as?id,
????????TITLE?as?title,
????????AUTHOR?as?author,
????????CONTENT?as?content,
????????PUBTIME?as?pubtime
????????from?Article
????????where?ID=#id#
??</select>
????<!--?Insert?example,?using?the?Account?parameter?class?-->
????<insert?id="insertArticle"?parameterClass="Article">
????????insert?into?article?(
????????????TITLE,
????????????AUTHOR,
????????????CONTENT,
????????????PUBTIME
????????)?values?(
????????????#title#,
????????????#author#,
????????????#content#,
????????????#pubtime#
????????)
??</insert>
????<!--?Update?example,?using?the?Account?parameter?class?-->
????<update?id="updateArticle"?parameterClass="Article">
????????update?article?set
????????TITLE?=?#title#,
????????AUTHOR?=?#author#,
????????CONTENT?=?#content#,
????????PUBTIME?=?#pubtime#
????????where
????????ID?=?#id#
??</update>
????<!--?Delete?example,?using?an?integer?as?the?parameter?class?-->
????<delete?id="deleteArticleById"?parameterClass="int">
????????delete?from?article?where?ID?=?#id#
??</delete>
</sqlMap>
?
大家不要觉得这个映射文件很复杂,其实,这挺容易理解的,如果大家赖得写的话,可复制iBatis自带的simple_example下的例子的映射文件,然后修改一下就行。
有了表、实体类、表与实体之间的映射文件,之后,该做什么呢?学过Hibernate的朋友会想到那个数据库连接信息的配置文件,当然,iBatis也需要类似的文件,即SqlMapConfig.xml,代码如下:
<?xml?version="1.0"?encoding="UTF-8"??>
<!DOCTYPE?sqlMapConfig??????
????PUBLIC?"-//ibatis.apache.org//DTD?SQL?Map?Config?2.0//EN"??????
????"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
??<!--?Configure?a?built-in?transaction?manager.??If?you're?using?an?
???????app?server,?you?probably?want?to?use?its?transaction?manager?
???????and?a?managed?datasource?-->
??<transactionManager?type="JDBC"?commitRequired="false">
????<dataSource?type="SIMPLE">
??????<property?name="JDBC.Driver"?value="com.mysql.jdbc.Driver"/>
??????<property?name="JDBC.ConnectionURL"?value="jdbc:mysql://localhost:3306/simpledb"/>
??????<property?name="JDBC.Username"?value="root"/>
??????<property?name="JDBC.Password"?value="root"/>
????</dataSource>
??</transactionManager>
??<!--?List?the?SQL?Map?XML?files.?They?can?be?loaded?from?the?
???????classpath,?as?they?are?here?(com.domain.data
)?-->
??<sqlMap?resource="cn/simple/pojo/Article.xml"/>
??<!--?List?more?here
??<sqlMap?resource="com/mydomain/data/Order.xml"/>
??<sqlMap?resource="com/mydomain/data/Documents.xml"/>
??-->
</sqlMapConfig> ?
一看这代码,也有点复杂,我的说法同上,大不了COPY,再略作修改,呵呵
好了,来写我们的业务逻辑层:
package?cn.simple.manager;
import?java.io.IOException;
import?java.io.Reader;
import?java.sql.SQLException;
import?java.util.List;
import?cn.simple.pojo.Article;
import?com.ibatis.common.resources.Resources;
import?com.ibatis.sqlmap.client.SqlMapClient;
import?com.ibatis.sqlmap.client.SqlMapClientBuilder;
public?class?ArticleManager?
{
????/**?*//**
?????*?SqlMapClient?instances?are?thread?safe,?so?you?only?need?one.?In?this
?????*?case,?we'll?use?a?static?singleton.?So?sue?me.?;-)
?????*/
????private?static?SqlMapClient?sqlMapper;
????/**?*//**
?????*?It's?not?a?good?idea?to?put?code?that?can?fail?in?a?class?initializer,
?????*?but?for?sake?of?argument,?here's?how?you?configure?an?SQL?Map.
?????*/
????static?
{
????????try?
{
????????????Reader?reader?=?Resources.getResourceAsReader("SqlMapConfig.xml");
????????????sqlMapper?=?SqlMapClientBuilder.buildSqlMapClient(reader);
????????????reader.close();
????????}?catch?(IOException?e)?
{
????????????//?Fail?fast.
????????????throw?new?RuntimeException(
????????????????????"Something?bad?happened?while?building?the?SqlMapClient?instance."
????????????????????????????+?e,?e);
????????}
????}
????/**?*//**
?????*?查询列表
?????*?@return
?????*?@throws?SQLException
?????*/
????public?static?List<Article>?selectAllArticles()?throws?SQLException?
{
????????return?sqlMapper.queryForList("selectAllArticles");
????}
????
????/**?*//**
?????*?插入数据
?????*?@param?article
?????*?@throws?SQLException
?????*/
????public?static?void?insertArticle(Article?article)?throws?SQLException?
{
????????sqlMapper.insert("insertArticle",?article);
????}
????
????/**?*//**
?????*?更新数据
?????*?@param?article
?????*?@throws?SQLException
?????*/
????public?static?void?updateArticle(Article?article)?throws?SQLException?
{
????????sqlMapper.update("updateArticle",?article);
????}
?
本文转自我的JavaEE技术博客http://www.blogjava.net/rongxh7/,转载请注明出处!谢谢!
1 楼 rtsbtx 2009-08-21 我是一个新手,想问一下,这里如果要设计DAO层的话应该怎么改呢~~? 2 楼 SeanHe 2009-08-22 如果你使用SPRING的话,spring帮你把IBATIS做封装,使用起来也很方便。印象中spring的例子里有对iBATIS整合的例子 3 楼 wenxiang_tune 2009-08-26 小例子不能说明大问题。。。LZ的配置方法Hibernate已经实现的很好了,而且Hibernate有很多种可选方案 4 楼 快乐让让 2009-12-21 没用呀,随便下个IBATIS的快速应用就有你所说的一切了,而且还比你说的详细。。。 5 楼 ckn126 2010-05-13 我问一下 如果 B对象包含在A中 如果我想用查询A时候,把B对象一起封装进去 ,这个在hibernate之中是使用component 那么 ibatis中如何处理对象的包含关系。。。 6 楼 everher 2010-05-17 我现在就在用ibatis,但是用ibatis作为持久层有一个比较大的缺点,即:代码生成工具很难使用,而且效果不好。