hibernate第一天——分页显示,数字类型互相转换intvalue(crl+h),hibernate的配置与API,建立表结构,final类型,映射文件,主键

1、模式

BS  ,   CS

2、结构

(1)、程序代码结构:
View 表示层                      View 
        Action/sevlet/xx        数据
        Jsp                           模板
-----------------------------------
Service    业务层
Dao          数据访问层
-----------------------------------
MySQL, Oracle, SqlServer, Db2, ...

MySQLDaoImpl
OracleDaoImpl

MVC:从表示层看全局

JDBC:各种实现接口;从对象到表记录,从表记录到对象转换麻烦。
SQL

ORM:(只是一种设计方案,有好多实现框架)
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

3、学习线路

hibernate第一天——分页显示,数字类型互相转换intvalue(crl+h),hibernate的配置与API,建立表结构,final类型,映射文件,主键_第1张图片
全限定名:cn.itcast.domain.User
简单名称:User

数据库信息:方言,URL,Driver,用户名,密码


4、hibernate的配置

maven配置包:


    4.0.0

    seu.xinci
    test1
    1.0-SNAPSHOT

    
        
            org.hibernate
            hibernate-core
            4.3.10.Final
        

        
            mysql
            mysql-connector-java
            5.1.34
        
    



hibernate.cfg.xml:



	
		
		org.hibernate.dialect.MySQLDialect
		
		jdbc:mysql:///test2
		com.mysql.jdbc.Driver
		root
		1234
		
		true
		
	


User.hbm.xml         实体对象映射表




    
        
        
            
            
        
        
        
    



session的获取与简单查询与保存:(hibernate版本为5)
通常作为静态工具类,获取工厂
private static SessionFactory sessionFactory;

//初始化工厂
static {
	Configuration configuration = new Configuration();
	//读取指定的配置文件
	configuration.configure("hibernate.cfg.xml");
	//configuration.buildSessionFactory();
	ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
	sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}

保存:
User user = new User();
user.setName("张三");
//获取session
Session session = sessionFactory.openSession();
//开启事务
Transaction tx =session.beginTransaction();
session.save(user);
//提交事务
tx.commit();
//关闭session,释放资源
session.close();

Hibernate: insert into table_user (name) values (?)
自动递增ID,因此只有插入name

查询:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class,1);
tx.commit();
session.close();
System.out.println(user.toString());

open别忘了close

使用模式:
A、通过配置,创建工厂
B、获得session
C、创建事务
D、具体操作
E、提交事务,不成功回滚
D、关闭session

5、分页查询

1、全部查询出来,部分显示(附近的店)
2、查一部分,显示一部分(常用)

假设共有 25条记录,每页显示10条,则共3页。

                   firstResult              maxResults
----------------------------------------
第1页                0                             10
第2页               10                            10
第3页               20                            10

total / pageSize
total % pageSize 
/**
 * 分页查询数据列表
 *
 * @param firstResult 从结果列表中的哪个索引开始取数据
 * @param maxResults  最多去多少条数据
 * @return 一页的数据列表 + 总记录数
 */
public QueryResult findAll(int firstResult, int maxResults) {
	Session session = HibernateUtils.getSession();
	try {
		Transaction tx = session.beginTransaction();//开始事务

		//操作
		//查询一页的数据量列表
		//方法一:
//            Query query = session.createQuery(
//                    "FROM seu.xinci.pojo.User");//使用HQL查询
//            query.setFirstResult(firstResult);
//            query.setMaxResults(maxResults);
//            List list =query.list();
		//方法二:方法链
		List list = session.createQuery(
				"FROM seu.xinci.pojo.User")
				.setFirstResult(firstResult)
				.setMaxResults(maxResults)
				.list();

		//查询总记录数
		Long count = (Long) session.createQuery(
				"SELECT COUNT(*) FROM seu.xinci.pojo.User")
				.uniqueResult();
		tx.commit();//提交事务
		//返回结果
		return new QueryResult(count.intValue(),list);
	} catch (Exception e) {
		session.getTransaction().rollback();//回滚事务
		throw new RuntimeException(e);
	} finally {
		session.close();//关闭session
	}
}


6、HQL简介

SQL
查询的是表和表中的字段。
不区分大小写


HQL
Hibernate Query Language
与SQL相似
查询的是对象和对象中的属性。
关键字不区分大小写,但类名与属性名区分大小写。

7、API与配置

API
        (1)、API简介。
        (2)、Session中的方法。
        (3)、查询:HQL与Criteria

配置:
        (1)、主配置文件
(2)、映射文件
                映射基础
                普通属性
                主键
                集合属性
                关联关系
                        一对多/多对一
                       多对多
                       一对一
                继承结构
------------------------------------------------------------------
-- API简介


Configuration 配置
        configure()
        configure(String resource)
        addResource(String resource)      导入一个指定位置的映射文件
        addClass(Class clazz)                  导入与指定类同一个包中的以类名为前缀,后缀为.hbm.xml的映射文件
        buildSessionFactory()

SessionFactory              Session工厂
        openSession()
        getCurrentSession()
        close()

Session                          很重要的一个对象
        操作对象的方法
        save(Object)
        update(Object)
        delete(Object)
        
        查询的方法
        createQuery(String) --> Query
        createCriteria(Class)
        管理事务的方法
        beginTransaction() --> Transaction
        getTransaction()   --> Transaction 获取当前Session中关联的事务对象
        其他的方法
        ...

Transaction            事务
        commit()
        rollback()
        是否提交,是否回滚

Query                      查询
        list()                 查询一个结果集合。
uniqueResult() 查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛异常。
...

-------------------------------------------------------------------
Hibernate主配置文件

(1)、配置的key前面的hibernate.前缀 可以有,也可以没有。如hibernate.dialect或dialect都可以。
(2)、按作用可分为三类:
       (a)、数据库信息
                 
                方言、JdbcUrl、驱动、用户名、密码
       (b)、导入映射文件:将对象与表连接起来

       (c)、其他配置
               
               show_sql                  显示生成的SQL语句
               format_sql                格式化生成的SQL语句
 
              hbm2ddl.auto           自动生成表结构
hibernate.hbm2ddl.auto:
validate            加载hibernate时,验证创建数据库表结构
create              每次加载hibernate,重新创建( 先删除后创建)数据库表结构
create-drop      加载hibernate时创建,退出是删除表结构
update             加载hibernate自动更新数据库结构( 如果表不存在就创建,不一样就更新,一样就什么都不做)

生成表结构的两种方式:
1,hbm2ddl.auto
2,使用SchemaExport工具类

Configuration cfg = new Configuration().configure();
SchemaExport schemaExport = new SchemaExport(cfg);
// 第一个参数script的作用: print the DDL to the console打印到控制台
// 第二个参数export的作用: export the script to the database导入到数据库
schemaExport.create(true, true);

注意:只能建表,不能建库

DDL:数据库模式定义语言,关键字:create
DML:数据操纵语言,关键字:Insert、delete、update
DCL:数据库控制语言 ,关键字:grant、remove
DQL:数据库查询语言,关键字:select


8、映射基础

反射利用无参构造器,无需new
final类不能被继承(影响懒加载),final变量不能改变,final方法不能被重写

持久化对象的要求

(1).提供一个无参的构造器。使Hibernate可以使用Constructor.newInstance() 来实例化持久化类。
(2).提供一个标识属性(identifier property)。通常映射为数据库表的主键字段。如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()。
(3).为持久化类的字段声明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。
(4).使用非final类(影响懒加载)。在运行时生成代理是Hibernate的一个重要的功能。如果持久化类没有实现任何接口,Hibnernate 使用 CGLIB 生成代理。如果使用的是 final 类,则无法生成CGLIB代理。
(5).重写eqauls()和hashCode()方法。如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。

OID

为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID)。

映射文件

映射文件的后缀为“.hbm.xml”。



	
	
	
		
            
		
		
		
		

		
		
		
		
		
		
		
		
				
		


测试APP:
public class App {

	private static SessionFactory sessionFactory;

	static {
		sessionFactory = new Configuration()//
				.configure()// 读取配置文件
				.addClass(User.class)//
				.buildSessionFactory();
	}

	@Test
	public void testSave() throws Exception {
		// 读取图片文件
		InputStream in = new FileInputStream( "c:/test.png");
		byte[] photo = new byte[in.available()];
		in.read(photo);
		in.close();
		
		// 创建对象实例
		User user = new User();
		user.setName("张三");
		user.setAge(20);
		user.setBirthday(new Date());
		user.setDesc("一大段的说明,此处省略5000字……");
		user.setPhoto(photo);

		// 保存
		Session session = sessionFactory.openSession(); // 打开一个新的Session
		Transaction tx = session.beginTransaction(); // 开始事务

		session.save(user);

		tx.commit(); // 提交事务
		session.close(); // 关闭Session,释放资源
	}

	
	@Test
	public void testGet() throws Exception {
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();

		User user = (User) session.get(User.class, 4); // 获取
		System.out.println(user.getId());
		System.out.println(user.getName());
		System.out.println(user.getDesc());
		System.out.println(user.getPhoto());
		
		OutputStream out = new FileOutputStream("c:/copy.png");
		out.write(user.getPhoto());
		out.close();

		tx.commit();
		session.close();
	}
}


Date date = new Date();当前时间
映射类型:
hibernate第一天——分页显示,数字类型互相转换intvalue(crl+h),hibernate的配置与API,建立表结构,final类型,映射文件,主键_第2张图片

 

主键:

主键:
如果是数字,建议使用 包装类型。Integer  null的属性比较好

普通类型:





	
	
		
		
		
			

			
            
            
        	
        	

			
            
            

			
        	

		
		
		
	
	



identity
sequence
hilo
native
assigned
uuid
foreign
...


9、回顾总结

Hibernate3.6
持久层的框架


添加环境:
        1,jar包
         2,配置文件
                hibernate.cfg.xml
                xxx.hbm.xml

使用Hibernate实现CRUD操作
        // --- 准备
        Configuration cfg = new Configuration().configure(); // hibernate.cfg.xml
        SessionFactory sessionFactory = cfg.buildSessionFactory(); // 只需要一个

        // --- 模板代码
        Session session = sessionFactory.openSession();
        Transaction tx = null;
        try{
                tx = session.beginTransaction();
                // 操作
                tx.commit();
        }catch(Exception e){
                tx.rollback();
                throw e;
        }finally{
                session.close();
        }

        // --- 操作
       Session中的方法:
                save(Object)            --> insert into ..
                update(Object)         --> update ..
                saveOrUpdate(Object)
                delete(Object)         --> delete ..
                get(Class, id)          --> select ...
                createQuery(hql)    --> select ..

主配置文件
        1,数据库信息
                 方言、URL、驱动、用户名、密码
        2,导入映射文件
        3,其他配置
                show_sql = true
                hbm2ddl.auto = update

映射配置:
         映射基础
                类 -- 表
                属性 -- 列
        映射普通属性
                name, type, column, length, not-null, ...
        映射主键
                主键生成略:native, uuid









你可能感兴趣的:(hibernate学习之路)