Hibernate -- 入门示例
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(); } }