1.下载源码 2.引入jar文件 hibernate3.jar+required必须引入的(6个)+jpa目录+数据库驱动包 3.写对象以及对象的映射 Employee.java 对象 Employee.hbm.xml 对象的映射 4.src/hibernate.cfg.xml 数据库连接配置 加载所用的映射(*.hbm.xml)
一个项目只需要一个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();没有设置主键,执行保存;设置了则执行更新;如果设置主键不存在,则报错。
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");query by criteria:完全面向对象的查询
Criteria criteria=session.createCriteria(Employee.class);
//查询全部 List<Employee> list =criteria.list() //条件查询 criteria.add(Restrictions.eq("empId",1));确定:不能跨数据库 使用原生SQL查询 //把每一行记录封装为对象数组,添加到list集合 SQLQuery sqlquery=session.createSQLQuery(“select * from employee”); SQLQuery sqlquery=session.createSQLQuery(“select * from employee”).addEntity(Employee.class);
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))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);