hibernate 增刪改查 分頁小測試

好久沒有敲過了,來熟悉下hibernate,做了個小測試。


  1. 測試項目結構圖,關於導入jar包,可以參考 http://zhuws.blog.51cto.com/11134439/1932652 

wKioL1k4pqKwOpY0AAA2_UaBpfE211.png

2.hibernate.cfg.xml 配置

<!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="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.username">ssh</property>
        <property name="hibernate.connection.password">ssh</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:xe</property>
        
        <!-- 方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <!-- 可視化sql -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化sql,自動對可視化sql換行,對齊 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 爲getCurrentSession添加配置,保證事務中公用義個session -->
       <property name="current_session_context_class">thread</property>
        
        <!-- 映射文件配置 -->
        <mapping resource="User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

3.User.hbm.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
	
	<!-- name:是實體   table是表名稱 -->
	<class name="com.hib.entity.Users" table="TEST_USER">
		<id name="id">
			<!-- 主鍵自增策略,hibernate提供了幾種,這裏測試,先寫一個,後面會補充 -->
			<!-- 
				increment:主鍵自增策略
			 -->
			<generator class="increment"></generator>
		</id>

		<!-- name:是實體中屬性的名稱,column:是表中字段的名稱,type是數據類型 
			在這裏發現後面的 pass和 address 沒有寫column和type
			如果表字段和實體屬性名稱一致,可以省略不寫
		-->
		<property name="name" column="name" type="java.lang.String"/>
		<property name="pass"/>
		<property name="address"/>
	</class>

</hibernate-mapping>

4. 實體類Users

package com.hib.entity;

public class Users {
	private Integer id;
	private String name;
	private String pass;
	private String address;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Users(Integer id, String name, String pass, String address) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
		this.address = address;
	}
	public Users() {
		super();
	}
	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + name + ", pass=" + pass + ", address=" + address + "]";
	}
	
}

5. 建表,這裏只是測試,所以類型長度就不要在意了。

wKioL1k4py3RB2RvAABcpM184Go308.png

6.userDao

package com.hib.userDao;

import com.hib.entity.Users;

public interface UserDao {
	// 根據用戶id查詢用戶信息
	public Users queryUserById(Integer id);
	// 插入用戶
	public void insertUser(Users user);
	// 刪除用戶
	public void deleteUser(Integer id);
	// 更新用戶數據
	public void updateUser(Users user);
}

7.userDaoImpl

package com.hib.userDao.impl;

import org.hibernate.Session;

import com.hib.entity.Users;
import com.hib.userDao.UserDao;
import com.hib.util.HibUtil;

public class UserDaoImpl implements UserDao{
	
	// 根據用戶ID查詢
	@Override
	public Users queryUserById(Integer id) {
		Session session = HibUtil.getSession();
		Users users = session.get(Users.class, id);
		return users;
	}

	// 插入數據
	@Override
	public void insertUser(Users user) {
		Session session = HibUtil.getSession();
		session.save(user);
	}

	// 根據ID 刪除
	@Override
	public void deleteUser(Integer id) {
		Session session = HibUtil.getSession();
		Users users = session.get(Users.class, id);
		session.delete(users);
	}

	// 更新
	@Override
	public void updateUser(Users user) {
		Session session = HibUtil.getSession();
		session.update(user);
	}
}

8.userService

package com.hib.services;

import com.hib.entity.Users;

public interface UserServices {
	// 根據用戶id查詢用戶信息
		public Users queryUserById(Integer id);
		// 插入用戶
		public void insertUser(Users user);
		// 刪除用戶
		public void deleteUser(Integer id);
		// 更新用戶數據
		public void updateUser(Users user);
}

9.userServiceImpl

package com.hib.services.impl;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hib.entity.Users;
import com.hib.services.UserServices;
import com.hib.userDao.UserDao;
import com.hib.userDao.impl.UserDaoImpl;
import com.hib.util.HibUtil;

public class UserServicesImpl implements UserServices{
	private UserDao ud = new UserDaoImpl();
	
	@Override
	public Users queryUserById(Integer id) {
		Session session = null;
		Transaction tx = null;
		Users user = null;
		
		try {
			session = HibUtil.getSession();
			tx = session.beginTransaction();
			user = ud.queryUserById(id);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			throw new RuntimeException("查詢出錯!");
		}
		return user;
	}

	@Override
	public void insertUser(Users user) {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibUtil.getSession();
			tx = session.beginTransaction();
			ud.insertUser(user);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			throw new RuntimeException("插入錯誤!");
		}
	}

	@Override
	public void deleteUser(Integer id) {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibUtil.getSession();
			tx = session.beginTransaction();
			ud.deleteUser(id);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			throw new RuntimeException("刪除錯誤!");
		}
	}

	@Override
	public void updateUser(Users user) {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibUtil.getSession();
			tx = session.beginTransaction();
			ud.updateUser(user);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			throw new RuntimeException("更新錯誤!");
		}
	}

}

10.util 工具類

package com.hib.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * 
 * @author admin
 *	生產session
 */
public class HibUtil {
	private static Configuration cfg = new Configuration().configure();
	private static SessionFactory factory = cfg.buildSessionFactory();
	
	public static Session getSession(){
		return factory.getCurrentSession();
	}
	public static Session openSession(){
		return factory.openSession();
	}
}

11.測試

package com.hib.test;

import org.junit.Test;

import com.hib.entity.Users;
import com.hib.services.UserServices;
import com.hib.services.impl.UserServicesImpl;

public class TestUser {
	private UserServices us = new UserServicesImpl();
	
	// 插入數據
	@Test
	public void insert(){
		us.insertUser(new Users(null, "小李飛刀", "xlfd", "china"));
	}
	// 測試查詢
	@Test
	public void query(){
		Users users = us.queryUserById(1);
		System.out.println(users);
	}
	// 更新
	@Test
	public void update(){
		us.updateUser(new Users(1, "小李飛刀他媽", "xlfdtm", "AAAAA"));
	}
	// 刪除
	@Test
	public void delete(){
		us.deleteUser(1);
	}
}


12. dao 是和數據打交道

  service 是控制業務,事務,實際開發業務就是在這裏寫

 

注意: 這裏用的數據庫是oracle,測試時候,需要在hibernate.cfg.xml 中把數據庫名稱和密碼修改爲自己的。



13 下面寫一個通用分頁功能,那再來個實體,建一個表

實體 UserLogin

package com.hib.entity;

import java.util.Date;

public class UserLogin {
	private Integer id;
	private String name;
	private String passWord;
	private Date createDate;
	private String salt;
	private String email;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassWord() {
		return passWord;
	}
	public void setPassWord(String passWord) {
		this.passWord = passWord;
	}
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
	public String getSalt() {
		return salt;
	}
	public void setSalt(String salt) {
		this.salt = salt;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public UserLogin(Integer id, String name, String passWord, Date createDate, String salt, String email) {
		super();
		this.id = id;
		this.name = name;
		this.passWord = passWord;
		this.createDate = createDate;
		this.salt = salt;
		this.email = email;
	}
	public UserLogin() {
		super();
	}
	@Override
	public String toString() {
		return "UserLogin [id=" + id + ", name=" + name + ", passWord=" + passWord + ", createDate=" + createDate
				+ ", salt=" + salt + ", email=" + email + "]";
	}
}

表結構

wKioL1k5H63zt9G3AABuI_p86qk840.png

userlogin.hbm.xml 相關的映射配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
	
	<!-- name:是實體   table是表名稱 -->
	<class name="com.hib.entity.UserLogin" table="USER_LOGIN">
		<id name="id">
			<!-- 主鍵自增策略,hibernate提供了幾種,這裏測試,先寫一個,後面會補充 -->
			<!-- 
				increment:主鍵自增策略
			 -->
			<generator class="increment"></generator>
		</id>

		<!-- name:是實體中屬性的名稱,column:是表中字段的名稱,type是數據類型 
			在這裏發現後面的 pass和 address 沒有寫column和type
			如果表字段和實體屬性名稱一致,可以省略不寫
		-->
		<property name="name" column="name" type="java.lang.String"/>
		<property name="passWord"/>
		<property name="createDate"/>
		<property name="salt"/>
		<property name="email"/>
	</class>

</hibernate-mapping>

在 hibernate.cfg.xml 引入映射文件

 <mapping resource="userlogin.hbm.xml"/>



UserPage 分頁通用接口

package com.hib.userDao;

import java.util.List;

/**
 * @author admin
 * 用戶分頁  page 是第幾頁  number是頁的條數 sql 是查詢語句
 */
public interface UserPage {
	
	public <T> List<?> page(Integer page,Integer number,String sql);
}

14 UserPageImpl 實現接口

package com.hib.userDao.impl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.query.Query;

import com.hib.userDao.UserPage;
import com.hib.util.HibUtil;

/**
 * @author admin
 * 通用分頁功能
 */
public class UserPageImpl implements UserPage{

	@Override
	public <T> List<?> page(Integer page, Integer number, String sql) {
		Session session = HibUtil.getSession();
		Query<T> query = session.createQuery(sql);
		query.setFirstResult((page-1)*number);
		query.setMaxResults(number);
		List<T> list = query.list();
		return list;
	}
}

15 .UserPageService 業務

package com.hib.services;

import java.util.List;

public interface UserPageService {
	public <T> List<?> page(Integer page,Integer number,String sql);
}

16. UserPageServiceImpl 業務實現

package com.hib.services.impl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hib.services.UserPageService;
import com.hib.userDao.UserPage;
import com.hib.userDao.impl.UserPageImpl;
import com.hib.util.HibUtil;

public class UserPageServiceImpl implements UserPageService{

	private UserPage up = new UserPageImpl();
	
	@Override
	public <T> List<?> page(Integer page, Integer number, String sql) {
		Session session = null;
		Transaction tx = null;
		List<?> list = null;
		try {
			session = HibUtil.getSession();
			tx = session.beginTransaction();
			list = up.page(page, number, sql);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			throw new RuntimeException();
		}
		return list;
	}

}

17. 測試分頁

package com.hib.test;

import java.util.List;

import org.junit.Test;

import com.hib.entity.UserLogin;
import com.hib.entity.Users;
import com.hib.services.impl.UserPageServiceImpl;

public class TestPage {
	private UserPageServiceImpl up = new UserPageServiceImpl();
	//通用分頁測試 
	// Users 用戶測試
	@Test
	public void testPage(){
		String sql = "from Users";
		// 查詢第2頁的數據   每頁有4條
		List<Users> list = (List<Users>) up.page(2, 4, sql);
		for (Users users : list) {
			System.out.println(users);
		}
	}
	// UserLogin用戶測試分頁
	@Test
	public void testLoing(){
		String sql = "from UserLogin";
		List<UserLogin> list = (List<UserLogin>) up.page(3, 10, sql);
		for (UserLogin userLogin : list) {
			System.out.println(userLogin);
		}
	}
}


下面是測試結果

wKioL1k5IQODgguFAADII6vCr70089.png





wKiom1k5IMPjESwVAAExifCYyzY902.png




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章