Form
Servlet
BeanAutowiringFilterServlet
一般的servlet都继承的是HttpServlet
构筑环境,@Autowired才可以被使用
- servlet 启动后,首先启动doGet方法。
- 跳转到index.jsp
- index.jsp 发送表单后,调用doPost
- 将表单数据添加到DB中。(通过DAO,对Entity进行追加,相当于对DB insert)
- 重定向sendRedirect到这个servlet
package jp.tuyano.spring.data1;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
public class MyPersonDataServlet extends BeanAutowiringFilterServlet {
private static final long serialVersionUID = 1L;
@Autowired
private MyPersonDataDaoImpl dao;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
List<MyPersonData> list = dao.getAllEntity();
request.setAttribute("entities", list);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String mail = request.getParameter("mail");
int age = Integer.parseInt(request.getParameter("age"));
MyPersonData entity = new MyPersonData(name, mail, age);
dao.addEntity(entity);
response.sendRedirect("person");
}
}
Dao
package jp.tuyano.spring.data1;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.stereotype.Service;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
@Service
public class MyPersonDataDaoImpl
extends AbstractMyPerrsonDataDao {
@Autowired
private ApplicationContext context;
@Autowired
private LocalContainerEntityManagerFactoryBean factory;
@PersistenceContext
// 通过@PersistenceContext 直接获得manager对象
// 相当于manager = factory.getNativeEntityManagerFactory().createEntityManager();
// 该对象用于管理Entity
private EntityManager manager;
public MyPersonDataDaoImpl() {
init();
}
public List<MyPersonData> getAllEntity() {
Query query = manager.createQuery("from MyPersonData");
return query.getResultList();
}
public List<MyPersonData> findByField(String field, String find) {
Query query = manager.createQuery("from MyPersonData where "
+ field + " = '" + find + "'");
return query.getResultList();
}
public void addEntity(Object entity) {
EntityManager manager = factory.
getNativeEntityManagerFactory().createEntityManager();
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
manager.persist(entity);
System.out.println("add:" + entity);
manager.flush();
transaction.commit();
}
public void updateEntity(Object entity) {
EntityManager manager = factory.
getNativeEntityManagerFactory().createEntityManager();
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
manager.merge(entity);
manager.flush();
transaction.commit();
}
public void removeEntity(Object data) {
EntityManager manager = factory.
getNativeEntityManagerFactory().createEntityManager();
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
manager.remove(data);
manager.flush();
transaction.commit();
}
public void removeEntity(Long id) {
jp.tuyano.spring.data1.MyPersonData entity = manager.
find(jp.tuyano.spring.data1.MyPersonData.class, 1L);
this.removeEntity(entity);
}
}
application-config.xml
application-config.xml 管理对象(相当于bean.xml)
<context:component-scan base-package="jp.tuyano.spring.data1" />`
会对有@Service标签的对象进行自动入注
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:spring/bean.properties" />
<context:annotation-config />
<context:component-scan base-package="jp.tuyano.spring.data1" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database" value="${jdbc.type}" />
</bean>
</property>
</bean>
<!-- jdbc -->
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="${jdbc.scriptLocation}" />
</jdbc:embedded-database>
</beans>
Query
用户动态操作DB
package jp.tuyano.spring.data1;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@Table(name="mypersondata")
//
@NamedQueries({
@NamedQuery(name = "MyPersonData.getAllEntity", query = "FROM MyPersonData"),
@NamedQuery(name = "MyPersonData.findByName", query = "FROM MyPersonData WHERE name = :value")
})
public class MyPersonData {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(length=50, nullable=false)
private String name;
@Column(length=100, nullable=true)
private String mail;
@Column(nullable=true)
private int age;
public MyPersonData() {
}
public MyPersonData(String name, String mail, int age) {
this();
this.name = name;
this.mail = mail;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public long getId() {
return id;
}
@Override
public String toString() {
return "MyPersonData [id=" + id + ", name=" + name + ", mail=" + mail
+ ", age=" + age + "]";
}
}
使用Query
在DAO中使用
-MyPersonDataDaoImpl.java
public List<MyPersonData> getAllEntity() {
Query query = manager.createNamedQuery("MyPersonData.getAllEntity");
return query.getResultList();
}
public List<MyPersonData> findByName(String value) {
Query query = manager.createNamedQuery("MyPersonData.findByName")
.setParameter("value", value);
return query.getResultList();
}
JpaRepository
框架已经写好的一些对DB的简单操作
使用的时候继承就行extends JpaRepository<MyPersonData, Long>
package jp.tuyano.spring.data1;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface MyPersonDataDaoRepository
extends JpaRepository<MyPersonData, Long> {
public List<MyPersonData> findByName(String name);
public List<MyPersonData> findByMail(String mail);
public List<MyPersonData> findByAge(Integer age);
public List<MyPersonData> findByNameLike(String name);
public List<MyPersonData> findByMailLike(String mail);
public List<MyPersonData> findByNameOrMail
(String name, String mail);
public List<MyPersonData> findByNameLikeOrMailLike
(String name, String mail);
public List<MyPersonData> findByAgeGreaterThan(Integer age);
public List<MyPersonData> findByAgeLessThan(Integer age);
public List<MyPersonData> findByAgeGreaterThanOrAgeLessThan
(Integer age0, Integer age1);
@Query("select name from MyPersonData")
public List<String> getAllName();
}