hibernate 是一种ORM框架,是ORM框架中一个典范 ORM叫做对象关系映射
是面向对象语言和关系型数据库之间的映射关系
所以只有在面向对象语言或者关系型数据库没用的时候ORM才会消失

ORM为我们做什么

  减少乏味的代码
  更加面向对象的设计
  更好的性能
  更好的移植性

使用Hibernate  http://hibernate.org/ 

1. 加入Hibernate的jar包

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>4.2.0.Final</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.33</version>
</dependency>

2. 创建持久化类(pojo)

  就是以前的实体类

3. 创建映射文件(xxx.hbm.xml)

pojo->xxx.hbm.xml->table表示一个实体类于一张表的映射关系文件
在pojo包里新建User.hbm.xml文件,和类名相同

<?xml version="1.0" encoding="UTF-8"?>
<!-- 展开jar包有个hibernate-mapping-3.0.dtd,拷贝这几行dtd -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 根节点叫做hibernate-mapping,package表示User所在的包名
子节点的class,name属性写类名,package和name组成一个完全限定名
所以不写package的时候name属性要写完全限定名,table写表名---->
<hibernate-mapping package="com.kaishengit.pojo"> <class name="User" table="user">
<!-- pojo中的属性要对应表里面的列 -->
<!-- id这个节点是主键列,name写属性的名字,column
是表中列的名字,作为主键还要有生成策略
generator class="native"native表示自动增长-->
<id name="id" column="id">
<generator class="native"/>
</id>
<!-- 剩下普通列和属性的对应,当name和column相同的时候可以只
写name-->
<property name="username"/>
<property name="password" column="password"/> </class>
</hibernate-mapping>

4. 创建Hibernate配置文件(hibernate.cfg.xml)总配置文件
建在根目录下

    <?xml version="1.0" encoding="UTF-8"?>
<!-- 打开jar包中的hibernate-configuration-3.0.dtd,复制这几行dtd -->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 这个session和http中的session没有关系 -->
<!--\hibernate-release-4.1.1.Final\hibernate-release-4.1.1.Final\project\etc的hibernate.properties -->
<session-factory>
<!-- 以hibernate.开头的可以省略hibernate. -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!-- 方言(较好的移植性) -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- c3p0数据源(以前用的dbcp)
需要pom中导入这两个jar包
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>4.2.0.Final</version>
</dependency>-->
<property name="c3p0.max_size">10</property>
<property name="c3p0.min_size">2</property>
<property name="c3p0.timeout">5000</property>
<property name="c3p0.max_statements">100</property>
<property name="c3p0.idle_test_period">3000</property>
<property name="c3p0.acquire_increment">2</property>
<property name="c3p0.validate">false</property> <!-- 执行的时候能看到sql语言 -->
<property name="show_sql">true</property>
<!-- 把session放到当前线程里 比如放在main方法中就是放在主线程里,使用的
时候就可以获得session.-->
<property name="current_session_context_class">thread</property>
<!-- 表明映射文件的位置 -->
<mapping resource="com/kaishengit/pojo/User.hbm.xml"/> </session-factory> </hibernate-configuration>

5. 运行

Hibernate对pojo的要求:
1属性要有对应的get和set方法
2要有无参数的默认构造方法
3 不要使用final进行修饰

    //configure()才会去读取hibernate,cfg.xml
Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
/* 最终是为了创建sessionfactory,这是4.0 3.0的hibernate只需要
Configuration cfg = new Configuration().configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();*/
Session session = sessionFactory.getCurrentSession(); /* 增删改查都在事务中完成 session.beginTransaction();
session.getTransaction().commit();或者
session.getTransaction().rollback();*/
session.beginTransaction(); User user = new User();
user.setUsername("jack");
user.setPassword("123"); session.save(user); session.getTransaction().commit();
/*或者Transaction tran = session.beginTransaction();
tran.commit();*/

应该只有一个sessionfactory而且读取配置文件
Configuration cfg = new Configuration().configure();应该也只读一次
所以写成单例模式

public class HibernateUtil {
// 静态只读一次
private static SessionFactory factory = buildSessionFactory(); private static SessionFactory buildSessionFactory() {
Configuration cfg = new Configuration().configure();
ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
return cfg.buildSessionFactory(serviceRegistry);
}
//提供获取sessionfactory方法
public static SessionFactory getSessionFactory() {
return factory;
}
// 提供获取session的方法
public static Session getSession() {
return getSessionFactory().getCurrentSession();
} }

test中

public class Test {

    public static void main(String[] args) {
//添加
User user = new User();
user.setUsername("tom");
user.setPassword("000000"); Session session = HibernateUtil.getSession();
session.beginTransaction();
// 保存要放在事务中
session.save(user);
session.getTransaction().commit(); // 查询
Session session = HibernateUtil.getSession();
session.beginTransaction();
// 要放在事务中 ,根据主键查询
User user = (User) session.get(User.class, 1);
System.out.println(user.getUsername());
session.getTransaction().commit(); // 删除 Session session = HibernateUtil.getSession();
session.beginTransaction();
// 要放在事务中 ,查出来才能删,会输出两条sql语句
User user = (User) session.get(User.class, 2);
session.delete(user);
session.getTransaction().commit(); //修改 Session session = HibernateUtil.getSession();
session.beginTransaction();
// 要放在事务中 查出来才能修改
User user = (User) session.get(User.class, 1);
//只有当set的值跟以前不一样才回去执行update修改
user.setUsername("jack");
session.getTransaction().commit(); // 查询所有
Session session = HibernateUtil.getSession();
String hql = "from User";// User是类名,不是表名,要切记
Query query = session.createQuery(hql);
List<User> userList = query.list();
for(User user : userList) {
System.out.println(user.getUsername() + " : " + user.getPassword());
} }
}

hibernate的配置 1的更多相关文章

  1. Hibernate 基础配置及常用功能(一)

    本来是想等全部框架测试完以后再统一发布的,但是随着测试的一点点增加感觉把需要叙述的东西放在一起终将会是一场灾难.所以还是打算分成几章来描述,其中还包括一些有待解决的问题.短期很难腾出时间来仔细阅读Hi ...

  2. 。。。Hibernate注解配置的注意事项。。。

    今天本来打算录视频的,突然遇到一个拦路虎,Hibernate注解配置,有一个注意点:要么都在属性上面注解配置,要么都在getXX()方法上面用注解配置,要不然就会报错: Caused by: org. ...

  3. 【转】Spring+Hibernate+EHcache配置(一)

    大量数据流动是web应用性能问题常见的原因,而缓存被广泛的用于优化数据库应用.cache被设计为通过保存从数据库里load的数据来减少应用和数据库之间的数据流动.数据库访问只有当检索的数据不在cach ...

  4. Hibernate缓存配置

    一级缓存 Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,当程序调用save(),update(),saveorupdate()等方法 及调用查询接口l ...

  5. Hibernate——hibernate的配置测试

    Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自 ...

  6. Hibernate学习笔记2.1(Hibernate基础配置)

    Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...

  7. t3用户-角色-权限hibernate经典配置

    用户-角色-权限hibernate经典配置. 既然有人问起,我就写下说明吧.在文章中间的配置文件那里.权当回忆一下,也帮助更多人.这是以前学校时写的,没有注释.都是贴的代码笔记.看到的莫要见怪.欢迎学 ...

  8. hibernate核心配置

    # hibernate核心配置 注意:  - hibernate.cfg.xml默认放在src目录下(这样可以自动加载该文件) - 必须配置的参数:   * 数据库的四大参数和方言  - 可选配置的参 ...

  9. Hibernate常见配置详细解释

      <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1. ...

  10. (转)Hibernate的配置详解

    http://blog.csdn.net/yerenyuan_pku/article/details/65041077 在<Hibernate快速入门>一文中,我有讲到Hibernate的 ...

随机推荐

  1. Ubuntu下lamp(PHP+Mysql+Apache)搭建+完全卸载卸载方法

    安装apache2 sudo apt-get install apache2 安装完成,运行如下命令重启下: sudo /etc/init.d/apache2 restart 在浏览器里输入http: ...

  2. 【deep learning学习笔记】Recommending music on Spotify with deep learning

    主要内容: Spotify是个类似酷我音乐的音乐站点.做个性化音乐推荐和音乐消费.作者利用deep learning结合协同过滤来做音乐推荐. 详细内容: 1. 协同过滤 基本原理:某两个用户听的歌曲 ...

  3. 理解Android的layout和measure

    在Android UI开发中,总会有情况需要自定义View和View Group. 什么是View?就是Android中一个基本视图单位,一个Button是一个view, 一个Layout, 也是一个 ...

  4. iOS中Block介绍(二)内存管理与其他特性

    我们在前一章介绍了block的用法,而正确使用block必须要求正确理解block的内存管理问题.这一章,我们只陈述结果而不追寻原因,我们将在下一章深入其原因. 一.block放在哪里 我们针对不同情 ...

  5. c 统计字符串中字符出现的个数

    1.单纯用数组来解题 思路:从左往右循环,每次碰到一个字符就和左边的字符串比较,如果有相同的就右移,如果没有找到相同的就从这个位置向右统计个数并输出. #include<stdio.h> ...

  6. mysql 数据备份

    一.备份数据库并下载到本地[db_backup.php] php代码: <?php // 数据库参数(此处测试,直接给定,项目中使用配置文件) $cfg_dbname = 'blog'; $cf ...

  7. KMP算法的一次理解

    1. 引言 在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了.KMP本身不复杂,但网上绝大部分的文章把它讲混乱了.下面,咱们从暴力匹配算法讲起,随 ...

  8. Linux 下 Hadoop java api 问题

    1. org.apache.hadoop.security.AccessControlException: Permission denied: user=opsuser, access=WRITE, ...

  9. Myeclipse安装Activiti

    1.将压缩包内activiti文件夹放入Myeclipse\dropins文件夹内并修改activiti文件夹内Link文件指向自己的目录重启Myeclipse(这时打开bpmn文件仍会报错).2.将 ...

  10. SQVI和SAP查询QUERY的区别和使用注意事项

    SQVI.SAP查询QUERY都适用于简单的表连接数据查询,但都不能打包传输到PRD,不同环境需要重复创建.可以生成报表程序供T-CODE调用,用se93指定事务码和程序名称. 区别1-权限: SQV ...