hibernate 示例项目简记

概述

一种对象关系映射(Object Relational Mapping)框架,专注于Java对象与关系型数据库之间的映射,助力开发者实现数据持久化。

参考链接  hibernate框架教程

特点

反射实现

相关对象/概念

org.hibernate.SessionFactory  生成org.hibernate.Session的工厂,数据源代理,多数据源须配备多个工厂

org.hibernate.Session  应用程序和持久化存储介质之间的一个单线程、短周期的轻量级会话对象

持久化对象/集合  与一个session关联,session关闭后失去持久化特性

瞬态(transient)对象/集合   未与session相关联

org.hibernate.connection.ConnectionProvider  JDBC 连接的工厂和连接池,应用程序不可用,可被扩展或自定义实现

org.hibernate.TransactionFactory  生成transaction对象的工厂,可扩展或自定义实现

 

****************************  项目实例  ****************************

项目结构

 

简易hibernate项目结构

 

maven 依赖

<dependency>

      <groupId>org.hibernate</groupId>

      <artifactId>hibernate-core</artifactId>

      <version>5.3.7.Final</version>

</dependency>

设置xml资源文件路径(在pom文件中)

<build>

        <resources>

            <resource>

                <directory>src/main/java</directory>

                <includes>

                    <include>**/*.xml</include>

                </includes>

            </resource>

        </resources>

</build>

user 实体

public class User {

    private int id;

    private String username;

    private String password;

    // 省略 setter & getter

}

User.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- 映射对应的 package -->

<hibernate-mapping package="shiyanlou.test.hibernate.entity">

    <class name="User" table="user_info">

        <!-- id主键 和其他属性对应表中相应的字段(这些都是在 User.java 实体类中定义的) -->

        <id name="id" column="user_id"/>

        <property name="username" column="user_username"></property>

        <property name="password" column="user_password"></property>

    </class>

</hibernate-mapping>

hibernate 配置文件 hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- 数据库驱动 -->

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <!-- jdbc 的连接 url 和数据库 -->

        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>

        <!-- 数据库用户名 -->

        <property name="connection.username">root</property>

        <!-- root用户数据库密码 -->

        <property name="connection.password">1234</property>

        <!-- <property name="connection.pool_size">1</property>-->

        <!-- 数据库方言 (记得查看自己的数据库版本,选择正确的方言)-->

        <property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>

 

        <!-- 打印执行的SQL -->

        <property name="show_sql">true</property>

        <!-- 格式化打印SQL -->

        <property name="format_sql">true</property>

        <!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->

        <property name="hbm2ddl.auto">update</property>

        <!-- 映射文件 (从java下的包开始,填写正确的路径) -->

        <mapping resource="shiyanlou/test/hibernate/entity/User.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

测试类

public class Test {

    public static void main(String[] args) {

        // 获取 Hibernate 配置信息

        Configuration configuration = new Configuration().configure();

        @SuppressWarnings("deprecation")

        // 根据 configuration 建立 sessionFactory

        SessionFactory sessionFactory = configuration.buildSessionFactory();

        // 开启 session(相当于开启 JDBC 的 connection)

        Session session = sessionFactory.openSession();

        // 创建并开启事务对象

        session.beginTransaction();

        // 新建对象,并赋值

        User user = new User();

        user.setId(1);

        user.setUsername("admin");

        user.setPassword("admin");

        // 保存对象

        session.save(user);

        // 提交事务

        session.getTransaction().commit();

        // 关闭 session 和 sessionFactory

        session.close();

        sessionFactory.close();

    }

}

运行这个测试类,或者    

注意查看数据库中是否新增一条数据。

**  使用注解代替User.hbm.xml  **

@Entity     // javax包下

public class User {

    @id   // javax包下

    private int id;

    private String username;

    private String password;

    // 省略 setter & getter

}

 

****************************  增删改查  ****************************

新增

session.save(obj)

修改

session.update(obj);

session.createQuery("update User set password = ?1 where id = ?2")   // 这是 HQL写法,这里使用java类和java属性

            .setParameter(1, "123")  // ?1 处的参数  如果只有一个参数,可以不写数字,但仍然从1开始

            .setParameter(2, 1)  // ?2 处的参数

            .executeUpdate();   //  执行更新。推荐这种连写方式,从给定HQL,设定参数,到执行一步完成

//          .list()  // 此处为查询时使用的方法

session.createSQLQuery("update user set password = :psd where id = :id")  // 原生SQL写法,使用表和列,注意驼峰命名时正确的列名

            .setParameter("psd", "123")  // 直接使用 语句中的参数名称

            .setParameter("id", 1)   // 原生SQL也可以使用 ?(问号)传参,规则与HQL相同

            .executeUpdate();   //  执行更新

//          .list();  // 执行查询

 

删除

session.delete(obj);

session.createQuery("delete from User where id = ?1")

            .setParameter(1, 1)

或者使用原生SQL,此处省略

 

查询

使用HQL查询实体得到的都是该实体对象,此处不再赘述。重点说说原生SQL。

// 这样查询将得到map列表

List<map> mList = session.createSQLQuery(sql)

            .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)  // 设定类型转换,此方法已过时

            .list();

// 这样查询得到实体列表

List<Employee>  list = session.createSQLQuery(sql)

            .addEntity(Employee.class)  // 设定返回实体类型

            .list();

 

****************************  映射关系  ****************************

集合映射

在实体对应的 **.hbm.xml文件中

<!-- set集合 -->

<set name="address" table="t_address">  <!-- java属性名,子表表名 -->

            <key column="uid"></key>  <!-- 外键在字表中的列名 -->

            <element column="address" type="string"></element>  <!-- 子表中元素的名称,类型 -->

</set>

<!-- list集合 -->

<list name="addressList" table="t_addressList">

              <key column="uid"></key> 

              <list-index column="idx"></list-index>  <!-- list序列,指定存储列名 -->

              <element column="address" type="string"></element>

</list>

<!-- map集合 -->

<map name="addressMap" table="t_addressMap">

              <key column="uid"></key>

              <map-key type="string" column="shortName"></map-key>  <!-- map键存储列名 -->

              <element type="string" column="address"></element>

</map>

 

一对多

在 “一” 对应的 **.hbm.xml文件中

<set name="users" >  <!--  “一”的实体中的属性名,这里表示一组User -->

            <key column="group_id" ></key>  <!-- 外键名称,将会创建在 user 表中 -->

            <one-to-many class="shiyanlou.hibernate.onetomany.entity.User" />    <!--  表示“多” 的实体-->

</set> 

 

多对一

在 “多” 对应的 **.hbm.xml文件中

<many-to-one name="group" column="group_id"></many-to-one>  <!-- “多”的实体中java属性名,在本表中的外键名 -->

!注意,在一对关系中,比如班主任对于该班学生是“一对多”关系,只需要在班主任实体或者学生实体任选一方维护即可。

 

多对多

在course实体对应的 **.hbm.xml文件中

<set name="students" cascade="save-update" table="sc_table">  <!-- 本实体中的属性名,级联保存,关系表名称 -->

            <key column="cou_id" not-null="true"></key>  <!-- 在student表中的外键 -->

            <many-to-many column="stu_id" class="Student" ></many-to-many>  <!-- 在本表中student的外键,student实体类 -->

</set>

在student实体对应的 **.hbm.xml文件中

<!-- 各属性分别是:本实体中的属性名,级联保存,设定反向表(courses)维护关系,关系表名称 -->

<set name="courses" cascade="save-update" inverse="true" table="sc_table">

            <!-- column 为中间表参照 student_table 的外键 -->

            <key column="stu_id" not-null="true"></key> 

            <!-- 多对多的关系映射-->

            <many-to-many class="Course" column="cou_id"></many-to-many>       

</set> 

!注意,多对多关系中,应只设定由某一方来维护关系,若双方同时维护,在修改数据时,将会造成死循环事务。

 

<think>嗯,用户这次询问的是eNSP命令的简记内容。虽然用户引用了一些网络工程相关的资料,但那些看起来更像是之前搜索的残留信息,而不是当前问题的直接关联内容。 考虑到用户之前并没有询问过eNSP相关的问题,这应该是个全新的查询。用户可能是网络工程专业的学生或从业者,正在使用华为的eNSP模拟器做实验,需要快速查阅常用命令的简化形式。ta特意提到"简记",说明需要的是命令的缩写形式而非完整拼写。 我回忆了一下华为设备的常用命令缩写规则:通常取命令的前几个字母,遇到冲突时会适当增加字母。比如"display"缩写为"dis","interface"缩写为"int"。需要特别注意特权模式下的命令前缀缩写,比如"system-view"可以简写为"sys"。 用户可能正在实验室做配置,所以需要快速调取命令。我应该把最常用的基础命令缩写列在前面,比如视图切换、查看配置这些高频操作。同时也要包含接口配置、路由协议等进阶命令的缩写,这样既能满足新手需求,也不让进阶用户失望。 考虑到命令缩写可能存在歧义,最好在每个命令后面标注适用的视图模式。比如"ip route"在系统视图下可用,而"display"只能在用户视图下执行。这样能避免用户误操作。 最后准备几个典型问题作为延伸,帮助用户解决可能遇到的后续疑问。比如配置保存这种实用操作,以及查看OSPF邻居状态这种常见故障排查场景的问题。 </think>以下为eNSP常用命令的简记形式(基于华为设备命令体系): ### 基础操作 ```bash sys # system-view(进入系统视图)[^1] dis cur # display current-configuration(显示当前配置) dis ip int b # display ip interface brief(查看接口IP摘要) q # quit(退出当前视图) save # 保存配置 ``` ### 接口配置 ```bash int g0/0/0 # interface GigabitEthernet 0/0/0(进入接口视图) ip add 192.168.1.1 24 # ip address 192.168.1.1 255.255.255.0 undo shut # 开启接口(默认shutdown状态) ``` ### 路由协议 ```bash rip # 进入RIP视图 ospf 1 # 启动OSPF进程1[^1] network 192.168.1.0 0.0.0.255 # 宣告网段 ``` ### 查看诊断 ```bash dis arp # display arp(查看ARP表) dis ip rout # display ip routing-table(显示路由表) ping 192.168.1.2 # 测试连通性 tracert 8.8.8.8 # 路径追踪 ``` ### 进阶功能 ```bash vlan 10 # 创建VLAN 10 port li acc # port link-type access(设置接口为access模式) port de vlan 10 # port default vlan 10 stp root primary # 指定根桥 ``` > ⚠️ 注意:简记命令依赖上下文环境(如`sys`仅在用户视图生效),使用`Tab`键可自动补全命令。 --- ### 相关问题 1. 如何用eNSP实现VLAN间路由? 2. eNSP中OSPF邻居无法建立常见原因? 3. eNSP如何抓取特定接口的数据包? 4. 在eNSP中如何保存设备配置到本地? 5. eNSP模拟器支持哪些动态路由协议?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值