ibatis+spring+cxf+mysql搭建webservice

首先需必备:mysql、myeclipse6.5、apache-cxf-2.6.2

一、建数据库,库名:cxf_demo;表名:book

 
  1. CREATE DATABASE `cxf_demo`  --数据库  
 
  1. --表  
  2. CREATE TABLE `book` (  
  3.   `id` varchar(32) NOT NULL COMMENT 'id',  
  4.   `book_name` varchar(100) DEFAULT NULL COMMENT '名称',  
  5.   `author` varchar(100) DEFAULT NULL COMMENT '作者',  
  6.   `status` int(11) DEFAULT NULL COMMENT '状态',  
  7.   `type_id` varchar(32) DEFAULT NULL COMMENT '类型',  
  8.   `price` double DEFAULT NULL COMMENT '金额',  
  9.   `brief` varchar(100) DEFAULT NULL COMMENT '简介',  
  10.   `book_No` int(11) DEFAULT NULL COMMENT '编号',  
  11.   `create_time` datetime DEFAULT NULL COMMENT '创建时间',  
  12.   PRIMARY KEY (`id`)  
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  


二、好了,现在来建一个web项目名为:myWebservice,大概的package结构如下,大家就将package创建出来吧:

三、建了项目后要将cxf的jar包导入哦,呵呵我不知道哪些cxf jar是必要的,所以就将所有的jar包都导入了,apache-cxf-2.6.2这个版本的。。。

四、好了,现在我们来写resource这个包下面的配置文件,⊙0⊙噢,resource的结构是酱紫滴,看如下图:

我们先来配置数据库jdbc.properties这个文件

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. jdbc.driverClassName=com.mysql.jdbc.Driver  
  2. jdbc.url=jdbc:mysql://localhost:3306/cxf_demo?useUnicode=true&characterEncoding=UTF-8&failOverReadOnly=false&maxReconnects=10&autoReconnect=true  
  3. jdbc.username=root  
  4. jdbc.password=root  

然后是配置applicationContext-common.xml

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  7.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  8.     http://www.springframework.org/schema/tx   
  9.     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
  10.     http://www.springframework.org/schema/jee   
  11.     http://www.springframework.org/schema/jee/spring-jee-3.0.xsd   
  12.     http://www.springframework.org/schema/aop   
  13.     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
  14.     http://www.springframework.org/schema/context   
  15.     http://www.springframework.org/schema/context/spring-context-3.0.xsd"  
  16.     default-lazy-init="true">  
  17.   
  18.     <description>Spring配置</description>  
  19.   
  20.     <!-- 使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入 -->  
  21.     <context:component-scan base-package="com.cy" />  
  22.   
  23.     <!-- 加载JDBC property文件 -->  
  24.     <context:property-placeholder location="classpath*:config/jdbc.properties" ignore-unresolvable="true"/>  
  25.       
  26.     <!-- 连接数据库   -->  
  27.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  28.         <property name="driverClassName" value="${jdbc.driverClassName}"/>  
  29.         <property name="url" value="${jdbc.url}"/>  
  30.         <property name="username" value="${jdbc.username}"/>  
  31.         <property name="password" value="${jdbc.password}"/>  
  32.           
  33.         <!-- Connection Pooling Info -->  
  34.     <!-- <property name="initialSize" value="1" /> 初始化连接数量 -->   
  35.         <property name="maxIdle" value="5" /><!-- 最大等待连接中的数量,设 0 为没有限制 -->  
  36.         <property name="minIdle" value="1"/><!-- 最小等待连接中的数量,设 0 为没有限制  -->  
  37.         <property name="maxActive" value="25" /><!-- 连接池的最大数据库连接数。设为0表示无限制。 -->  
  38.     <!-- <property name="maxWait" value="60000"/> 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  -->     
  39.     <!-- <property name="timeBetweenEvictionRunsMillis" value="3600000" />  -->   
  40.     <!--    <property name="minEvictableIdleTimeMillis" value="3600000" /> -->    
  41.     <!-- <property name="removeAbandoned" value="true" />强制自我中断避免dbcp自身bug出现连接过久资源耗尽-->  
  42.     <!--    <property name="removeAbandonedTimeout" value="60" />自我中断时间秒 -->  
  43.     </bean>  
  44.       
  45.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  46.         <property name="dataSource" ref="dataSource"/>  
  47.     </bean>  
  48.       
  49.     <!-- 使用annotation定义事务  -->  
  50.     <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />  
  51.     <!-- ibatis -->     
  52.     <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
  53.         <property name="configLocation" value="classpath:sqlmap-config.xml"/>  
  54.         <property name="dataSource" ref="dataSource"/>  
  55.     </bean>  
  56.       
  57.     <!-- 配置切面   -->  
  58.     <aop:config>  
  59.         <aop:aspect id="logAspecter" ref="logAspcet">  
  60.             <aop:pointcut id="mypointcut" expression="execution(* com.cy.*.service.impl.*.*(..))"/>  
  61.         </aop:aspect>  
  62.     </aop:config>  
  63.   
  64. </beans>  


五、好啦,现在我们来写dto在Book.java文件里

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.cy.business.dto;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Book {  
  6. private static final long serialVersionUID = -2672626820160275114L;  
  7.       
  8.     private String id;  
  9.     private String bookName;  
  10.     private String author;  
  11.     private String typeId;  
  12.     private Double price;  
  13.     private String brief;  
  14.     private Integer bookNo;  
  15.     private Integer status;  
  16.     private Date createTime;  
  17.     public String getId() {  
  18.         return id;  
  19.     }  
  20.     public void setId(String id) {  
  21.         this.id = id;  
  22.     }  
  23.     public String getBookName() {  
  24.         return bookName;  
  25.     }  
  26.     public void setBookName(String bookName) {  
  27.         this.bookName = bookName;  
  28.     }  
  29.     public String getAuthor() {  
  30.         return author;  
  31.     }  
  32.     public void setAuthor(String author) {  
  33.         this.author = author;  
  34.     }  
  35.     public String getTypeId() {  
  36.         return typeId;  
  37.     }  
  38.     public void setTypeId(String typeId) {  
  39.         this.typeId = typeId;  
  40.     }  
  41.     public Double getPrice() {  
  42.         return price;  
  43.     }  
  44.     public void setPrice(Double price) {  
  45.         this.price = price;  
  46.     }  
  47.     public String getBrief() {  
  48.         return brief;  
  49.     }  
  50.     public void setBrief(String brief) {  
  51.         this.brief = brief;  
  52.     }  
  53.     public Integer getBookNo() {  
  54.         return bookNo;  
  55.     }  
  56.     public void setBookNo(Integer bookNo) {  
  57.         this.bookNo = bookNo;  
  58.     }  
  59.     public Integer getStatus() {  
  60.         return status;  
  61.     }  
  62.     public void setStatus(Integer status) {  
  63.         this.status = status;  
  64.     }  
  65.     public Date getCreateTime() {  
  66.         return createTime;  
  67.     }  
  68.     public void setCreateTime(Date createTime) {  
  69.         this.createTime = createTime;  
  70.     }  
  71. }  

 

然后咧,就是在sqlmap文件夹里写Book_SqlMap.xml与dto关联哦:

 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  3. <!-- 定义命名空间 -->  
  4. <sqlMap  namespace="BookNS">  
  5.     <!-- 定义缓存 -->  
  6.     <cacheModel id="Book_Cache" type="OSCACHE" readOnly="true">  
  7.         <flushInterval hours="24" />  
  8.         <!-- 配置哪些SQL将清空缓存 -->  
  9.         <flushOnExecute statement="saveBook" />  
  10.         <flushOnExecute statement="deleteBook" />  
  11.         <flushOnExecute statement="updateBook" />  
  12.         <flushOnExecute statement="changeBookStatus" />  
  13.         <property name="size" value="1000" />  
  14.     </cacheModel>  
  15.       
  16.     <!-- 对象引用 -->  
  17.     <typeAlias alias="BookPo" type="com.cy.business.dto.Book"/>  
  18.       
  19.     <!-- 定义结果 -->  
  20.     <resultMap class="BookPo" id="BookPo_Result">  
  21.         <result column="id" property="id" />  
  22.         <result column="book_name" property="bookName" />  
  23.         <result column="author" property="author" />  
  24.         <result column="type_id" property="typeId" />  
  25.         <result column="price" property="price" />  
  26.         <result column="brief" property="brief" />  
  27.         <result column="book_No" property="bookNo" />  
  28.         <result column="status" property="status" />  
  29.         <result column="create_time" property="createTime"/>  
  30.     </resultMap>  
  31.       
  32.     <select id="queryBook" parameterClass="BookPo" resultMap="BookPo_Result" cacheModel="Book_Cache">  
  33.         select * from book   
  34.         <dynamic prepend=" WHERE ">  
  35.             <isNotEmpty property="id" prepend="and">  
  36.                 id=#id:VARCHAR#  
  37.             </isNotEmpty>  
  38.             <isNotEmpty property="bookName" prepend="and">  
  39.                 instr(book_Name,#bookName:VARCHAR#)  
  40.             </isNotEmpty>  
  41.             <isNotEmpty property="author" prepend="and">  
  42.                 instr(author,#author:VARCHAR#)  
  43.             </isNotEmpty>  
  44.             <isNotEmpty property="bookNo" prepend="and">  
  45.                 book_No=#bookNo:VARCHAR#  
  46.             </isNotEmpty>  
  47.         </dynamic>  
  48.     </select>  
  49.       
  50.     <insert id="saveBook" parameterClass="BookPo">  
  51.         insert into book(id,book_name,author,type_id,price,brief,book_no,status,create_time)   
  52.         values(#id#,#bookName#,#author#,#typeId#,#price#,#brief#,#bookNo#,0,sysdate());  
  53.     </insert>  
  54.       
  55.     <update id="changeBookStatus" parameterClass="BookPo">  
  56.         <![CDATA[ 
  57.         update book set status=#status# where id=#id# 
  58.         ]]>  
  59.     </update>  
  60.       
  61.     <update id="updateBook" parameterClass="BookPo">  
  62.         <![CDATA[ 
  63.         update book set book_name=#bookName#,author=#author#,type_id=#typeId# 
  64.         ,price=#price#,brief=#brief#,book_no=#bookNo# where id=#id# 
  65.         ]]>  
  66.     </update>  
  67.       
  68.     <delete id="deleteBook" parameterClass="BookPo">  
  69.         <![CDATA[ 
  70.         delete from book where id=#id# 
  71.         ]]>  
  72.     </delete>  
  73.       
  74. </sqlMap>  

 

写完这些,然后来实现业务逻辑层,这些添删改查功能。。。

接口IBookService.java

 
  1. package com.cy.business.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.cy.business.dto.Book;  
  6.   
  7. public interface IBookService {  
  8.   
  9. public List<Book> findBook(Book book);  
  10.       
  11.     public boolean updateBook(Book book);  
  12.       
  13.     public boolean deleteBook(Book book);  
  14.       
  15.     public boolean changeBookStatus(Book book);  
  16.       
  17.     public boolean saveBook(Book book);  
  18. }  


实现接口方法BookService.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.cy.business.service.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6. import javax.inject.Inject;  
  7.   
  8. import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;  
  9. import org.springframework.stereotype.Service;  
  10. import org.springframework.transaction.annotation.Transactional;  
  11.   
  12. import com.cy.business.dto.Book;  
  13. import com.cy.business.service.IBookService;  
  14. import com.ibatis.sqlmap.client.SqlMapClient;  
  15.   
  16. @Service  
  17. @Transactional  
  18. public class BookService extends SqlMapClientDaoSupport implements IBookService {  
  19.   
  20.     //及其重要,完成进行注入  
  21.     @Inject  
  22.     @Resource(name="sqlMapClient")  
  23.     public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {  
  24.         super.setSqlMapClient(sqlMapClient);  
  25.     }  
  26.       
  27.     public boolean changeBookStatus(Book book) {  
  28.         try {  
  29.             int result = this.getSqlMapClientTemplate().update("changeBookStatus", book);  
  30.             if (result > 0) {  
  31.                 return true;  
  32.             } else {  
  33.                 return false;  
  34.             }  
  35.         } catch (Exception e) {  
  36.             return false;  
  37.         }  
  38.     }  
  39.   
  40.     public boolean deleteBook(Book book) {  
  41.         try {  
  42.             int result = this.getSqlMapClientTemplate().delete("deleteBook", book);  
  43.             if (result > 0) {  
  44.                 return true;  
  45.             } else {  
  46.                 return false;  
  47.             }  
  48.         } catch (Exception e) {  
  49.             return false;  
  50.         }  
  51.     }  
  52.   
  53.     @SuppressWarnings("unchecked")  
  54.     public List<Book> findBook(Book book) {  
  55.         try {  
  56.             return this.getSqlMapClientTemplate().queryForList("queryBook", book);  
  57.         } catch (Exception e) {  
  58.             e.printStackTrace();  
  59.             return null;  
  60.         }  
  61.     }  
  62.   
  63.     public boolean saveBook(Book book) {  
  64.         try {  
  65.             this.getSqlMapClientTemplate().insert("saveBook", book);  
  66.             return true;  
  67.         } catch (Exception e) {  
  68.             e.printStackTrace();  
  69.             return false;  
  70.         }  
  71.     }  
  72.   
  73.     public boolean updateBook(Book book) {  
  74.         try {  
  75.             int result = this.getSqlMapClientTemplate().update("updateBook", book);  
  76.             if (result > 0) {  
  77.                 return true;  
  78.             } else {  
  79.                 return false;  
  80.             }  
  81.         } catch (Exception e) {  
  82.             e.printStackTrace();  
  83.             return false;  
  84.         }  
  85.     }  
  86.   
  87. }  


嗯,完成这些,就开始来写webservice接口咯,在package名为webservice下,

接口IMyWebservice.java

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.cy.webservice;  
  2.   
  3. import javax.jws.WebMethod;  
  4. import javax.jws.WebParam;  
  5. import javax.jws.WebService;  
  6.   
  7. import org.springframework.stereotype.Component;  
  8.   
  9. import com.cy.business.dto.Book;  
  10.   
  11. @WebService(name = "IMyWebservice", targetNamespace = "http://webservice.cy.com/")  
  12. @Component()  
  13. public interface IMyWebservice {  
  14.   
  15.     @WebMethod(operationName = "pushData", action = "urn:PushData")  
  16.     public boolean pushData(@WebParam(name="book")Book book);  
  17. }  


实现类MyWebService.java

 
  1. package com.cy.webservice.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6. import javax.jws.WebService;  
  7.   
  8. import com.cy.business.dto.Book;  
  9. import com.cy.business.service.IBookService;  
  10. import com.cy.webservice.IMyWebservice;  
  11.   
  12. @WebService(targetNamespace = "http://impl.webservice.cy.com/", portName = "MyWebservicePort", serviceName = "MyWebservice")  
  13. public class MyWebService implements IMyWebservice {  
  14.   
  15.     @Resource  
  16.     private IBookService bookService;  
  17.       
  18.     public boolean pushData(Book book) {  
  19.         try {  
  20.             System.out.println("进入webservice了。。。");  
  21.             boolean flag = bookService.saveBook(book);//先保存数据  
  22.             if(flag){  
  23.                 Book bk = new Book();  
  24.                 bk.setBookNo(89757);  
  25.                 List<Book> list = bookService.findBook(book);  
  26.                 if(list!=null && !list.isEmpty()){//然后更改数据。。。  
  27.                     bk = new Book();  
  28.                     bk = list.get(0);  
  29.                     bk.setStatus(1);  
  30.                     bk.setBookName("岑逸951560368");  
  31.                     return bookService.updateBook(bk);  
  32.                 }else{  
  33.                     return false;  
  34.                 }  
  35.             }else{  
  36.                 return false;  
  37.             }  
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.             return false;  
  41.         }  
  42.     }  
  43.   
  44. }  

⊙0⊙生气这样我们就写完了?还木有哦,别忘了在resource包下还有个配置文件还木有写哈。。。applicationContext-cxf.xml

 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:jee="http://www.springframework.org/schema/jee"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  7.     http://cxf.apache.org/jaxws   
  8.     http://cxf.apache.org/schemas/jaxws.xsd"  
  9.     default-lazy-init="true">  
  10.   
  11.     <bean id="myWebservice" class="com.cy.webservice.impl.MyWebService"></bean>  
  12.     <jaxws:endpoint address="/myWebservice" implementor="#myWebservice"></jaxws:endpoint>  
  13.       
  14. </beans>  


六、好啦,我们的工作做了一大半了!现在来让我们运行一下这个webservice吧,在项目http://localhost:8080/myWebservice/后边需要加上"service",这是因为在web.xml中我们这么配置的,大家还记得吧奋斗继续

 
  1. <servlet-mapping>  
  2.    <servlet-name>cxf</servlet-name>  
  3.    <url-pattern>/service/*</url-pattern>  
  4.  </servlet-mapping>  

能够打开这个就说明你成功了................................................................一大半,为嘛这么说呢,因为还需要测试啊!!!

你打开超链接WSDL : {http://impl.webservice.cy.com/}MyWebservice会来到这个界面

哈哈,你的webservice写的差不多了,开心吧。。。

七、那俺们现在开始写客户端来测试一下,要有耐心哦。。。马上就成功鸟。。。生气奋斗

建一个名为myWebclient的JavaProject,大家跟着我建吧。。。看如下图package结构:

我们通过myeclipse6.5来快捷的创建客户端。。。

闭嘴来看图操作。我们将编译文件放在webservice这个包下,选择webservice这个包,new->other

搜索出这个工具哦,然后next->next会有如下界面 wsdl url这个地址就是刚才打开的http://localhost:8080/myWebservice/service/myWebservice?wsdl      

然后next->到下一个图了,切记myWebservice这个项目一定是部署了正在运行的哦!!!

finish之后,所以的文件编译完成了!

八、我们现在来完成webUtil这个package下的文件吧!

Util.java文件

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.cy.client.webUtil;  
  2.   
  3. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  4.   
  5.   
  6. public class Util {  
  7.     
  8.     @SuppressWarnings({ "unchecked" })  
  9.     public static Object getService(Class clazz, String url){  
  10.         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
  11.                 Object srv = null;  
  12.                 factory.setServiceClass(clazz);  
  13.         factory.setAddress(url);  
  14.         srv=(Object) factory.create();  
  15.                 return srv;  
  16.     }  
  17.   
  18. }  

UtilWebService.java文件是连接webservice的接口地址:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.cy.client.webUtil;  
  2.   
  3. import com.cy.client.webservice.IMyWebservice;  
  4.   
  5.   
  6.   
  7. public class UtilWebService {  
  8.     public static IMyWebservice getMyWebService(){  
  9.         String url="http://localhost:8080/myWebservice/service/myWebservice?wsdl";  
  10.         IMyWebservice service = (IMyWebservice) Util.getService(IMyWebservice.class,url);  
  11.         return service;  
  12.     }  
  13. }  


现在我们在client包下建Client.java客户端

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package com.cy.client;  
  2.   
  3. import java.util.UUID;  
  4.   
  5. import com.cy.client.webUtil.UtilWebService;  
  6. import com.cy.client.webservice.Book;  
  7. import com.cy.client.webservice.IMyWebservice;  
  8.   
  9. public class Client {  
  10.   
  11.     private IMyWebservice myWebservice;  
  12.       
  13.     public boolean getBookInfo(){  
  14.         myWebservice = UtilWebService.getMyWebService();  
  15.         // 创建 GUID 对象  
  16.         UUID uuid = UUID.randomUUID();  
  17.         // 得到对象产生的ID  
  18.         String a = uuid.toString();  
  19.         // 转换为大写  
  20.         a = a.replaceAll("-", "");  
  21.         Book book = new Book();  
  22.         book.setId(a);  
  23.         book.setAuthor("岑逸");  
  24.         book.setBookName("随园诗话");  
  25.         book.setBookNo(89757);  
  26.         book.setBrief("哈哈");  
  27.         return myWebservice.pushData(book);  
  28.     }  
  29.       
  30.     public static void main(String[] args) {  
  31.         boolean flag = new Client().getBookInfo();  
  32.         System.out.println("推送:"+flag);  
  33.     }  
  34. }  


运行一下吧。。。哈哈成功了!!!得意生气数据库也有数据了!!!有木有可怜花了一个多小时

 

 

非常感谢本文的作者,原文地址:http://blog.csdn.net/cenyi2013/article/details/17315755

posted @ 2014-10-21 11:32  tancp  阅读(415)  评论(0编辑  收藏  举报