第二讲:tapestry增删改查---添加数据

增、删、改、查。这是开发程序最基本的、必须掌握的事。若是看不懂能够先跳过此文,先看看后面的再回来仔细阅读,应该能更好理解。html

 

实现使用了tapestry ioc的接口开发方式,也就是一个接口DAO,一个接口方法Impl,使用的时候调用接口的方法。要作增删改查还须要实体entity以及数据库,这里使用mySql。实体与数据库的链接使用tapestry-hibernate、c3p0、mysql-connector-java.java

 

打开项目根目录下的pom.xml,增长须要的tapestry-hibernate、c3p0、mysql-connector-java、tapestry-upload链接,代码以下:mysql

 

<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-hibernate</artifactId>
<version>${tapestry-release-version}</version>
</dependency>

 <dependency>web

            <groupId>org.apache.tapestry</groupId>
            <artifactId>tapestry-upload</artifactId>
            <version>${tapestry-release-version}</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.17</version>
</dependency>

 

修改服务,打开com.tapestry.app.services下的AppModule.java文件进行配置,源码以下:sql

 package com.tapestry.app.services;数据库

 
import java.io.IOException;
 
import org.apache.tapestry5.*;
import org.apache.tapestry5.hibernate.HibernateCoreModule;
import org.apache.tapestry5.hibernate.HibernateModule;
import org.apache.tapestry5.hibernate.HibernateSymbols;
import org.apache.tapestry5.hibernate.HibernateTransactionAdvisor;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.annotations.Match;
import org.apache.tapestry5.ioc.annotations.SubModule;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.RequestFilter;
import org.apache.tapestry5.services.RequestHandler;
import org.apache.tapestry5.services.Response;
import org.apache.tapestry5.upload.services.UploadModule;
import org.apache.tapestry5.upload.services.UploadSymbols;
import org.slf4j.Logger;
 
@SubModule({HibernateModule.class, HibernateCoreModule.class,UploadModule.class})
public class AppModule
{
    public static void bind(ServiceBinder binder)
    {
        // binder.bind(MyServiceInterface.class, MyServiceImpl.class);
    }
 
    public static void contributeFactoryDefaults(
            MappedConfiguration<String, Object> configuration)
    { 
        configuration.override(SymbolConstants.APPLICATION_VERSION, "1.0");
    }
 
    public static void contributeApplicationDefaults(
            MappedConfiguration<String, Object> configuration)
    {
    configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en");
        configuration.add(SymbolConstants.PRODUCTION_MODE, "false");
        configuration.add(UploadSymbols.FILESIZE_MAX, "50000000");
        configuration.add(SymbolConstants.APPLICATION_VERSION, "1.0-SNAPSHOT");
        configuration
.add(HibernateSymbols.ENTITY_SESSION_STATE_PERSISTENCE_STRATEGY_ENABLED,
"true");
    }
 
    @Match("*DAO")
public static void adviseTransactions(HibernateTransactionAdvisor advisor,
MethodAdviceReceiver receiver) {
advisor.addTransactionCommitAdvice(receiver);
}
 
    public RequestFilter buildTimingFilter(final Logger log)
    {
        return new RequestFilter()
        {
            public boolean service(Request request, Response response, RequestHandler handler)
                    throws IOException
            {
                long startTime = System.currentTimeMillis();
 
                try
                {
                    return handler.service(request, response);
                } finally
                {
                    long elapsed = System.currentTimeMillis() - startTime;
 
                    log.info(String.format("Request time: %d ms", elapsed));
                }
            }
        };
    }
 
   
    public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration,
                                         @Local
                                         RequestFilter filter)
    {
        configuration.add("Timing", filter);
    }
}
 

 

在src/main/resources下增长hibernate.cfg.xml文件,代码以下:express

<?xml version='1.0' encoding='utf-8'?>
<!--
   Copyright 2007 The Apache Software Foundation
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
 
       http://www.apache.org/licenses/LICENSE-2.0
 
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
 
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
 
  <session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql:///example?useUnicode=true&amp;characterEncoding=UTF-8</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
 
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="hbm2ddl.auto">update</property>
 
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
 
    <property name="hibernate.generate_statistics">true</property>
  </session-factory>
 
 
</hibernate-configuration>
 

在数据库里面建立名为example的数据库。apache

建立com.tapestry.app.entities包,在包内建立User.java的实体。代码以下:session

 

package com.tapestry.app.entities;
 
import java.util.Date;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
 
@Entity
public class User {
 
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="user_id")
private Long id;
 
private String name;
 
private int age;
 
private Date time;
 
public Long getId() {
return id;
}
 
public void setId(Long id) {
this.id = id;
}
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
 
public int getAge() {
return age;
}
 
public void setAge(int age) {
this.age = age;
}
 
public Date getTime() {
return time;
}
 
public void setTime(Date time) {
this.time = time;
}
}
 

建立com.tapestry.app.pages.crud包,包内建立UserCreate.java。在webapp下建立crud文件夹,文件夹内建立UserCreate.tml。他们的代码以下:app

UserCreate.java

 

/**
* 项目名称:TapestryStart
* 开发模式:Maven+Tapestry5.x+Tapestry-hibernate+Mysql
* 版本:1.0
* 编写:飞风
* 时间:2012-02-29
*/
package com.tapestry.app.pages.crud;
 
import java.util.Date;
 
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
 
import com.tapestry.app.entities.User;
import com.tapestry.app.services.StartDAO;
 
public class UserCreate {
 
@Property
private User user;
 
//导入服务接口
@Inject
private StartDAO dao;
 
//初始化user实体
void onPrepare(){
user = new User();
}
 
//提交表单的时候执行存储,返回当前页面
Object onSuccess(){
//若是时间为空值输入系统当前时间
if(user.getTime() == null){
user.setTime(new Date());
}
dao.create(user);
return this;
}
}
 

UserCreate.tml

 

<html t:type="layout" title="tapestryStart Index"  t:sidebarTitle="Framework Version"
 xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter">
 <t:form>
  <t:errors/>
  <p>用户名:<t:textfield t:id="name" value="user.name" t:validate="required"/></p>
  <p>年龄:<t:textfield t:id="age" value="user.age" t:validate="required"/></p>
  <p><input type="submit" value="建立"/></p>
 </t:form>
 </html>

建立服务,在com.tapestry.app.services包里建立操做数据的接口与方法:StartDAO.java与StartDAOImpl.java这是我写的增删改查代码,已经封装过很方便之后使用。源码以下:

StartDAO.java

package com.tapestry.app.services;
 
import java.io.Serializable;
import java.util.List;
import java.util.Map;
 
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
 
 
 
 
public interface StartDAO {
 
 
<T, PK extends Serializable> T findByID(Class<T> type, PK id);
 
@CommitAfter
<T> T create(T t);
 
@CommitAfter
<T> T update(T t);
 
@CommitAfter
<T, PK extends Serializable> void deleteByID(Class<T> type, PK id);
 
<T> List<T> findWithNameQuery(String queryName, int num);
<T> List<T> findWithQuery(String queryName);
 
}
 

StartDAOImpl.java

 package com.tapestry.app.services;

 
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
 
import org.hibernate.Query;
import org.hibernate.Session;
 
 
 
 
 
public class StartDAOImpl implements StartDAO {
 
private Session session;
 
public StartDAOImpl(Session session){
this.session = session;
}
 
 
@SuppressWarnings("unchecked")
public <T, PK extends Serializable> T findByID(Class<T> type, PK id){
return (T) session.get(type, id);
}
 
 
public <T> T create(T t){
session.persist(t);
session.flush();
session.refresh(t);
//session.save(t);
return t;
}
 
 
 
 
public <T> T update(T t){
session.merge(t);
return t;
}
 
public <T, PK extends Serializable> void deleteByID(Class<T> type, PK id){
@SuppressWarnings("unchecked")
T t = (T) session.get(type, id);
session.delete(t);
}
 
@SuppressWarnings("unchecked")
public <T> List<T> findWithNameQuery(String queryName, int num){
return session.createQuery(queryName).setMaxResults(num).list();
}
 
@SuppressWarnings("unchecked")
public <T> List<T> findWithQuery(String queryName){
return session.createQuery(queryName).list();
}
    
}
 

最后修改下AppModule.java把服务绑定起来,代码以下:

package com.tapestry.app.services;
 
import java.io.IOException;
 
import org.apache.tapestry5.*;
import org.apache.tapestry5.hibernate.HibernateCoreModule;
import org.apache.tapestry5.hibernate.HibernateModule;
import org.apache.tapestry5.hibernate.HibernateSymbols;
import org.apache.tapestry5.hibernate.HibernateTransactionAdvisor;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Local;
import org.apache.tapestry5.ioc.annotations.Match;
import org.apache.tapestry5.ioc.annotations.SubModule;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.RequestFilter;
import org.apache.tapestry5.services.RequestHandler;
import org.apache.tapestry5.services.Response;
import org.apache.tapestry5.upload.services.UploadModule;
import org.apache.tapestry5.upload.services.UploadSymbols;
import org.slf4j.Logger;
 
@SubModule({HibernateModule.class, HibernateCoreModule.class,UploadModule.class})
public class AppModule
{
    public static void bind(ServiceBinder binder)
    {
        binder.bind(StartDAO.class, StartDAOImpl.class);
    }
 
    public static void contributeFactoryDefaults(
            MappedConfiguration<String, Object> configuration)
    { 
        configuration.override(SymbolConstants.APPLICATION_VERSION, "1.0");
    }
 
    public static void contributeApplicationDefaults(
            MappedConfiguration<String, Object> configuration)
    {
    configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en");
        configuration.add(SymbolConstants.PRODUCTION_MODE, "false");
        configuration.add(UploadSymbols.FILESIZE_MAX, "50000000");
        configuration.add(SymbolConstants.APPLICATION_VERSION, "1.0-SNAPSHOT");
        configuration
.add(HibernateSymbols.ENTITY_SESSION_STATE_PERSISTENCE_STRATEGY_ENABLED,
"true");
    }
 
    @Match("*DAO")
public static void adviseTransactions(HibernateTransactionAdvisor advisor,
MethodAdviceReceiver receiver) {
advisor.addTransactionCommitAdvice(receiver);
}
 
    public RequestFilter buildTimingFilter(final Logger log)
    {
        return new RequestFilter()
        {
            public boolean service(Request request, Response response, RequestHandler handler)
                    throws IOException
            {
                long startTime = System.currentTimeMillis();
 
                try
                {
                    return handler.service(request, response);
                } finally
                {
                    long elapsed = System.currentTimeMillis() - startTime;
 
                    log.info(String.format("Request time: %d ms", elapsed));
                }
            }
        };
    }
 
   
    public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration,
                                         @Local
                                         RequestFilter filter)
    {
        configuration.add("Timing", filter);
    }
}
 运行 http://localhost/crud/usercreate能够添加数据了
相关文章
相关标签/搜索