最近在學習hibernate,嘗試實現簡單的增刪改查,映射配置。
現在有兩個表,一個user表,一個role表。
現在要用hibernate進行增刪改查功能,首先創建項目,導入需要的包,建好大致的結構。
現在分別看代碼:
1、hibernate.cfg.xml
新建xml文件,配置好數據庫信息
<!DOCTYPE hibernate-configuration PUBLIC
?"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
?"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
?<hibernate-configuration>
?<!-- 配置會話工廠 hibernate 核心 管理數據庫連接池 -->
?<session-factory>
? <!-- 1.配置數據庫連接參數 -->
? <!-- 1.1配置jdbc四個基本連接參數 -->
? <property name="hibernate.connection.username">root</property>
? <property name="hibernate.connection.password">admin</property>
? <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/interview</property>
? <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
? <!-- 1.2配置 hibernate使用的方言 -->
? <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
? <!-- 2.配置其他相關屬性 -->
? <!-- 2.1自動建表 -->
? <property name="hibernate.hbm2ddl.auto">update</property>
? <!-- 2.2在日志中輸出sql -->
? <property name="hibernate.show_sql">true</property>?
? <!-- 2.3格式化sql -->
? <property name="hibernate.format_sql">true</property>?
? <!-- 開啟事務 -->
? <property name="hibernate.connection.autocommit">true</property>
? <!-- 配置c3p0數據庫連接池 -->
? <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
? <property name="hibernate.c3p0.min_size">5</property>
? <property name="hibernate.c3p0.max_size">50</property>
? <property name="hibernate.c3p0.timeout">120</property>
? <property name="hibernate.c3p0.idle_test_period">3000</property> ?
? <!-- 3.加載映射文件 -->
? <mapping resource="com/mytest/model/User.hbm.xml"/>?
? <mapping resource="com/mytest/model/Role.hbm.xml"/>?
?</session-factory>?
?</hibernate-configuration>
2、HibernateUtils.java
創建HibernateUtils類,創建sessionFactory,讀取hibernate.cfg.xml文件,代碼中的方法是hibernate4.x的寫法,每個版本有所不同,請自行百度搜索。
packagecom.mytest.util;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.boot.registry.StandardServiceRegistryBuilder;
importorg.hibernate.cfg.Configuration;
importorg.hibernate.service.ServiceRegistry;
publicclassHibernateUtils{
/*
*讀取Hibernate.cfg.xml文件
*/
privatestaticfinalSessionFactorysessionFactory=buildSessionFactory();
privatestaticSessionFactorybuildSessionFactory(){
Configurationcfg=newConfiguration().configure("com/mytest/action/hibernate.cfg.xml");
ServiceRegistryserviceRegistry=newStandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
returncfg.buildSessionFactory(serviceRegistry);
}
publicstaticSessionFactorygetSessionFactory(){
returnsessionFactory;
}
}
3、User.java、Role.java
新建user bean類,不多解釋
packagecom.mytest.util;
importjava.util.Date;
importjava.util.HashSet;
importjava.util.Set;
publicclassUser{
privateIntegeruserId;
privateStringuserName;
privateStringemailAddress;
privateStringpassword;
privateDatecreateDate;
privateDatelastUpdateDate;
privateSetroles=newHashSet();
publicUser(){
super();
}
publicIntegergetUserId(){
returnuserId;
}
publicvoidsetUserId(IntegeruserId){
this.userId=userId;
}
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetEmailAddress(){
returnemailAddress;
}
publicvoidsetEmailAddress(StringemailAddress){
this.emailAddress=emailAddress;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicDategetCreateDate(){
returncreateDate;
}
publicvoidsetCreateDate(DatecreateDate){
this.createDate=createDate;
}
publicDategetLastUpdateDate(){
returnlastUpdateDate;
}
publicvoidsetLastUpdateDate(DatelastUpdateDate){
this.lastUpdateDate=lastUpdateDate;
}
publicSetgetRoles(){
returnroles;
}
publicvoidsetRoles(Setroles){
this.roles=roles;
}
}
packagecom.mytest.util;
importjava.util.HashSet;
importjava.util.Set;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
importjavax.persistence.ManyToMany;
publicclassRole{
privateIntegerroleId;
privateStringroleName;
privateStringdescription;
privateSetusers=newHashSet();
publicRole(){
super();
}
publicIntegergetRoleId(){
returnroleId;
}
publicvoidsetRoleId(IntegerroleId){
this.roleId=roleId;
}
publicStringgetRoleName(){
returnroleName;
}
publicvoidsetRoleName(StringroleName){
this.roleName=roleName;
}
publicStringgetDescription(){
returndescription;
}
publicvoidsetDescription(Stringdescription){
this.description=description;
}
publicSetgetUsers(){
returnusers;
}
publicvoidsetUsers(Setusers){
this.users=users;
}
}
4、User.hbm.xml、Role.hbm.xml
重點就是映射文件,新建兩個xml文件,配置實體和表的映射,這里我用的是many-to-many。
想法是一個用戶可以有多個角色,一個角色也可以對應多個用戶。詳細看注解。
<?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">
<hibernate-mapping package="com.mytest.model">
? ? ? ? <class name="com.mytest.util.User" table="user">
? ? ? ? ?<id name="userId" column="userId" type="integer">
? ? ? ? ? ? ?<generator class="increment"></generator>
? ? ? ? ?</id>
? ? ? ? ?<property name="userName" ?type="string">
? ? ? ? ? ? ?<column name="userName"></column>
? ? ? ? ?</property>
? ? ? ? ?<property name="emailAddress" ?type="string">
? ? ? ? ? ? ?<column name="emailAddress"></column>
? ? ? ? ?</property>
? ? ? ? ?<property name="password" ?type="string">
? ? ? ? ? ? ?<column name="password"></column>
? ? ? ? ?</property>
? ? ? ? ?<property name="createDate" ?type="date">
? ? ? ? ? ? ?<column name="createDate"></column>
? ? ? ? ?</property>
? ? ? ? ?<property name="lastUpdateDate" ?type="date">
? ? ? ? ? ? ?<column name="lastUpdateDate"></column>
? ? ? ? ?</property>
<!--類User中的集合名為roles。關聯表名為:user_role-->
? ? ? ? ?<set name="roles" ?table="user_role"> ?
<!--將字段user_id加入user_role表中,作為外鍵,并指向User對應的表中字段-->
? ? ? ? ? ? <key column="user_id"/>
<!--集合roles成員的類型為Role;將字段role_id加入user_role表中-->
? ? ? ? ? ? <many-to-many class="com.mytest.util.Role" column="role_id" />
? ? ? ? </set>
? ? ?</class>
</hibernate-mapping>
<?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">
<hibernate-mapping package="com.mytest.model">
? ? ? ? <class name="com.mytest.util.Role" table="role">
? ? ? ? ?<id name="roleId" column="roleId" type="integer">
? ? ? ? ? ? ?<generator class="increment"></generator>
? ? ? ? ?</id>
? ? ? ? ?<property name="roleName" ?type="string">
? ? ? ? ? ? ?<column name="roleName"></column>
? ? ? ? ?</property>
? ? ? ? ?<property name="description" ?type="string">
? ? ? ? ? ? ?<column name="description"></column>
? ? ? ? ?</property>
? ? ? <!--類Role中的集合名為users。關聯表名為:user_role-->
? ? ? ? ? <set name="users" table="user_role" > ?
? ? ? <!--將字段role_id加入user_role表中,作為外鍵,并指向Role對應的表中字段-->
? ? ? ? ? ? <key column="role_id" not-null="true"/> ?
? ? ?<!--集合users成員的類型為User;將字段user_id加入user_role表中-->
? ? ? ? ? ? <many-to-many column="user_id" class="com.mytest.util.User" />
? ? ? ? ? </set>?
? ? ?</class>
</hibernate-mapping>
5、Test.java
最后建一個測試類,寫好增刪改查的方法
packagecom.mytest.action;
importjava.util.Date;
importjava.util.HashSet;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Set;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importcom.mytest.util.HibernateUtils;
importcom.mytest.util.Role;
importcom.mytest.util.User;
publicclassTest{
privateSessionFactorysessionFactory=HibernateUtils.getSessionFactory();
/**
* 1、增加User張三
*/
publicvoidaddUser(){
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Useruser=newUser();
user.setUserId(1);
user.setUserName("張三");
user.setEmailAddress("zhang3@sina.com");
user.setPassword("123456");
user.setCreateDate(newDate());
user.setLastUpdateDate(newDate());
session.save(user);
session.getTransaction().commit();
session.close();
}
/**
* 2、增加Role
*/
publicvoidaddRole(){
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Rolerole=newRole();
role.setRoleId(1);
role.setRoleName("Admin");
role.setDescription("擁有最高權限");
session.save(role);
Rolerole2=newRole();
role2.setRoleId(2);
role2.setRoleName("Editor");
role2.setDescription("擁有編輯者權限");
session.save(role2);
Rolerole3=newRole();
role3.setRoleId(3);
role3.setRoleName("Reader");
role3.setDescription("擁有只讀權限");
session.save(role3);
session.getTransaction().commit();
session.close();
}
/**
* 3、查詢用戶張三的信息
*/
publicvoidselectUser(){
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Queryquery=session.createQuery("from User where userId= '1'");
Listlist=query.list();
for(Useruser:list){
System.out.println("用戶ID:"+user.getUserId());
System.out.println("用戶姓名:"+user.getUserName());
System.out.println("郵箱:"+user.getEmailAddress());
System.out.println("密碼:"+user.getPassword());
System.out.println("創建日期:"+user.getCreateDate());
System.out.println("最后更新日:"+user.getLastUpdateDate());
}
session.getTransaction().commit();
session.close();
}
/**
* 4、更新用戶張三的名字和密碼
*/
publicvoidupdateUser(){
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Useruser=(User)session.get(User.class,1);
user.setPassword("abcdefg");
session.update(user);
session.getTransaction().commit();
System.out.println("成功更新"+"【"+user.getUserName()+"】"+"的信息!");
System.out.println("用戶ID:"+user.getUserId());
System.out.println("用戶姓名:"+user.getUserName());
System.out.println("郵箱:"+user.getEmailAddress());
System.out.println("密碼:"+user.getPassword());
System.out.println("創建日期:"+user.getCreateDate());
System.out.println("最后更新日:"+user.getLastUpdateDate());
session.close();
}
/**
* 5、刪除張三信息
*/
publicvoiddeleteUser(){
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Useruser=(User)session.get(User.class,"1");
session.delete(user);
session.getTransaction().commit();
System.out.println("成功刪除"+"【"+user.getUserName()+"】"+"的信息!");
session.close();
}
/**
* 6、新建李四、王五并賦予角色為Admin
*/
public void addUserAndRole() { ?
Session session = sessionFactory.openSession(); ?
? ? session.beginTransaction(); ?
? ? ? ? User user2 = new User();?
? ? ? ? user2.setUserName("李四"); ?
? ? ? ? user2.setEmailAddress("li4@sina.com");
? ? ? ? user2.setPassword("123456");
? ? ? ? user2.setCreateDate(new Date()); ?
? ? ? ? user2.setLastUpdateDate(new Date());?
? ? ? ? User user3 = new User();???
? ? ? ? user3.setUserName("王五"); ?
? ? ? ? user3.setEmailAddress("wang5@sina.com");
? ? ? ? user3.setPassword("123456");
? ? ? ? user3.setCreateDate(new Date()); ?
? ? ? ? user3.setLastUpdateDate(new Date());?
? ? ? ? Role role = new Role();?
? ? ? ? role.setRoleName("Admin"); ?
? ? ? ? role.setDescription("擁有最高權限");? ? ?
? ? ? ? session.save(role);?? ? ? ??
? ? ? ? Role role2 = new Role();?
? ? ? ? role2.setRoleName("Editor"); ?
? ? ? ? role2.setDescription("擁有編輯者權限");
? ? ? ? session.save(role2);?
? ? ? ? Role role3 = new Role();?
? ? ? ? role3.setRoleName("Reader"); ?
? ? ? ? role3.setDescription("擁有只讀權限");
? ? ? ? session.save(role3);? ? ? ?
? ? ? ? Set<Role> u2Roles ?= new HashSet<Role>();? ?
? ? ? ?u2Roles.add(role);
? ? ? ? user2.setRoles(u2Roles);
? ? ? ? session.save(user2);
? ? ? ? Set<Role> u3Roles ?= new HashSet<Role>();
? ? ? ? u3Roles.add(role);
? ? ? ? user3.setRoles(u3Roles);
? ? ? ? session.save(user3);
? ? ? ? session.getTransaction().commit(); ?
? ? ? ? session.close();
? ? ? ? System.out.println("成功分配給"+ user2.getUserName()+"【"+role.getRoleName()+"】"+"權限!");
? ? ? ? System.out.println("成功分配給"+ user3.getUserName()+"【"+role.getRoleName()+"】"+"權限!");
? }
/**
* 7、根據角色主鍵Admin查詢該角色下所有的用戶信息
*/
publicvoidselectUserByRole(){
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
Queryquery=session.createQuery("SELECT "
+"u.userId,"
+"u.userName,"
+"u.emailAddress,"
+"u.password,"
+"u.createDate,"
+"u.lastUpdateDate "
+"FROM User u WHERE u.userId IN (SELECT ur.user_id FROM user_role ur WHERE ur.role_id = '1'");
Listlist=query.list();
for(Useruser:list){
System.out.println("用戶ID:"+user.getUserId());
System.out.println("用戶姓名:"+user.getUserName());
System.out.println("郵箱:"+user.getEmailAddress());
System.out.println("密碼:"+user.getPassword());
System.out.println("創建日期:"+user.getCreateDate());
System.out.println("最后更新日:"+user.getLastUpdateDate());
}
session.getTransaction().commit();
session.close();
/*List list = query.list();
Iterator it= list.iterator();
while(it.hasNext()){
User user=(User)it.next();
System.out.println("用戶ID:"+ user.getUserId());
System.out.println("用戶姓名:"+user.getUserName());
System.out.println("郵箱:"+user.getEmailAddress());
System.out.println("密碼:"+user.getPassword());
System.out.println("創建日期:"+ user.getCreateDate());
System.out.println("最后更新日:"+ user.getLastUpdateDate());
}*/
}
/**
* 主函數
*/
publicstaticvoidmain(String[]args){
newTest().addUser();
newTest().addRole();
newTest().selectUser();
newTest().updateUser();
newTest().deleteUser();
newTest().addUserAndRole();
newTest().selectUserByRole();
}
}
執行結果:
1、
2、
3、
4、
5、
6、這里我把第3個addRole放到一起了,也可以單獨取權限Id賦值。
這里運行完,系統生成了一個關聯表,就是我們再xml文件里配置的user_id表。