好久沒有敲過了,來熟悉下hibernate,做了個小測試。
測試項目結構圖,關於導入jar包,可以參考 http://zhuws.blog.51cto.com/11134439/1932652
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. 建表,這裏只是測試,所以類型長度就不要在意了。
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 + "]"; } }
表結構
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); } } }
下面是測試結果