发表于: 2017-02-12 21:18:56
1 1704
上回的两个小问题,executeQuery和execcuteUpdate的区别:
方法executeQuery
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。
方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
持久化框架Hibernate
瞬时状态:保存在内存中的数据,程序退出后数据就消失了,为瞬时状态。
持久状态:保存在磁盘上的数据,持久存在。
持久化:将程序数据在瞬时和持久状态间转换的机制。
JDBC与Hibernate相同点:
Hibernate是对JDBC进行了轻量级的对象封装,更好的使用面向对象思想编程,不必书写sql语句。
1:两者都是对java的数据库操作中间构件
2:两者对DB的操作都不是线程安全的,需要关闭
3:两者都可以对DB的更新操作进行显示的实物处理
不同点:
1:JDBC使用SQL语言,Hibernate则使用HQL语言。
2:JDBC直接操纵数据,将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()使hibernate像jdbc一样自动提交事务。
单一主键:
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);
}
Get与load的区别:
Get再调用之后立刻像DB发送并执行sql语句,返回一个持久化对象
Load调用会返回一个代理对象,该返回值保存了实体对象的id,直至使用该对象的非主键属性时菜发送sql语句
查询数据库不存在的数据时,get返回null,load抛出异常。
Mybaits
hibernate:是一个标准化的ORM框架。入门的门槛较高,不需要程序写sql,语句就自动生成了。对sql进行优化、修改比较困难。
应用场景:适用于中小企业需求变化不多的项目,比如后台管理系统,erp、orm、oa。
mybatis:专注sql本身,程序员需要自己写sql语句,sql的修改与优化比较方便。它是一个不完全的ORM框架,虽然程序员自己写sql,但它自身也可以实现映射。
应用场景:适用于需求变化较多的项目,比如互联网。
mybaits也是写配置文件config.xml,建立实体类,写映射文件mapper.xml,再写测试类。
用mybaits实现CURD还差一点写完了,就不写进今天的日报了,这两个框架都是今天刚开始接触的,就把这日报当成笔记写了,期间有大量时间浪费再debug上,总是各种小错误,大小写符号包名。
明天把任务1改造成mybatis框架的
评论