hibernate

1.Hibernate是dao层的框架,全自动化的ORM框架。

主键的增长方式

	* identity:
		适用于MySQL、DB2、MS SQL Server,
		采用数据库生成的主键,用于为long、short、int类型生成唯一标识;

	* sequence:
		DB2、Oracle均支持的序列,用于为long、short或int生成唯一标识;

	* native: 
		对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用);

	* increment:
		这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate生成的,所以只能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用;

	* assigned:
		由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况

	* foreign:
		使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

2.特点

   1.完全面向对象开发,自动生产sql语句(sql语句不可控,不方便优化)
   2.对于数据库的移植性强
   3.支持缓存机制
  1. Hibernate工作流程

     Mybaitsd工作流程:加载全局配置------>sqlSessionFactory---->sqlSession-----statement Mapper
     Hibernate工作流程:加载全局配置------>SessionFactory---->Session-----statement Mapper
    

4. Hiberate搭建入门环境

	1. 数据库表创建以及实体类
		public class News {
		   private int nid;
		   private String title;
		   private String content;
		   private String photo;
	 	}
	2. 加入jar lib\required 下所有 jar包 以及mysql的驱动包
	3. 配置文件(全局配置+映射文件)
		* 全局配置(数据源,映射,方言)hibernate.cfg.xml
			<?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 name="connection.driver_class">com.mysql.jdbc.Driver</property>
			        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate01</property>
			        <property name="connection.username">root</property>
			        <property name="connection.password">root</property>

			        <!-- SQL dialect sql方言-->
			        <property name="dialect">
			            org.hibernate.dialect.MySQLDialect
			        </property>
			        
			        <!-- 控制台打印sql以及格式化sql -->
			        <property name="show_sql">true</property>
			        <property name="format_sql">true</property>

			        <!--映射文件 -->
			        <mapping resource="com/demos/bean/News.hbm.xml"/>

			    </session-factory>

			</hibernate-configuration>
		* 映射文件  News.hbm.xml
			<?xml version="1.0"?>
			<!DOCTYPE hibernate-mapping
			        SYSTEM
			        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
			<!--package:实体类所在的包名,可以省略,省略后class里的类名写全路径(包名+类名)  --> 
			<hibernate-mapping package="com.demos.bean">
				<!-- name:指定类名 ,table:实体类对应的数据库表名-->
			    <class name="News" table="nesw">
			    	<!--id:主键,name:类中主键对应的的属性名,column:表里主键的列名  -->
			        <id name="nid" column="nid">
			       		<!-- 设置主键的增长方式 -->
			            <generator class="native"/>
			        </id>
					
					<!-- column省略不写,默认和属性名一致,type:指定列或者属性的类型,有三种指定方式(属性类型,hibernate 提供的类型,数据库列的类型) -->
			        <property name="title" type="string"/>
			        <property name="content" column="content" type="java.lang.String"/>
			        <!-- <property name="photo" column="photo" type="java.lang.String"/> -->
			         <property name="photo">
			           <column name="photo" sql-type="varchar"></column>
			        </property>

			    </class>

			</hibernate-mapping>
		* 解析配置文件并测试
			public class App {
				public static void main(String[] args) {
					//加载全局配置文件
					 Configuration configure = new Configuration().configure("hibernate.cfg.xml");
					 SessionFactory sf = configure.buildSessionFactory();
					 Session session = sf.openSession();
					 News news = session.get(News.class, 4);//根据主键查询
				     System.out.println(news);
				     session.close();
				}
			}

			CRUD 操作

				Session session;
				@Before
				public void startUp() {
					Configuration configure = new Configuration().configure("hibernate.cfg.xml");
					SessionFactory sf = configure.buildSessionFactory();
					session = sf.openSession();
				}

				/*
				 * OID查询(根据主键查询) get:在查询不存在数据时,会返回null
				 * load:在查询不存在数据时,会异常,有延迟作用,不会立即执行sql语句,而是在获取主键之外的其他属性时才会执行SQL语句
				 */
				// 根据主键查询
				@Test
				public void getNewsByNid() {
					News news = session.load(News.class, 4);// 根据主键查询
					System.out.println(news.getNid());
					System.out.println(news.getTitle());
					session.close();
				}

				// 保存
				@Test
				public void saveNews() {
					News n = new News();
					n.setTitle("大新闻");
					n.setContent("70周年");
					n.setPhoto("d://no.png");
					session.save(n);
					session.getTransaction().commit();
					session.close();
				}

				// 更新
				@Test
				public void updateNews() {
					News n = new News();
					n.setNid(12);
					n.setTitle("爆炸新闻");
					n.setContent("70周年");
					n.setPhoto("d://no.png");
					session.update(n);// 根据主键更新
					session.beginTransaction().commit();
					session.close();
				}

				// 删除
				@Test
				public void delNews() {
					News n = new News();
					n.setNid(12);
					session.delete(n);
					session.beginTransaction().commit();
					session.close();
				}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值