Hibernate实现简单的用户和角色的增、删、改、查

最近在学习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表。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,790评论 0 11
  • 本文包括:1、Hibernate的持久化类2、Hibernate 持久化对象的三个状态(难点)3、Hibernat...
    廖少少阅读 1,435评论 0 13
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 1,344评论 0 2
  • 01 之前看过一句话说,分手以后还会联系的只有两种情况,一种是没睡过,一种是没睡够。 话糙理不糙,想一想确实也是这...
    桃酥酥酥酥阅读 1,130评论 0 4