发表于: 2017-02-12 21:18:56

1 1704


上回的两个小问题,executeQuery和execcuteUpdate的区别:

方法executeQuery 
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。 
方法executeUpdate 
用于执行 INSERTUPDATE DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE DROP TABLEINSERTUPDATE DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

 

持久化框架Hibernate

瞬时状态:保存在内存中的数据,程序退出后数据就消失了,为瞬时状态。

持久状态:保存在磁盘上的数据,持久存在。

持久化:将程序数据在瞬时和持久状态间转换的机制。


JDBCHibernate相同点:

Hibernate是对JDBC进行了轻量级的对象封装,更好的使用面向对象思想编程,不必书写sql语句。

1:两者都是对java的数据库操作中间构件

2:两者对DB的操作都不是线程安全的,需要关闭

3:两者都可以对DB的更新操作进行显示的实物处理

不同点:

1JDBC使用SQL语言,Hibernate则使用HQL语言。

2JDBC直接操纵数据,将SQL发送到数据库执行,Hibernate操作持久化对象,由底层持久化对象的数据更新到DB中。

3:数据状态不同:JDBC操作的数据是瞬时的,hibernate操作的数据是可持久的,持久化对象的数据属性是与DB中的数值随动的。

ORM:对象-关系映射:Object-ReativeDB Mapper完成对象数据到DB数据的映射机制称为ORM.

网上查了一些资料,原来对于Maven工程,编译的工作是由Maven程序来完成的,而Maven默认只会把src/main/resources文件夹下的文件拷贝到target/classes文件夹下,所以图中的xml等配置文件必须放在res目录下,否则hbm.xml等都不会被复制到/target/calsses文件夹下,所以Hibernate框架在运行的时候,就会报找不到*.hbm.xml的错误。

测试类代码如下:

public void init(){

//创建配置对象

Configuration config = new Configuration().configure();

//创建会话工厂

sessionFactory = config.buildSessionFactory();

//使用工厂创建出会话对象

session = sessionFactory.openSession();

//开始事务

transaction = session.beginTransaction();

}

@Test

public void testSaveStudents(){

//生成学生对象

Students s = new Students(1,"zhangsanf","男",new Date(),"wudangshan");

//保存对象进入数据库

session.save(s);

}运行结果如下:

Hibernate.cfg.xml常用配置:

<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&charcaterEncoding=UTF-8</property>

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="show_sql">true</property>

<property name="format_sql">true</property>

<property name="hbm2ddl.auto">create</property>

Connection.xml:数据库连接

Dialect:数据库方言,可针对特殊的数据库进行优化

Hbm2ddl.auto:java代码生成数据库脚本,如create,update,create_drop,vaildate

Creste:drop table if exists info;

Show_sql:hibernate运行时的sql语句输出到控制台以便测试

Fremat_sql:将输出控制台的sql格式化

Default_schema:控制台输出时显示使用的数据库

 

Session简介:

Session是操纵数据库的对象,一个session都有一个对应的connection,一个conn可供多个session使用。

OpenSession()

getCurrentSession()使用前需要再配置文件中进行配置

<property name="hibernate.current_session_context_class">thread</property>

openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session

getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 。一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession

Transaction事务简介:

Hibernate对数据的操作都封装在事务中,用session操作数据,必须先开启事务,再提交。

也可以通过设置重写doWork()使hibernatejdbc一样自动提交事务。

单一主键:

Assigned:由java负责,手动给主键赋值

Native:由底层数据库负责生成,根据数据库不同采用不同自增语句,自动赋值

映射数据类型:

Hibernate实现CURD:

session.Save();delete();update();set();load();代码如下:

@Test

public void testSaveStudents(){

//生成学生对象

s = new Students(5,"zhangsanf","男",new Date(),"wudangshan");

//保存对象进入数据库

session.save(s);

}

@Test

public void testGetStudent(){

s = (Students)session.get(Students.class, 5);

System.out.println(s);

}

@Test

public void testLoadStudent(){

s = (Students)session.load(Students.class, 5);

System.out.println(s);

}

@Test

public void testUpdateStudent(){

s = (Students)session.get(Students.class, 5);

s.setName("lihi");

session.update(s);

}

@Test

public void testDeleteStudent(){

s = (Students)session.get(Students.class, 5);

session.delete(s);

}

Getload的区别:

Get再调用之后立刻像DB发送并执行sql语句,返回一个持久化对象

Load调用会返回一个代理对象,该返回值保存了实体对象的id,直至使用该对象的非主键属性时菜发送sql语句

查询数据库不存在的数据时,get返回nullload抛出异常。

Mybaits

hibernate:是一个标准化的ORM框架。入门的门槛较高,不需要程序写sql,语句就自动生成了。对sql进行优化、修改比较困难。

应用场景:适用于中小企业需求变化不多的项目,比如后台管理系统,erpormoa

mybatis:专注sql本身,程序员需要自己写sql语句,sql的修改与优化比较方便。它是一个不完全的ORM框架,虽然程序员自己写sql,但它自身也可以实现映射。

应用场景:适用于需求变化较多的项目,比如互联网。

mybaits也是写配置文件config.xml,建立实体类,写映射文件mapper.xml,再写测试类。


用mybaits实现CURD还差一点写完了,就不写进今天的日报了,这两个框架都是今天刚开始接触的,就把这日报当成笔记写了,期间有大量时间浪费再debug上,总是各种小错误,大小写符号包名。

明天把任务1改造成mybatis框架的



返回列表 返回列表
评论

    分享到