spring4之初步內建hibernate5
在《spring4之搭建restful風格的web服務》一文的基礎上和hibernate5快速內建,達到restful的控制器調用DAO操作資料庫的目标。
當然,在此基礎上可以繼續進化為控制器調動service層,事務控制在service層,由service調用DAO完成資料庫操作,那就是下一步的事情了。
準備lib
下載下傳hibernate5.2.4,解壓後拷貝lib/required下的jar包到sh web工程的WEB-INF/lib
下載下傳mysql驅動mysql-connector-java-5.1.40-bin.jar
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
放入WEB/lib
建立持久層實體
建立包sh.pojo存放持久層的實體
建立實體Person,映射表person
package sh.pojo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="person")
public class Person {
private long id;
private String name;
private int age;
@Id
@GeneratedValue
@Column(name="id")
public long getId(){
return id;
}
public void setId(long id){
this.id = id;
}
@Column(name="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="age")
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
編輯hibernate配置
在WEB-INF下建立hibernate-cfg.xml
其中current_session_context_class設定為thread,是保證能從目前線程中擷取到事務會話的方式。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.pool_size">1</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider
</property>
<property name="show_sql">true</property>
<mapping class="sh.pojo.Person" />
</session-factory>
</hibernate-configuration>
建立資料庫通路層實體
建立包sh.dao
建立java接口PersonDAO
package sh.dao;
import java.util.List;
import sh.pojo.Person;
public interface PersonDAO {
public List<Person> getAll();
public void add(Person person);
}
建立DAO實作PersonDAOImpl
在實作裡由方法自己實作事務控制
package sh.dao;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import sh.pojo.Person;
public class PersonDAOImpl implements PersonDAO {
@Autowrired
private SessionFactory sessionFactory;
@Override
public List<Person> getAll() {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
List<Person> all = null;
try{
all = session.createQuery("from Person").getResultList();
}catch(HibernateException e){
session.getTransaction().rollback();
}
session.getTransaction().commit();
return all;
}
@Override
public void add(Person person) {
Session session = sessionFactory.getCurrentSession();
try{
session.beginTransaction();
session.save(person);
}catch(HibernateException e){
session.getTransaction().rollback();
}
session.getTransaction().commit();
}
}
編輯spring配置
編輯sh工程下的springmvc-servlet.xml:
- 添加資料源
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
- 配置會話工廠
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="/WEB-INF/hibernate-cfg.xml" />
</bean>
- 配置事務管理器
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
- 配置DAO
<bean id="personDAO" class="sh.dao.PersonDAOImpl">
</bean>
修改controller
在sh.controller中找到HelloController類中添加
@Autowired
PersonDAO personDAO;
并将addPerson和getAllPerson改為如下:
@RequestMapping(value = "/person", method = RequestMethod.POST)
public @ResponseBody
Person addPerson(@RequestBody Person person) {
sh.pojo.Person p = new sh.pojo.Person();
p.setAge(person.getAge());
p.setName(person.getName());
personDAO.add(p);
return person;
}
@RequestMapping(value = "/person", method = RequestMethod.GET)
public @ResponseBody
List<Person> getAllPerson() {
List<sh.pojo.Person> list = personDAO.getAll();
List<Person> list2= new ArrayList<Person>();
if(list!=null){
for(sh.pojo.Person p:list){
Person p2 = new Person();
p2.setAge(p.getAge());
p2.setName(p.getName());
list2.add(p2);
}
}
return list2;
}
測試
利用postman發送post請求
在浏覽器中通路并檢視傳回結果