Hibernate 是完全ORM的,只需要对 对象 进行操作,生成底层SQL语句

优势:1、可以简化开发

   2、性能好(原生的Hibernate性能很差,要使用它,需要进行优化),优化方式:一级缓存、二级缓存、查询缓存、抓取策略等。

下面先简单写一个log4j的demo

1、新建一Java项目,导入log4j.jar包

2、在src下新建log4j.properties文件,第一个info表示,输出信息为info级别及其以上

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### file,表示文件输出,stdout表示控制台输出 log4j.rootLogger=info, file,stdout

log4j.properties

3、新建一个包含main函数的类,直接运行测试,其代码如下

import org.apache.log4j.Logger;

public class LogDemo {

    public static void main(String[] args) {
// TODO Auto-generated method stub
Logger logger = Logger.getLogger(LogDemo.class);
logger.fatal("致命性错误");
logger.error("普通错误");
logger.warn("警告错误");
logger.info("普通信息");
logger.debug("调试信息");
logger.trace("堆栈信息");
}
}

LogDemo

下面开始写Hibernate入门代码,操作MySQL数据库:

1、创建数据库h1, create database h1;

2、创建表customer

create table customer(id int primary key auto_increment,  name varchar(20),  age int ,  city varchar(20)) ;

3、新建Customer类

public class Customer {
private int id;
private String name;
private int age;
private String city;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}

Customer类

4、新建Customer.hbm.xml文件,配置Customer类与customer表的映射关系,一般是将映射文件放在对应类同一包内

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 类与表关系,name类全名称,table表名 -->
<class name="cn.hjp.domain.Customer" table="Customer">
<!-- id为表主键,如果不配置column,默认为name值 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- property中配置表中简单字段, type可以为Java类型,Hibernate类型或者数据库类型 -->
<!-- 省略column,默认用name -->
<property name="name" column="name" type="java.lang.String"></property>
<!-- int为Hibernate类型,如果用Java应该是Integer -->
<property name="age" column="age" type="int"></property>
<!-- 下面使用数据库类型 -->
<property name="city">
<column name="city" sql-type="varchar(20)"></column>
</property>
</class>
</hibernate-mapping>

类与表映射关系

5、新建hibernate.cfg.xml文件,配置hibernate访问数据库及其自己的一些信息,配置显示SQL语句后,可以在控制台看到Hibernate构造的SQL语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 使用property来配置数据库参数以及Hibernate自己的一些信息 -->
<!-- dialect方言,用于指定连接的是什么数据库 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///h1</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">hjp123</property> <!-- 配置显示执行的SQL语句,以及SQL语句格式化 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 导入映射文件 -->
<mapping resource="cn/hjp/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hibernate与数据关联

6、新建CustomerTest.java类,简单实现增删改查操作

注意:在使用hql时,from后面跟的是类名,而不是表名

session.get方法,第二个参数是数据表ID;session.load方法使用一样。

session.get和session.load方法区别:1、如果使用get方法,查询结果返回null;如果使用load方法,查询不到数据会抛异常,因为load方法返回的不是PO对象而是其代理

                   2、load方法默认延迟加载,是一种优化策略;而get不会延迟加载,而是立即查询

package cn.hjp.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test; import cn.hjp.domain.Customer; public class CustomerTest {
@Test
// 添加操作
public void addTest() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
Customer customer = new Customer();
customer.setAge(23);
customer.setName("Tom");
customer.setCity("北京");
session.save(customer);
// 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
} @Test
// 修改操作
public void updateTest() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
Customer customer = new Customer();
customer.setId(1);
customer.setAge(23);
customer.setName("Jerry");
customer.setCity("上海");
session.update(customer);
// 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
} @Test
// 删除操作
public void deleteTest() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
Customer customer = new Customer();
customer.setId(1);
session.delete(customer);
// 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
} @Test
// 查询操作
public void findCustomerById() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
Customer customer = (Customer) session.get(Customer.class, 2);
System.out.println("姓名:" + customer.getName() + ";年龄:" + customer.getAge());
// 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
} @Test
// 使用hql查询所有到List集合
public void findAllCustomerByHql() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
String hql = "from Customer";//注意,from后面跟的是类名不是表名
Query query = session.createQuery(hql);
List<Customer> cusList = query.list();
System.out.println(cusList.size());
// 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
}
}

Hibernate数据库操作

@Test
// 使用SQL语句查询数据
public void findAllCustomerBySql() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
String sql = "select * from customer";
SQLQuery sqlQuery = session.createSQLQuery(sql); // List<Object[]> cusList=sqlQuery.list();//注意:返回的是Object数组集合
//数组结合,可以简单理解为,数据库表中的每一行记录为一个数组,然后构成数组集合
// for(Object[] obj:cusList){
// System.out.println(Arrays.toString(obj));
// } sqlQuery.addEntity(Customer.class);//将数组中的每一条记录封装到Customer对象中
List<Customer> cusList=sqlQuery.list();
System.out.println(cusList.get(0).getName()); // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
} @Test
//用qbc查询所有数据,完全面向对象的查询
public void findAllCustomerByQBC() {
// 1.加载hibernate.cfg.xml文件
Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
// 2.得到一个SessionFactory
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.得到session
Session session = sessionFactory.openSession();
// 4.开启事务
// session.beginTransaction();
Transaction transaction = session.beginTransaction();
// 5.操作
Criteria criteria=session.createCriteria(Customer.class);
List<Customer> cusList=criteria.list();
System.out.println(cusList.get(0).getName());
// 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
// session.getTransaction().commit();
transaction.commit();
// 7.关闭资源
session.close();
sessionFactory.close();
}

纯SQL和纯面向对象的查询

初学Hibernate的更多相关文章

  1. 初学hibernate之缓存

    一.1.Session级别缓存属于一级缓存,持久化对象保存在Session一级缓存中(一级缓存引用持久化对象地址),只要session不关闭,一级缓存就存在,缓存中对象也不会被回收: Session会 ...

  2. 初学Hibernate持久化

    hibernate三种持久化对象状态:(持久化对象:Persistent Object=POJO + hbm映射) 1.瞬时状态(临时状态或自由态):PO对象刚创建(即new)开始进入瞬时状态,此时对 ...

  3. 初学Hibernate主键生成策略

    具有业务含义的主键叫自然主键:随机生成,不具备业务含义的字段作为主键,叫代理主键. 在表与POJO类关系映射文件XXX.hbm.xml中,可通过配置id元素下generator节点的class属性指定 ...

  4. 初学hibernate的心得体会

    在初步学习了hibernate之后,使我明白了hibernate是一个怎样的软件.hibernate是一个比较独立的框架,它不需要太多其他软件的支持.hibernate是一个开放源代码的关系映射框架, ...

  5. 初学Hibernate之Query扩展

    1.hql参数化查询,不明确值类型的用setParameter方法:明确查询结果为一条记录的用uniqueResult方法查询 注意,参数化查询中方法setString 或 setParameter如 ...

  6. 初学Hibernate杂乱总结

    1.如果在"one"方中(如部门)写有Set属性,但是没有在映射文件中配置,那么,在获取指定部门下的所有员工时,不会报错,但是,Set内的元素个数为0.输出为"[]&qu ...

  7. Hibernate简易原生DAO的实现

    写在最前: 初学Hibernate,在尝试把JDBC项目移植到Hibernate的过程中,碰到了不少的麻烦,最让人心烦意乱的自然是SQL语句改动造成的代码混乱.其实不难,网上的解决方案有很多, 不过. ...

  8. Hibernate 中出现 users is not mapped 问题 (转)

    今天晚上自己试着用Hibernate去搭建一个Web工程,然后去实现一个简单的登录.         通过Hibernate 做查询操作的时候总是报出这样的错:                    ...

  9. Hibernate常用配置文件详解

    本文转载自:http://blog.csdn.net/csh624366188/article/details/7578939 初学hibernate的童鞋,刚开应该都有这种感觉,hibernate的 ...

随机推荐

  1. QT QString类

    字符串有如下几个操作符 QString提供了一个二元的"+"操作符用于组合两个字符串,并提供了一个"+="操作符用于将一个字符串追加到另一个字符串的末尾,例如: ...

  2. Linux 网络编程二(Socket创建)

    TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...

  3. 【兄弟连】2016高洛峰新版PHP培训视频教程

    [兄弟连]2016高洛峰新版PHP培训视频教程                                                            视频部分目录: 下载地址:http ...

  4. 获取元素的xpath, 转换xpath为csspath进行jQuery元素获取

    获取元素的xpath, 转换xpath为csspath进行jQuery元素获取 博客分类: 编程心得 jQueryCSSHTML  var $shadow = new Object(); /** 获取 ...

  5. STM32的bulk双缓冲传输速度的讨论,硬件的坑永远填不完

    详情:http://bbs.21ic.com/forum.php?mod=viewthread&tid=109584   USB 1.0的最高12Mbps. USB 2.0的高速模式480Mb ...

  6. [转]MySQL5.5 my.cnf配置参考

    主要配置参数转载自: http://www.linuxyw.com/a/shujuku/20130506/216.html 并稍微做了修改MyISAM部分以适应当前的环境 此配置是老男孩生产线上使用的 ...

  7. KMP算法的Next数组详解

    转载请注明来源,并包含相关链接. 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧:http://www.cnblogs.com/yjiyjige/p/32 ...

  8. VS一般设置(字体,背景色)

    字体 打开工具=>环境=>字体和颜色,字体:Consolas,大小:13 背景色 缩进设置 工具=>文本编辑器=>纯文本=>制表符=>保留制表符

  9. 获取Web.config配置节

    static string GetAppSetting(string key) { var appSetting = ConfigurationManager.AppSettings[key]; if ...

  10. 文件夹文件遍历并插入数据库的操作,IO Directory File的递归操作

    在我们管理内容管理系统时,数据量大时,对机器的依赖性就比较强了,比如,我要将一个文件夹中的很多图片上传到网站,一个个上传会很花时间,就想到了通过遍历文件夹得到文件名,并将路径与文件保存到数据库中对应的 ...