Hibernate

搭建开发环境

1.下载源码
2.引入jar文件
hibernate3.jar+required必须引入的(6个)+jpa目录+数据库驱动包
3.写对象以及对象的映射
Employee.java 对象
Employee.hbm.xml 对象的映射
4.src/hibernate.cfg.xml
数据库连接配置
加载所用的映射(*.hbm.xml)

Hibernate的API

Configuration
    //创建配置管理类对象
    org.hibernate.cfg.Configuration
    Configuration config=new Configuration()

//加载配置文件
    src/hibernate.cfg.xml
config.configure();//因此一般情况省略不写
如果放在其他包下
config.configure(cn/itcast/a_hello/xxx.xml)
SessionFactory
根据加载的配置管理类对象,创建SessionFactory对象
SessionFactory sf = config.buildSessionFactory();
//根据session工厂,或者说代表了整个配置文件

一个项目只需要一个session对象,并且只需要加载一次
那么应该放在static代码块中。

    public class App1{
        private static SessionFactory sf;
        static{
        //1.创建配置管理类对象
        //org.hibernate.cfg.Configuration
        Configuration config=new Configuration();
        //2.加载配置
        config.configure();
        //3.创建SessionFactory对象
        sf=config.buildSessionFactory();
        }

    }


sf.openSession();    //创建一个session对象
sf.getCurrentSession();  //创建session或取出session对象

session对象维护了一个连接(connection),代表了与数据库连接的会话。也是Hibernate最重要的对象,只要使用hibernate与数据库操作,都需要这个。

//org.hibernate.Session session=sf.openSession();
session

//开启事务
hibernate要求所有的与数据库操作必须使用事务,否则报错
Transaction tx=session.beginTransaction();  
session.save(emp);
tx.commit();
session.close();
更新
public void testUpdate() throws Exception{
    //对象
    Employee emp=new Employee();
    emp.setEmpId(1);
    emp.setEmpName("张三");


    //创建session
    Session session=sf.openSession();
    //开启事务
    Transaction tx=session.beginTransaction();

    //执行更新的时候必须要有主键
    //一般是先查询在更新
    //主键查询
    Employee emp=(Employee)session.get(Employ.class,1);

//主键查询还可以用load,一般用的是get

    //执行操作
    session.update(emp);
    tx.commit();
    session.close();
保存或更新
saveOrUpdate(emp);

没有设置主键,执行保存;设置了则执行更新;如果设置主键不存在,则报错。

其他方法

HQL查询与SQL查询区别:

    SQL:查询的是表与字段
    HQL:hibernate query language,hibernate提供的查面向对象查询语言,查询的是对象以及对象的属性,   区分大小写。

//查询全部

//import org.hibernate.query.Query;
Query q=session.createQuery("from Employee");   
List<Employee> list =q.list();

//查询的是对象的属性,不是字段,因此用empId

Query q=session.createQuery("from Employee where empId=1 or empId=2");
QBC

query by criteria:完全面向对象的查询

Criteria criteria=session.createCriteria(Employee.class);

//查询全部
List<Employee> list =criteria.list()

//条件查询
criteria.add(Restrictions.eq("empId",1));
本地SQL查询

确定:不能跨数据库
使用原生SQL查询
//把每一行记录封装为对象数组,添加到list集合
SQLQuery sqlquery=session.createSQLQuery(“select * from employee”);
SQLQuery sqlquery=session.createSQLQuery(“select * from employee”).addEntity(Employee.class);

hibernate.cfg.xml

主配置文件
通常 session-factory节点代表一个数据库
配置分为3个部分
    1.数据库连接配置
    2.其他相关配置参数
    3.映射信息(即所有对象与字段的对应关系)
  1. 数据库连接配置,hibernate在运行的时候,会根据不同 的dialect来生成符合当前数据库语法的 sql
    org.hibernate.dialect.MySQLDialect

2.其他相关配置

//2.1显示执行的sql语句
    <property name="hibernate.show_sql">true</property>
//2.2格式化sql
    <property name="hibernate.format_sql">true</property>
//2.3自动建表

    <property name="hibernate.hbm2ddl.auto">create</property>
    //如果属性值是create,那么每次都删除重新建立
    //如果属性值是update,那么表不存在就创建,存在则修改
    //如果create-drop每次在创建sessionFactory时候执行创建表
    //validate(生成环境)执行验证,当映射文件的内容与数据库表结构不一致的时候报错

映射文件

映射一个实体类对象,描述一个对象最终实现可以直接保存对象数据到数据库中。

<hibernate-mapping  package="XXX" auto-import="true">
其中package:要映射的实体类(即对象)所在的包。
//如果不写package的话,那么就需要在class写上类全名
auto-import默认是true,在写hql的时候会自动导包,如果为false那么在写hql的时候必须写上类全名

//class映射某一个对象(一般情况下一个对象写一个映射文件,即一个class节点)
name指定要映射的对象类型,table对象对应的表。
如果没有指定表名,那么默认与对象名称一致
<class name="XXX" table="XXX">
//主键映射
    <id name="" column="">

        //主键的生成策略
        <generator   class="native"
        //native是自增

    </id>
//普通字段映射
    //name是对象属性名
    //length不指定默认是255
    //type:指定表的字段的类型,如果不指定会匹配属性的类型

    java类型:必须写全名
    hibernate类型:直接写类型,都是小写(string)
    如果列名称为数据库关键字,需要用 `desc`
    <property name="XXX" column="XXX" length="20" type="java.lang.String"></property>(生成varchar(20))
主键选择
identity:自增长(mysql、db2、sqlserver、sybase等内置标识字段提供支持。返回标识符是long、int、short)

increment:用于long、int或者short类型生成唯一标识,只有在没有其他进程往同一张表中插入数据时才能使用。(集群下不使用
,会有并发访问的问题)

sequence:自增长序列,oracle自增长是以序列方法实现。

native:自增长(会根据底层数据库的自增长方式选择identity或sequence),如果是mysql采用的是identity,如果是oracle数据库,使用sequence序列的方式实现自增长。

assigned:指定主键,不指定主键时候插入数据报错

uuid:指定uuid随机生成的唯一值。
foreign:外键
映射多列作为主键
    <composite-id name="keys">
        <key-property name="userName" type="string"></key-property>
        <key-property name="address" type="string"></key-property>
    </composite-id>

//复合主键查询

public class CompositeKeys implements Serializable{
private String userName;
private Set address;
private String
}

//get查询的时候使用的是主键
//那么需要构建主键在查询
CompositeKeys keys=new CompositeKeys();
keys.setAddress("广州");
keys.setUserName("jack");

(User)session.get(User.class,keys);
集合数据的获取
        t_user表
uiduserName
1Jack
t_address表
u_idaddress
1beijing
1shanghai
@Test
    public void testGet() throws Exception{
        Session session=sf.openSession();
        session.beginTransaction();

        User user=session.get(User.class, 3);

        System.out.println(user.getUserId());
        System.out.println(user.getUserName());
    //当查询用户,同时可以获取用户关联的list集合数据(因为有正确映射)
    //当使用到集合时候,才向数据库发送执行的sql语句(懒加载)
        System.out.println(user.getAddressList());
        session.getTransaction().commit();
        session.close();
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值