Hibernate

Hibernate简介

       Hibernate是一个基于java的对象/关系数据库映射工具,它将对象模型表示的数据映射到SQL表示的关系模型上去。Hibernate管理java到数据库的映射,提供给了数据查询和存取的方法,减少了程序员对数据持久化层相关的编程任务。

Hibernate是一个基于元数据轻量级ORM框架:
       1. 元数据(Meta Data):data about data(数据的数据),也就是说描述一个对象数据,相当于这个对象的上下文环境。
       2. 轻量级:占用资源少,没有侵入性。(其实我认为这只是相对而言,如果和Ibatis相比,它到成重量级的了)。
       3. ORM(Object Relation Mapping):对象关系数据库的映射。这是Hibernate框架的重点,也就是说将我们程序中的实体(bean,这里也叫POJO)和数据库中的表进行映射。java类型和sql类型映射,面向对象设计和关系型数据库设计的映射,从而我们只需要将更多的精力放到业务中,而不是sql数据库方面。
       4. POJO(Plain Ordinary Java Object):无格式的普通java对象,也就是上边说的实体,和数据库做映射的简单类。只是在这里提出了一个新的名词而已。

Hibernate配置

一、映射配置文件 (查看)

1. 引入约束
2. 配置类和表对应
    class标签:
        name属性:实体类全路径
        table属性:数据库表名称
3. 配置实体类id和表id对应
    hibernate要求实体类有一个属性唯一值
    hibernate要求表有字段作为唯一值
    id标签:
        name属性:实体类中id属性名称
        column属性:生成的表字段名称
4. 设置数据库表id增长策略:
    generator标签:
        class属性:native生成的表id值是逐渐自动增长
5. 配置其他属性和表字段对应
    property标签:
        name属性:实体类属性名称
        column属性:生成表字段名称

二、创建hibernate核心配置文件 (查看)

    <名称位置固定:在src下面,hibernate.cfg.xml>
1. 配置数据库信息
    <property name=”hibernate.connection.driver_class”>com.mysql.jdbc.Driver</property>
    <property name=”hibernate.connection.url”>jdbc:mysql:///数据库名?characterEncoding=utf-8</property>
    <property name=”hibernate.connection.username”>username</property>
    <property name=”hibernate.connection.password”>password</property>
2. 配置hibernate信息
A. 输出底层sql语句:
    <property name=”hibernate.show_sql”>true</property>
B. 对底层sql语句格式化:
    <property name=”hibernate.format_sql”>true</property>
C. hibernate帮创建表:
    <property name=”hibernate.hbm2ddl.auto”>update</property>
    update:若有表,更新;若无表,创建
D. 让hibernate框架识别不同数据库自己特有的语句:
    <property name=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</property>
3. 把映射文件放入核心配置文件中
    <mapping resource=”映射配置文件路径”/>

三、 一对多映射配置 (查看)

    Hibernate机制:双向维护外键
1. 在客户映射文件中,表示所有联系人。使用set标签表示所有联系人:
    cascade:级联保存,修改,删除
    <set name=”客户类中的联系人集合对象” cascade=”save-update,delete”>
    //一对多建表,有外键
        <key column=”外键”></key>
        <one-to-many class=”联系人类全路径”/>
    </set>
2. 在联系人映射文件中:
    <many-to-one name=”联系人类中的客户对象” class=”客户类全路径” column=”外键”></many-to-one>

四、多对多映射配置 (查看)

1. 在用户映射文件中:
    <set name=”用户类中的角色集合对象” table=”新建一张表,关联用户类和角色类” cascade=”save-update,delete”>
        <key column=”用户主键”></key>
        <many-to-many class=”角色类全路径” column=”外键”></many-to-many>
    </set>
2. 在角色映射文件中:
    <set name=”角色类中的用户集合对象” table=”与用户映射文件中的一致”>
        <key column=”角色主键”></key>
        <many-to-many class=”用户类全路径” column=”用户主键,用作外键”></many-to-many>
    </set>

Hibernate核心接口 (查看)

1. Configuration
    负责在Hibernate初始化时加载默认文件下的配置文件信息到计算机内存,并通过他的对象加载指定的映射文件到内存。
    最后创建一个SessionFactory对象,把读入的配置信息拷贝到SessionFactory对象的缓存中
2. SessionFactory
    负责创建Session实例,每个SessionFactory类的实例对应一个数据库
3. Session
    Session是Hibernate持久化操作的基础,负责管理所有与持久化相关的操作
4. Transaction
    负责Hibernate的数据库事务
5. Query和Criteria
    负责Hibernate的查询操作

Hibernate添加操作 (查看)

一、加载hibernate核心配置文件
1.到src下面找到名称是hibernate.cfg.xml的配置文件
2.在hibernate里面封装对象
    Configuration config = new Configuration().configure();
二、创建SessionFactory对象
1.读取hibernate核心配置文件内容,创建SessionFactory
2.在过程中,根据映射关系,在配置数据库中将表创建
    SessionFactory sessionFactory = config.buildSessionFactory();
三、使用SessionFactory创建Session对象
类似于本地连接
    Session session = sessionFactory.openSession();
四、开启事务
    Transaction tx = session.beginTransaction();
五、写具体的curd操作
    User user = new User();
    user.setName(“”);
    user.setPassword(“”);
调用session的方法实现添加
    session.save(user);
六、提交事务
    tx.commit();
七、关闭资源
    session.close();
    sessionFactory.close();

Hibernate绑定Session及API的使用

一、Hibernate绑定本地Session (查看)

获取与本地线程绑定的session

1. 在hibernate核心配置文件中配置
    <property name=”hibernate.current_session_context_class”>Thread</property>
2. 调用SessionFactory里面的方法得到
    //提供返回与本地线程绑定的Session方法
    public static Session getSessionObject(){
        return sessionFactory.getCurrentSession();
    }
获取与本地线程绑定Session时候,不需要手动关闭session

二、Hibernate的API使用 (查看)

Query对象

1. 使用Query对象,不需要写sql语句,但要写hql语句
    hql(hibernate query language):hibernate提供的查询语句,与sql相似
    区别:使用sql操作表和字段
        使用hql操作实体类和属性
2. 查询所有hql语句
    from 实体类名称
3. Query对象的使用
    创建Query对象:
    Query query = session.createQuery(“from 实体类”);
    调用Query对象里面的方法得到结果
        List<实体类> list = query.list();

Criteria对象

1. 使用该对象查询操作,不需要写语句,直接调用方法实现
2. 过程
    创建Criteria对象
        Criteria criteria = session.createCriteria(实体类.class);
    调用方法得到结果
        List<实体类> list = criteria.list();

SQLQuery对象

1. 使用SQLQuery时,调用底层sql语句
2. 实现过程
    创建对象
        SQLQuery sqlQuery = session.createSQLQuery(“select * from 表名”);
    返回的List默认是数组结构
        List

Hibernate查询方式

一、对象导航查询

根据id查询某个客户,再查询该客户的所有联系人
实体类 对象 = session.get(实体类.class,主键值);

二、OID查询

根据id查询一条记录,返回对象,调用session中的get方法

三、HQL查询 (查看)

1. 与sql的区别:
    sql操作数据库表和字段,hql操作实体类和属性
2. 使用HQL查询操作时,使用Query对象
3. 常用HQL语句:
A. 查询所有:
    from 实体类名称
B. 条件查询:
    from 实体类名称 where 属性名称 = (like ?)
C. 排序查询:
    from 实体类名称 order by 属性名称 asc/desc
D. 分页查询:(hql中不能写limit,Query对象封装了两个方法实现分页)
    query.setFirstResult();//设置开始位置
    query.setMaxResults();//设置每页记录数
E. 投影查询:查询的不是所有的字段值,而是部分字段值
    select 实体类属性名称1…n from 实体类名称
    select后面不能写‘*’
F. 常用聚集函数的使用:count,avg,max,min,sum…
    select count(*) from 实体类名称
    query对象里有方法直接返回对象形式:query.uniqueResult()
    首先把object变long类型,再变成int类型:
           Long lobj = (Long) obj;
           int count = lobj.intValue();

四、QBC查询: (查看)

使用Criteria对象
1. 查询所有:
    创建对象:Criteria criteria = session.createCriteria();
    调用方法得到结果:List<类> list = criteria.list();
2. 条件查询:没有语句,调用封装的方法实现
    调用方法设置条件值:首先使用add方法,表示设置条件值,在add方法里使用类的方法实现条件设置
    criteria.add(Restrictions.eq(“cid”,1)); //类似于cid=1
常用的方法:

短语含义
Restrictions.eq=
Restrictions.allEq使用Map,使用key/value进行多个等于的判断
Restrictions.gt>
Restrictions.ge>=
Restrictions.lt<
Restrictions.le<=
Restrictions.between对应sql的between子句
Restrictions.like对应sql的like子句
Restrictions.in对应sql的in子句
Restrictions.andand关系
Restrictions.oror关系
Restrictions.sqlRestrictionsql限定查询
Restrictions.asc()升序
Restrictions.desc()降序

3. 排序查询:
    Criteria.addOrder(Order.asc(“cid”));
4. 分页查询:
    criteria.setFirstResult(0); //开始位置计算公式:(当前页-1)×每页记录数
    criteria.setMaxResults(3);
5. 统计查询:
    创建对象:Criteria criteria = session.createCriteria();
    设置操作:criteria.setProjection(Projections.rowCount());
    调用方法得到结果:Object obj = criteria.uniqueResult();
6. 离线查询:
    创建对象:DetachedCriteria dc = DetachedCriteria.forclass(类.class);
    最终执行时才需要session: Criteria criteria = dc.getExeactableCriteria(session);
    servlet调用service,service调用dao
    1.在dao里面对数据库crud操作
    2.在dao里面使用hibernate框架,调用session中的方法实现功能

五、多表查询 (查看)

内连接
    select * from table1,table2 where table1.cid = table2.lid;
    select * from table1 inner join table2 on table1.cid = table2.lid;
左外连接
    select * from table1 left outer join table2 on table1.cid = talbe2.lid;
右外连接
    select * from table1 right outer join table2 on table1.cid = talbe2.lid;

六、HQL多表查询

HQL内连接:以客户联系人为例
    from Customer inner join Customer.setLinkMan
    返回的list里面每部分都是数组形式
HQL迫切内连接:
    from Customer c inner join fetch c.setLinkMan
HQL左外连接(右外连接类似):
    from Customer c left outer join c setLinkMan
HQL迫切做外连接(五迫切右外连接):
    from Customer c left outer join fetch c.setLinkMan

Hibernate检索策略 (查看)

一、 Hibernate检索策略分为两类
1.立即查询:根据主键查询,调用get方法,一调用马上发送语句查询数据库:
   Custoemr customer = session.get(Customer.class,1);
2.延迟查询:根据主键查询,有load方法,调用load方法不会马上发送语句查询数据库,只有得到对象里的值是菜发送语句查询数据库
   Customer customer = session.load(Customer.class,2);
   System.out.println(customer.getCid());
二、 延迟查询分两类
1.类级别延迟:根据主键查询,返回实体类对象,调用load方法不会马上发送语句
2.关联级别延迟:根据某个客户,在查询该客户的多有联系人,查询客户的所有联系人的过程是否需要延迟
三、 关联级别延迟操作
1.在映射文件中进行配置实现
   根据客户得到所有的联系人,在客户映射文件中配置
2.在set标签上使用属性
   fetch: select(默认)
   lazy: true 延迟(默认)
           false 不延迟 调用方法后发两条sql语句
           extra 极其延迟 要什么值给什么值
四、 批量抓取
查询所有客户,返回list集合,遍历list集合,得到每个客户,然后得到每个客户的联系人
在客户的映射配置文件中,set标签配置
batch-size值:值越大发送的语句越少

源代码
jar包整合

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值