基於XML映射文件實現數據的CURD
項目結構
- configuration文件需要放在resources根目錄中。
- **.hbm.xml文件要和實體類放在一起 3.
項目開發步驟
1. hibernate.cfg.xml
2. User.java
3. User.hbm.xml
4. UserDao.java
5. UserDaoImpl.java
6. UserDaoTest.java
hibernate.cfg.xml
<?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>
<!--hibernate鏈接的基本信息,數據庫信息-->
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://localhost:5432/hibernate</property>
<property name="connection.username">postgres</property>
<property name="connection.password">123456</property>
<!--hibernate方言-->
<property name="dialect"> org.hibernate.dialect.PostgresPlusDialect</property>
<!--是否打印sql-->
<!--
update,存在就修改,不存在就創建
create,每次都刪除表然後再重新創建表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!--hibernate映射文件-->
<mapping resource="cn/edu/scnu/xmlcurd/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<!--Hibernate 3.0 dtd-->
User.java
package cn.edu.scnu.xmlcurd.entity;
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private int id;
private String username;
private String password;
private Date registerDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getRegisterDate() {
return registerDate;
}
public void setRegisterDate(Date registerDate) {
this.registerDate = registerDate;
}
@Override
public String toString() {
return "UserEntity{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", registerDate=" +
new SimpleDateFormat("yyyy-MM-dd").format(registerDate) +
'}';
}
}
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
**.hbm.xml應該和類名相同
-->
<hibernate-mapping package="cn.edu.scnu.xmlcurd">
<!--
class 中的name應該對應實體類的類名
class 中的table應該對應數據庫表的名字
class 中的catalog應該對應數據庫的名字
-->
<class name="cn.edu.scnu.xmlcurd.entity.User" table="users" catalog="hibernate">
<!--
每一個實體類都必須有一個id屬性
generator:主鍵生成策略
increment(hibernate遞增方式),
identity(蘇杭鉅款底層自增),
sequence(數據庫序列生成機制),
hilo(hibernate高低位算法生成),
native(自動識別數據庫),
assigned(應用程序產生),當不指定generator時,默認這種策略
-->
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="native"/>
</id>
<!--
屬性中的name對應實體類中的屬性名
屬性中的type對應實體類中屬性的類型
-->
<property name="username" type="java.lang.String">
<column name="username" length="16" not-null="true"/>
</property>
<property name="password" type="java.lang.String">
<column name="password" length="16" not-null="true"/>
</property>
<property name="registerDate" type="java.util.Date">
<column name="registerDate" not-null="true"/>
</property>
</class>
</hibernate-mapping>
UserDao.java
package cn.edu.scnu.xmlcurd.dao;
import cn.edu.scnu.xmlcurd.entity.User;
import java.util.List;
public interface UserDao {
void save(User user);
void delete(Integer id);
void update(User user,Integer id);
User findById(Integer id);
List<User> getAll();
}
UserDaoImpl.java
package cn.edu.scnu.xmlcurd.dao.impl;
import cn.edu.scnu.xmlcurd.dao.UserDao;
import cn.edu.scnu.xmlcurd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import java.util.ArrayList;
import java.util.List;
/*
具體流程:
提供sessionFactory
通過sessionFactory獲得session
打開session
開始transaction
上面都是初始化
事務開始
下面都是結束
提交transaction
關閉session
關閉sessionFactory
*/
/**
* 注意:
* get方法獲取數據,如果數據不存在會返回null
* load方法獲取數據,如果數據不存在會出現ObjectNotFoundException異常,因此使用load方法時,數據必須存在
*/
public class UserDaoImpl implements UserDao {
private SessionFactory sessionFactory;
//初始化
private Session session;
private Transaction transaction;
private void init(){
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
//銷燬
private void destroy(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Override
public void save(User user) {
try{
init();
session.save(user);
destroy();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void delete(Integer id) {
}
@Override
public void update(User user,Integer id) {
try {
init();
user.setId(id);
session.update(user);
destroy();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public User findById(Integer id) {
User user = new User();
try{
init();
user = session.get(User.class,1);
destroy();
}catch (Exception e){
e.printStackTrace();
}
return user;
//Load方式
/*
User user = new User();
try{
init();
user = session.load(User.class,1);
destroy();
}catch (Exception e){
e.printStackTrace();
}
return user;
*/
}
@Override
public List<User> getAll() {
List<User> users=new ArrayList<>();
try{
init();
users = session.createQuery("from User").list();
destroy();
}catch (Exception e){
e.printStackTrace();
}
return users;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
UserDaoTest.java
package cn.edu.scnu.xmlcurd.dao.impl;
import cn.edu.scnu.xmlcurd.dao.UserDao;
import cn.edu.scnu.xmlcurd.entity.User;
import org.hibernate.cfg.Configuration;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.*;
public class UserDaoImplTest {
private UserDaoImpl userDao;
@Before
public void before(){
userDao = new UserDaoImpl();
userDao.setSessionFactory(new Configuration().configure().buildSessionFactory());
System.out.println(userDao.getSessionFactory());
}
@Test
public void save() {
User user = new User();
user.setUsername("小李");
user.setPassword("12345");
user.setRegisterDate(new Date());
userDao.save(user);
}
@Test
public void delete() {
userDao.delete(1);
}
@Test
public void update() {
User user = new User();
user.setUsername("喬峯");
user.setPassword("12345");
user.setRegisterDate(new Date());
userDao.update(user,1);
}
@Test
public void findById() {
User user = userDao.findById(1);
System.out.println(user.toString());
}
@Test
public void getAll() {
List<User> users = userDao.getAll();
for(User user :users){
System.out.println(user.toString());
}
}
}