面向对象开发中的问题:模型不匹配(阻抗不匹配)
Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等,数据库是关系模型,其主要概念有:表、主键、外键等。
解决办法
- 使用JDBC手工转换。
- 使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate 、TopLink. OJB 。
JDBC手工转换方法代码示例:
public void saveUser(User user) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn =JdbcUtils.getConnection();
String sql = "insert into user(name, age,birth_day, account) values(?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString( 1, user.getName()); //利用对象进行手工转换。
ps.setLong(2, user.getAge()); //利用对象进行手工转换。
ps.setTimestamp(3, new Timestamp(user.getBirthDay().getTime())); //利用对象进行手工转换。
ps.setLong( 4, user.getAccount()); //利用对象进行手工转换。
pS.executeUpdate();
rs = ps.getGeneratedKeys();
while (rs.next()) {
user.setId(rs.getInt(l));
}
} catch (SQLException e) {
}
}
安装配置:
下载地址http://www.hibernate.org,本教程使用3.2.5 。
将下载目录中/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:
antlr.jar, cglib.jar, asm.jar, commons-collections.jar, commons-logging.jar, jta.jar, dom4j.jar
连接的是mysql数据库,所以还需要mysql的jdbc驱动,mysql-connector-java-5.0.4-bin.jar。
Hibernate目录结构及说明:
hibernate的一个简单的例子:
一、在Eclipse里新建一个工程,导入上文所说的开发hibernate所需要的jar包。
二、写一个简单实体
User.java
package com.mzhj.hiberante.domain;
import java.util.Date;
public class User {
private int id;
private String name;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
三、为这个实体写映射文件(映射文件配置这个实体和数据库的映射关系)
这个映射文件比较复杂,可以在hibernate-3.2\eg\org\hibernate\auction目录下找到模板文件User.hbm.xml修改。映射文件的后缀不是必须为hbm.xml,但是按照hibernate的规范最好把后缀写成这样,别人一看就知道是hibernate的映射文件了。
User.hbm.xml映射文件:
<?xml version="1.0"?>
<HIBERNATE-MAPPING package="com.mzhj.hibernate.domain"><!--需要配置映射关系的那个实体所在的包,即User.java所在的包-->
<CLASS name="User"><!-- 配置User这个类与数据库表的映射关系 -->
<ID name="id">
<GENERATOR class=native />
</ID>
<property name="name"></property>
<property name="birthday"></property>
</CLASS>
</HIBERNATE-MAPPING>
三、为Hibernate写配置文件(配置连接的数据库的信息、映射文件位置等信息),配置文件名必须为hibernate.cfg.xml,并且必须放在类的根路径下
配置文件比较复杂,在目录hibernate-3.2\etc下拷贝模板hibernate.cfg.xml修改,hiberante有两种格式的配置文件:.properties和.xml,xml文件的可读性和可维护性都好于前者,一般使用xml的配置文件。
hibernate最终是通过操作jdbc来连接数据库的,因此jdbc驱动等信息也需要在hibernate配置文件中配置。
hibernate.cfg.xml中的配置信息比较多,配置选项在hibernate-3.2\etc文件夹下的hibernate.properties文件中都可以找到,配置连接MySql的配置文件,定位到hibernate.properties的49行## MySQL位置,下面的信息就是连接mysql数据库的配置信息,前半部分是属性名,后半部分是属性值。定位到361行,找到## auto schema export,配置数据库建表属性。
hibernate.cfg.xml代码:
<HIBERNATE-CONFIGURATION>
<SESSION-FACTORY>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- jdbc驱动配置,hibernate底层是通过jdbc来保存数据的,所以jdbc驱动是必须的。 -->
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<!-- 数据库url配置,三个///表示是本地主机的3306端口,也可以不简写jdbc:mysql://localhost:3306/test -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mzhj627354</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 设置一下Hibernate的方言,这个设置时告诉hibernate连接的是什么数据库,这个是hibernate跨平台的基础,hibernate根据不同的数据库,把保存对象的语句转化成与具体数据库对应的jdbc语句。 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置建表属性,update为如果不一致,会更新一下表结构 ,没有会建表 -->
<MAPPING resource="com/mzhj/hibernate/domain/User.hbm.xml" />
<!-- 告诉Hibernate,实体的映射文件在什么地方,hibernate根据映射文件建立起实体与数据库的关系(建表,验证表等),hibernate初始化的时候会自动找类根路径下hibernate.cfg.xml文件,但不会去自动找实体的映射文件,所以要在此配置映射文件位置,否则hibernate将不认识这个实体。 -->
</SESSION-FACTORY>
</HIBERNATE-CONFIGURATION>
hibernate.hbm2ddl.auto的四个选项:
#hibernate.hbm2ddl.auto
-
create-drop 程序启动,hibernate初始化的时候,先删掉表,然后创建表;程序运行结束后把所有表删掉。
-
create 程序启动,在创建表前会把表删掉。当虚拟机退出的时候(在hibernate退出的时候),它不会删表 (和上一种通常在测试环境下使用)。
-
update 如果不一致,会更新一下表结构。如果没有表会新建表。
-
validate 会校验映射文件跟表结构是否对应,如果不对应,不会update,而是报错。(这种方式更安全一些)。
四、写测试代码
Base.java
package com.mzhj.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.mzhj.hibernate.domain.User;
public class Base {
public static void main(String args[]){
Configuration cfg=new Configuration(); //找到hibernate.cfg.xml文件初始化一下。
SessionFactory sf=cfg.configure().buildSessionFactory(); //通过初始化对象获得Session工厂。
//Configuration对象必须先调用一下confgiure方法,否则会出现Hibernate Dialect must be explicitly set错误。
Session session=sf.openSession(); //得到Session对象。
User user=new User();
user.setBirthday(new Date());
session.beginTransaction(); //开启事务,否则不能保存成功,除非这个数据库用的引擎是不支持事务的引擎如:MyISAM引擎。
session.save(user);
session.getTransaction().commit(); //提交事务。
}
}
不开启事务也能保存成功的原因,可能是这张表所使用的数据库引擎不支持事务,如MyISAM引擎就不支持事务。查看数据库引擎的命令:show create table 表名;
hibernate工程的基本目录结构如下图:
进入MySql的命令是:在cmd内输入mysql -u 用户名 -p 密码;
进入sql后,切换数据库的命令是:use 数据库名;
显示数据库表详细信息的命令是:show create table 表名;此命令还可以查看表所用的引擎(MyISAM引擎不支持事务和外键),如图:
查看mysql数据库支持的所有引擎用命令:show engines;效果如下图:
- 大小: 25 KB
- 大小: 56.2 KB
- 大小: 69.3 KB
- 大小: 52.3 KB
分享到:
相关推荐
01 hibernate介绍与动手入门体验
hibernate介绍与动手入门体验
传智播客\传智播客hibernate\01_传智播客hibernate教程_hibernate介绍与动手入门体验
Hibernate入门到精通,分享Hibernate的干货,带你入门,走向精通。
Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门...
Hibernate简介与快速入门,中软国际培训资料
hibernate开发流程 入门 hibernate开发流程 入门 hibernate开发流程 入门hibernate开发流程 入门 hibernate开发流程 入门
传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...
经典hibernate教程,从入门到精通经典hibernate教程,从入门到精通经典hibernate教程,从入门到精通经典hibernate教程,从入门到精通经典hibernate教程,从入门到精通经典hibernate教程,从入门到精通经典hibernate教程,从...
hibernate hibernate入门 hibernate学习 hibernate基础
Hibernate新手入门,详细讲解hibernate框架技术,以及这门技术所包含的orm思想等。
hibernate官方入门教程中文版
Hibernate入门案例,提供MyEclipse和Eclipse的项目源文件以及war文件
解压后包含hibernate入门所需jar (hibernate常用jar,mysql驱动,Junit4jar)
hibernate入门
最经典的hibernate教程_从入门到精通_第一篇
最简单的Hibernate入门demo,使用IntelliJ Idea + Maven。
Hibernate入门教程.pdf
最经典的hibernate教程_从入门到精通_第一篇(共四篇)
Hibernate介绍,介绍了Hibernate相关的知识点,是入门的一份文档!