1. 步骤
如何开发一个hibernate程序
* 建立java工程
* 引入相关的jar包
* hibernate的相关jar包
hibernate-distribution-3.5.6-Final\lib\required\*.jar
hibernate-distribution-3.5.6-Final\hibernate3.jar
hibernate-annotations-3.4.0.GA\lib\test\slf4j-log4j12.jar
hibernate-annotations-3.4.0.GA\lib\test\log4j.jar
* junit测试的jar包
junit-4.8.2.jar
* mysql的驱动jar包
mysql-connector-java-5.1.10-bin.jar
* 创建表
CREATE TABLE customers
(
id INT PRIMARY KEY,
NAME VARCHAR(12),
age INT,
des TEXT
)
* 创建表对应的javaBean
public class Customer {
private Integer id;
private String name;
private Integer age;
private String des
}
* 创建表和javaBean的映射文件Customer.hbm.xml 该文件和javaBean放置在同一个目录下
* 该映射文件的规范在hibernate3.jar包下org.hibernate下hibernate-mapping-3.0.dtd
* 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- class标签建立javaBean和表之间的映射-->
<class name="cn.itcast.primer.Customer" table="customers">
<!-- 用id来映射表中的主键 -->
<id name="id" type="integer">
<column name="id"/>
<!-- 配置主键的生成策略-->
<generator class="increment"/>
</id>
<!-- property建立javaBean中的属性和表中列的对应关系
type="string":string表示的是hibernate的类型,该类型是java类型和sql类型之间的桥梁
java中的类型:String name; sql中的类型:varchar(255):
type="string": string(唯一)对应的是hibernate中的一个类org.hibernate.type.StringType
映射一个sql的varchar类型到java的String类型
-->
<property name="name" type="string">
<!--column定义表中的列 sql-type表示表中列的类型 -->
<column name="name"/>
</property>
<property name="age" type="integer">
<column name="age"/>
</property>
<property name="des" type="string">
<column name="des"/>
</property>
</class>
</hibernate-mapping>
* 创建hibernate的配置文件hibernate.cfg.xml,放置在src下
* 该映射文件的规范在hibernate3.jar包下org.hibernate下hibernate-configuration-3.0.dtd
* 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<!-- 配置数据库的方言,让hibernate知道连接的是哪个数据库-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 显示hibernate生成的sql语句 -->
<property name="hibernate.show_sql">true</property>
</session-factory>
</hibernate-configuration>
* 定义App类测试
public static void main(String[] args) {
//加载hibernate的配置文件hibernate.cfg.xml文件
Configuration config=new Configuration();
//默认加载类路径下的/hibernate.cfg.xml文件
config.configure();
//加载映射文件
//方法一
//config.addResource("cn/itcast/primer/Customer.hbm.xml");
//方法二(使用该方法加载映射文件,要求1:映射文件和Customer.java文件必须在同一个目录下
//2 映射文件和Customer.java文件文件的名称相同)
config.addClass(Customer.class);
/*
* 利用上面的配置生成SessionFactory
* * sessionFactory保存连接数据库的配置信息和映射文件的信息.
*/
SessionFactory sf=config.buildSessionFactory();
//从SessionFactory获取session
Session session=sf.openSession();
//开始事务
Transaction tx=session.beginTransaction();
//创建Customer对象
Customer c=new Customer();
c.setName("zhang");
c.setAge(34);
c.setDes("xxx");
//保存对象
session.save(c);
//提交事务
tx.commit();
//关闭session
session.close();
}
2. 示例代码
Customer.java , java bean 文件
package cn.itcast.primer;
/**
* 表对应的javaBean,该javaBean的数据最终要存入到数据库中
*/
public class Customer {
/*
* CREATE TABLE customers
(
id INT PRIMARY KEY,
NAME VARCHAR(12),
age INT,
des TEXT
)
*/
private Integer id;
private String name;
private Integer age;
private String des;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
}
Customer.hbm.xml 对象与数据表映射配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- class标签建立javaBean和表之间的映射-->
<class name="cn.itcast.primer.Customer" table="customers">
<!-- 用id来映射表中的主键 -->
<id name="id" type="integer">
<column name="id"/>
<!-- 配置主键的生成策略-->
<generator class="increment"/>
</id>
<!-- property建立javaBean中的属性和表中列的对应关系
type="string":string表示的是hibernate的类型,该类型是java类型和sql类型之间的桥梁
java中的类型:String name; sql中的类型:varchar(255):
type="string": string(唯一)对应的是hibernate中的一个类org.hibernate.type.StringType
映射一个sql的varchar类型到java的String类型
-->
<property name="name" type="string">
<!--column定义表中的列 sql-type表示表中列的类型 -->
<column name="name"/>
</property>
<property name="age" type="integer">
<column name="age"/>
</property>
<property name="des" type="string">
<column name="des"/>
</property>
</class>
</hibernate-mapping>
hibernate.cfg.xml, hibernate配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<!-- 配置数据库的方言,让hibernate知道连接的是哪个数据库-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 配置利用javaBean和映射文件生成数据库中的表
hibernate.hbm2ddl.auto值
* create:执行时,先查找该表是否存在,如存在先删除表,在创建表
* none:不能创建表,只能往表中插入数据,如表不存在抛出异常,默认值
* update:执行时,
情况一:
先查找该表是否存在,如果表存在,直接插入,如果表不存在,先创建表,再插入数据.
情况二:
先查找该表是否存在,如果表存在,但表的结构不一样,要修改表的结构
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 显示hibernate生成的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 显示格式化得sql语句 -->
<property name="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
App.java 操作数据库的java程序
package cn.itcast.primer;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App {
private static SessionFactory sf=null;
static{
Configuration config=new Configuration();
config.configure();
config.addClass(Customer.class);
sf=config.buildSessionFactory();
}
/**
* 在hibernate的操作中,crud都要开启事务
*/
@Test
public void saveCustomer(){
Session session=sf.openSession();
//开启事务
Transaction tx=session.beginTransaction();
Customer c=new Customer();
c.setName("zhang");
c.setAge(34);
c.setDes("xxx");
session.save(c);
//提交事务
tx.commit();
session.close();
}
/**
* 更新
*/
@Test
public void updateCustomer(){
Session session=sf.openSession();
//开启事务
Transaction tx=session.beginTransaction();
Customer c=new Customer();
c.setId(1);
c.setName("zhuge");
c.setAge(32);
c.setDes("情报");
session.update(c);
//提交事务
tx.commit();
session.close();
}
/**
* 删除
*/
@Test
public void deleteCustomer(){
Session session=sf.openSession();
//开启事务
Transaction tx=session.beginTransaction();
Customer c=new Customer();
c.setId(1);
session.delete(c);
//提交事务
tx.commit();
session.close();
}
/**
* 查询
*/
@Test
public void findCustomerById(){
Session session=sf.openSession();
//开启事务
Transaction tx=session.beginTransaction();
Customer c=(Customer)session.load(Customer.class, 2);
System.out.println(c.getId()+" "+c.getName());
//提交事务
tx.commit();
session.close();
}
/**
* 查询所有的客户信息
*/
@Test
public void findCustomers(){
Session session=sf.openSession();
//开启事务
Transaction tx=session.beginTransaction();
/*
* Query接口是hibernate的查询接口
* sql语句:是面向表的 select * from customers
* hql语句:面向对象的 select o from Customer o;
*/
Query query=session.createQuery("from Customer");
List<Customer> list=query.list();
if(list!=null&&list.size()>0){
for(Customer c:list){
System.out.println(c.getId()+" "+c.getName());
}
}
//提交事务
tx.commit();
session.close();
}
}