一.Hibernate
hibernate是基于ORM映射的数据持久层框架,封装了DAO层
hibernate框架搭建步骤:
1.引入jar包 11个
2.添加hibernate的配置文件hibernate.cfg.xml
3.建表 tab_customer表 id,name,des,age
4.创建实体类 Customer类 id,name,des,age
5.添加映射文件,建立持久化类和表的映射关系 *.hbm.xml
6.测试
使用hibernate注解的方法配置映射信息需要引入:
ejb3-persistence.jar
hibernate-commons-annotations.jar
hibernate-annotations.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
安装与配置hibernate(注解):
hibernate.hbm.xml 文件中把引xxx.hbm.xml改为引用实体类即把:
<mapping resource=“xxx.hbm.xml"/>
改为:<mapping class=“xxx" />
eg:
<mapping resource="com/edu/oid/Customer.hbm.xml" />
改为<mapping class="com.edu.anno.Customer" />
持久化类中:
@Entity //表示当前类是一个持久化类 引的是javax.persistence中的Entity
@Table(name="anno_cus") //定义映射表的信息。name属性表示表名称
@Id //主键
@Column(length=255,unique=true) //其他字段 字段长度255,设置唯一约束
@Transient //该属性不会被映射
主键约束与唯一约束区别:
一张表里只能有一个主键约束,可以有多个唯一约束,主键不能为空,而唯一可以为空
1 package com.edu.anno; 2 3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.Id; 6 import javax.persistence.Table; 7 import javax.persistence.Transient; 8 9 10 @Entity//表示当前类是一个持久化类 11 @Table(name="anno_cus")//定义映射表的信息。name属性表示表名称 12 public class Customer { 13 14 @Id 15 private int id; 16 @Column(length=255,unique=true) 17 private String name; 18 @Transient//该属性不会被映射 19 private int age; 20 private String des; 21 public int getId() { 22 return id; 23 } 24 public void setId(int id) { 25 this.id = id; 26 } 27 //@Column 28 public String getName() { 29 return name; 30 } 31 public void setName(String name) { 32 this.name = name; 33 } 34 public int getAge() { 35 return age; 36 } 37 public void setAge(int age) { 38 this.age = age; 39 } 40 public String getDes() { 41 return des; 42 } 43 public void setDes(String des) { 44 this.des = des; 45 } 46 47 48 }
加载配置文件:
Configuration cfg = new Configuration();
cfg.configure("com/edu/anno/hibernate.cfg.xml");
改为 AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.configure("com/edu/anno/hibernate.cfg.xml");
•需求:使用单元测试工具,测试hibernate 的增删改查(CRUD)操作
引包(11个)
日志处理引过来直接放在src下:
log4j.properties
1 ### direct log messages to stdout ### 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 log4j.appender.stdout.Target=System.out 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 5 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 6 7 ### direct messages to file hibernate.log ### 8 #log4j.appender.file=org.apache.log4j.FileAppender 9 #log4j.appender.file.File=hibernate.log 10 #log4j.appender.file.layout=org.apache.log4j.PatternLayout 11 #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 12 13 ### set log levels - for more verbose logging change 'info' to 'debug' ### 14 15 log4j.rootLogger=warn, stdout 16 17 log4j.logger.org.hibernate=info 18 19 ### log just the SQL 20 #log4j.logger.net.sf.hibernate.SQL=debug 21 22 ### log JDBC bind parameters ### 23 log4j.logger.org.hibernate.type=info 24 25 ### log schema export/update ### 26 log4j.logger.org.hibernate.tool.hbm2ddl=debug 27 28 ### log cache activity ### 29 #log4j.logger.net.sf.hibernate.cache=debug 30 31 ### enable the following line if you want to track down connection ### 32 ### leakages when using DriverManagerConnectionProvider ### 33 #log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace
数据库表的字段与实体类属性在Customer.hbl.xml中配置映射
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 5 <hibernate-mapping> 6 <!-- table是表名,name是实体类属性名,column是字段名 --> 7 <class name="com.edu.domain.Customer" table="tab_customer"> 8 <id name="id" column="id" type="integer"> 9 <!-- 主键生成策略 --> 10 <generator class="increment"/> 11 </id> 12 <!-- 配置普通属性 --> 13 <property name="name" column="name" type="string"/> 14 <property name="age" column="age" type="integer"/> 15 <property name="des"/> 16 </class> 17 </hibernate-mapping>
hibernate.cfg.xml映射配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 配置数据库连接的基本信息 --> 8 <property name="hibernate.connection.driver_class"> 9 oracle.jdbc.driver.OracleDriver 10 </property> 11 <property name="hibernate.connection.url"> 12 jdbc:oracle:thin:@localhost:1521:XE 13 </property> 14 <property name="hibernate.connection.username">lihengyu</property> 15 <property name="hibernate.connection.password">lihengyu</property> 16 17 <!-- 数据库的方言 使用的是哪种数据库 --> 18 <property name="hibernate.dialect"> 19 org.hibernate.dialect.Oracle10gDialect 20 </property> 21 <!-- 显示sql语句 --> 22 <property name="hibernate.show_sql">true</property> 23 <!-- 自动创建数据库表 24 none:默认值 有表就使用,没表不创建 25 create:每次都创建新表 26 update: 有表就使用,没表创建。如果持久化类及映射文件发生改变,则发生alter语句修改表结构。 27 --> 28 <property name="hibernate.hbm2ddl.auto">update</property> 29 30 <!-- 添加映射文件 --> 31 <mapping resource="com/edu/domain/Customer.hbm.xml" /> 32 33 </session-factory> 34 35 36 </hibernate-configuration>
实体类Customer
1 package com.edu.domain; 2 /** 3 * 持久化类 映射 数据库中tab_customer表 4 * @author Administrator 5 * 6 */ 7 public class Customer { 8 9 private int id; 10 private String name; 11 private int age; 12 private String des; 13 public int getId() { 14 return id; 15 } 16 public void setId(int id) { 17 this.id = id; 18 } 19 public String getName() { 20 return name; 21 } 22 public void setName(String name) { 23 this.name = name; 24 } 25 public int getAge() { 26 return age; 27 } 28 public void setAge(int age) { 29 this.age = age; 30 } 31 public String getDes() { 32 return des; 33 } 34 public void setDes(String des) { 35 this.des = des; 36 } 37 38 39 }
1 TestHibernate测试 2 3 package com.edu.domain; 4 5 import java.util.List; 6 7 import org.hibernate.SessionFactory; 8 import org.hibernate.Transaction; 9 import org.hibernate.cfg.Configuration; 10 import org.hibernate.classic.Session; 11 import org.junit.Test; 12 13 /** 14 * 使用单元测试工具,测试hibernate 的增删改查(CRUD)操作 15 * 16 * @author Administrator 17 * 18 */ 19 public class TestHibernate { 20 21 private static SessionFactory sf; 22 static { 23 // 1. 加载配置文件 24 Configuration cfg = new Configuration(); 25 cfg.configure("com/edu/domain/hibernate.cfg.xml"); 26 27 // 2. 获得SessionFactory 28 sf = cfg.buildSessionFactory(); 29 } 30 31 /** 32 * 用户保存 33 */ 34 @Test 35 public void save() { 36 37 Session session = sf.openSession(); 38 Transaction tran = session.beginTransaction(); 39 40 Customer c = new Customer(); 41 c.setName("tom1"); 42 c.setAge(12); 43 c.setDes("cat"); 44 45 session.save(c); 46 47 tran.commit(); 48 session.close(); 49 } 50 /** 51 * 按id查询用户 52 */ 53 @Test 54 public void findById() { 55 56 Session session = sf.openSession(); 57 Transaction tran = session.beginTransaction(); 58 59 Customer c = (Customer) session.get(Customer.class, 2); 60 System.out.println(c.getName()); 61 62 tran.commit(); 63 session.close(); 64 } 65 /** 66 * 删除客户 67 */ 68 @Test 69 public void delete() { 70 71 Session session = sf.openSession(); 72 Transaction tran = session.beginTransaction(); 73 74 Customer c = (Customer) session.get(Customer.class, 3); 75 76 session.delete(c); 77 78 tran.commit(); 79 session.close(); 80 } 81 82 /** 83 * 编辑客户 84 */ 85 @Test 86 public void update() { 87 88 Session session = sf.openSession(); 89 Transaction tran = session.beginTransaction(); 90 91 Customer c = (Customer) session.get(Customer.class, 2); 92 93 c.setName("松江"); 94 95 session.update(c); 96 97 tran.commit(); 98 session.close(); 99 } 100 /** 101 * 查询所有客户 102 */ 103 @Test 104 public void findAll() { 105 106 Session session = sf.openSession(); 107 Transaction tran = session.beginTransaction(); 108 109 List<Customer> cs = session.createQuery( 110 "from Customer").list(); 111 112 for (Customer c : cs) { 113 System.out.println(c.getName()); 114 } 115 116 tran.commit(); 117 session.close(); 118 } 119 }
运行结果