您的位置:首页 > 其它

Hibernate自学心得

2016-06-20 16:39 302 查看
快大四了,根据自学所学的框架(Sping、Mybatis、Struts2),想出去找找实习工作,所以去看看招聘信息,发现许多的招聘信息里边要求的框架大多都是Hibernate,所以我索性也学学Hibernate这一个框架,以下为个人心得:

查了些资料,发现,Hibernate在数据量上比不上Mybatis好,数据量在很大的情况下,Hibernate可能出现奔溃、不过在许多方面Hibernate还是很好用的,可以减少了写sql语句的麻烦,复杂的sql语句只需要简简单单的几行代码就可以搞定了。当然Hibernate还还是用了Hql语言,也挺好用的:eg:from 实体类名称 [条件...];

首先,Hibernate大多使用的是ORM模式(Object Relation Mapping || 对象关系映射)。

不多说,开始编写:

使用Hibernate需要到官网去下载包(当然我的代码里边也有):http://hibernate.org/orm/

下载好了之后就可以安安心心的编写了:

第一步:新建Hibernate的配置文件,有两种形式

第一种是properties文件的配置



配置好了就要实现:

/**
* 使用了properties配置文件和映射类
*/
@Test
public void test(){
//通过对象插值
Student student = new Student();
student.setId(5);
student.setName("myks");
student.setAge(23);

Configuration cfg = new Configuration();
cfg.addClass(com.myk.hibernate.Student.class);
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction t = session.beginTransaction();
try {
//添加
session.save(student);
t.commit();//事务提交
} catch (HibernateException e) {
t.rollback();//事务回滚
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}
}


这个地方只是简单的实现,如果还想要配置一些别的功能或者资源文件,需要使用自动动手使用java去编写,添加的方法很简单的,可以自己百度查,不过因为这样做很麻烦,且不方便,所以一帮使用xml文件的配置。

第二种是xml文件的配置

xml文件配置也有两种情况:

第一种情况是使用文件名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>
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">maiyikai</property>
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否后台显示sql语句 -->
<property name="show_sql">true</property>
<!-- 导入映射资源文件 -->
<mapping resource="com/myk/hibernate/Student.hbm.xml"/>

</session-factory>
</hibernate-configuration>
再看看映射文件(映射文件的文件名一般是以*.hbm.xml命名的):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.myk.hibernate">
<!-- class设置关系映射表   name:映射路径   table="表名" -->
<class name="Student" table="student">
<!-- id定义的是主键列 name:表中的字段 -->
<id name="id" column="id">
<!-- generator设置主键模式   class="主键的模式" -->
<generator class="assigned"></generator>
</id>
<!-- 定义其他字段 -->
<property name="name"></property>
<property name="age"></property>
</class>
</hibernate-mapping>


在这里涉及到了主键的一种映射关系(来自:http://lqzit.iteye.com/blog/845163):

1:assigned:表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。

2:increment:表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。

(1)新增数据前先查询一遍,影响了性能。

(2)主键的类型只能为数值型的int或者long

(3)并发操作时的冲突问题。

3:identity:不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。

4:native:表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。

5.uuid: 唯一主键生成办法。从Hibernate中提取出来。

优点:避免了生成ID 时,与数据库的再次交道,性能上较高。但对于有的开发人员不太习惯这种id生成方式,UUID生成的32为的字符串,不同于identity 从1开始的整数。

Xml代码

1.<id name="实体类属性名" type="java.lang.Integer">

2. <column name="对应表中主键字段名" />

3. <generator class="assiged|increment|identity|native|........" />

4.</id>

<id name="实体类属性名" type="java.lang.Integer">

<column name="对应表中主键字段名" />

<generator class="assiged|increment|identity|native|........" />

</id>

采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了

配置文件和映射文件都写好了之后(部分实现代码):

/**
* 使用*.cfg.xml配置文件和映射文件
*/
@Test
public void delete(){
Configuration configuration = new Configuration().configure();//加载配置文件
SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
Session session = sessionFactory.openSession();//打开session
Transaction transaction = session.beginTransaction();//打开事务管理
Student student = (Student) session.load(Student.class, 3);//加载类,按照id查找之后加载
try {
session.delete(student);
transaction.commit();//事务提交
} catch (HibernateException e) {
transaction.rollback();//事务回滚
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}

}


/**
* 分页查询
*/
@Test
public void pageSelect(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int pageNo = 2;
int pageNum = 2;
try {
//查询全部数据
Criteria criteria = session.createCriteria(Student.class);
criteria.setFirstResult((pageNo-1)*pageNum);//设置起始地记录位置
criteria.setMaxResults(pageNo*pageNum);//设置终止的记录位置
List<Student> list = criteria.list();
System.out.println(list);
} catch (HibernateException e) {
e.printStackTrace();
}
}

/**
* 删除
* 使用*.cfg.xml配置文件和映射文件
*/
@Test
public void delete(){
Configuration configuration = new Configuration().configure();//加载配置文件
SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
Session session = sessionFactory.openSession();//打开session
Transaction transaction = session.beginTransaction();//打开事务管理
Student student = (Student) session.load(Student.class, 3);//加载类,按照id查找之后加载
try {
session.delete(student);
transaction.commit();//事务提交
} catch (HibernateException e) {
transaction.rollback();//事务回滚
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}

}
/**
* 条件查询
*/
@Test
public void select(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = (Student) session.load(Student.class, 1);
try {
transaction.commit();
} catch (HibernateException e) {
transaction.rollback();
e.printStackTrace();
}finally{
if(session!=null){
session.close();
}
}

}
/**
* 查找
*/
@Test
public void selectAll(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
//查询全部数据
Criteria criteria = session.createCriteria(Student.class);
criteria.addOrder(Order.asc("age"));//结果集排序
List<Student> list = criteria.list();
System.out.println(list);
} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* 条件查找
*/
@Test
public void selectWhere(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
//查询全部数据
Criteria criteria = session.createCriteria(Student.class);
//			criteria.add(Restrictions.eq("age", 22));//条件查询
//			criteria.add(Restrictions.eq("name", "qw"));//条件查询
//多条件查询
criteria.add(Restrictions.and(Restrictions.eq("name", "myk"), Restrictions.ge("age", 21)));
List<Student> list = criteria.list();
System.out.println(list);

} catch (HibernateException e) {
e.printStackTrace();
}
}
/**
* 列查询
*/
@Test
public void selectCol(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
//		criteria.setProjection(Projections.property("age"));//设置查询列
criteria.setProjection(Projections.projectionList().add(Projections.property("id")).add(Projections.property("name")));//设置多个查询了列
List<Student> list = criteria.list();
Iterator it = list.iterator();//迭代
while(it.hasNext()){
Object[] obj = (Object[]) it.next();
System.out.println("id: "+obj[0]+" name: "+obj[1]);
}
}


@Test
public void colSelect(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Student.class);
//		criteria.setProjection(Projections.sum("age"));//计算总和
//		int ages = (int) criteria.uniqueResult();//取值
//		System.out.println(ages);
//		criteria.setProjection(Projections.distinct(Projections.property("age")));//去重
//		Iterator it = criteria.list().iterator();
//		while(it.hasNext()){
//			System.out.println(it.next());
//		}
//分组
//		criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("age")).add(Projections.rowCount(),"age"));
//		Iterator it = criteria.list().iterator();
//		while(it.hasNext()){
//			Object[] obj = (Object[]) it.next();
//			System.out.println("age: "+obj[0]+" count: "+obj[1]);
//		}
}
@Test
public void sessionSelect(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction teTransaction = session.beginTransaction();

String sql = "select * from student";
List<Student> list = new ArrayList<Student>();

try {
Query query = session.createSQLQuery(sql);
Iterator iterator = query.list().iterator();
while(iterator.hasNext()){
Student student = new Student();
Object[] object = (Object[]) iterator.next();
student.setId(Integer.parseInt(object[0].toString()));
student.setName(object[1].toString());
student.setAge(Integer.parseInt(object[2].toString()));
list.add(student);
}

System.out.println(list);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


@Test
public void sessionQuery(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction teTransaction = session.beginTransaction();

String hql = "from Student";
List list = new ArrayList();

Query query = session.createQuery(hql);
list = query.list();
System.out.println(list);

Student s = new Student();

if(session.contains(s)){
System.out.println("s在缓存中");
}else{
System.out.println("s不再缓存中");
}
}
/**
* 缓存机制
*/
@Test
public void sessionContains(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();

Student s = new Student();//建立持久化对象
s = (Student) session.get("com.myk.hibernate.Student", 1);//条件获取
System.out.println("缓存"+session.contains(s));
session.clear();//清空缓存
System.out.println("缓存"+session.contains(s));
}

/**
* 删除
*/
@Test
public void sessiondelete(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//创建一个持久化对象
//		Student s = (Student) session.createQuery("from Student where age = '22'").setMaxResults(1).uniqueResult();
//		session.delete(s);//单一删除
//		tx.commit();
//批量删除
List list = session.createQuery("from Student where name = 'myk'").list();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
Student s = (Student) iterator.next();
session.delete(s);
}
tx.commit();
}


等等等等都在文件里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: