包结构的详解:
在cn.itcast.a_primer中创建持久化对象的javabean,hibernate的实质就是操作对象的过程,就是操作数据库表。
1
2
3
4
5
6
7
8
|
public
class
Customer
implements
Serializable{
private
Integer id;
private
String name;
private
Integer age;
private
String des;
//省略set和get方法
}
|
第五步:hibernate.cfg.xml
在cn.itcast.a_primer中创建hibernate.cfg.xml,hibernate.cfg.xml是hibernate的核心配置文件,用来查询数据库,配置如何操作数据库,加载映射文件等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?
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.driver_class"
>com.mysql.jdbc.Driver</
property
>
<
property
name
=
"hibernate.connection.url"
>jdbc:mysql://localhost:3306/itcasthibernate?useUnicode=true&characterEncoding=utf8</
property
>
<
property
name
=
"hibernate.connection.username"
>root</
property
>
<
property
name
=
"hibernate.connection.password"
>root</
property
>
<!-- 其他配置 -->
<!-- 方言:用来指定hibernate操作的数据库 -->
<
property
name
=
"hibernate.dialect"
>org.hibernate.dialect.MySQL5Dialect</
property
>
<!-- hibernate操作对象用来执行操作数据库表,在控制台中显示sql语句 -->
<
property
name
=
"hibernate.show_sql"
>true</
property
>
<!--
hibernate.hbm2ddl.auto:用来建立对象和表的关联
* create:每次都会先删除表,再创建表,问题不能保存数据
* none:默认值:有表的时候,可以直接操作,没有表就会报错,默认向表中追加数据
* update:没有表就创建表,有表就直接操作数据
-->
<
property
name
=
"hibernate.hbm2ddl.auto"
>update</
property
>
<!-- 加载映射文件
1:class="cn.itcast.a_primer.Customer"(要求类和映射文件放在同一个目录下,而且文件名要相同)
2:resource=cn/itcast/a_primer/Customer.hbm.xml(第二种方式)
<mapping resource="cn/itcast/a_primer/Customer.hbm.xml"/>-->
</
session-factory
>
</
hibernate-configuration
>
|
创建 Hibernate 配置文件, Hibernate 从其配置文件中读取和数据库连接的有关信息, 这个文件应该位于应用的 classpath 下.
注:该映射文件的规范在org.hibernate.hibernate-configuration-3.0.dtd文件中
在javabean的同级目录下创建hibernate的映射文件(映射文件用来将持久化对象和属性关联数据库表和字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?
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
>
<!--
对象关联表
name:对象的全路径(底层使用反射)
table:映射表的名称
-->
<
class
name
=
"cn.itcast.a_primer.Customer"
table
=
"a_customer"
>
<!--
对象的属性映射表的字段
type:表示hibernate的映射类型,用来建立java类型和数据库类型的桥梁
* 使用java类型,比如java.lang.Integer
* integer
name:对象中的属性名称
column:表中的字段名称
* generator:hibernate的生成策略(重点)
sql-type="varchar(20)",指定数据库表中列的类型,默认是varchar(255)
-->
<
id
name
=
"id"
type
=
"integer"
>
<
column
name
=
"id"
></
column
>
<
generator
class
=
"increment"
></
generator
>
</
id
>
<
property
name
=
"name"
type
=
"string"
>
<
column
name
=
"name"
></
column
>
</
property
>
<
property
name
=
"age"
column
=
"age"
type
=
"integer"
></
property
>
<
property
name
=
"des"
column
=
"des"
type
=
"string"
></
property
>
</
class
>
</
hibernate-mapping
>
|
这里
创建对象-关系映射文件
l Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句
l 映射文件的扩展名为 .hbm.xml 这里Customer.hbm.xml文件
注:该映射文件的规范在org.hibernate.hibernate-mapping-3.0.dtd文件中
使用测试代码进行测试,创建App的测试类,使用junit进行测试
(1) hibernate的SessionFactory在初始化阶段只初始化一次即可,所有使用静
态代码块进行封装,其中Configuration是用来加载hibernate的配置文件和映射文件的,加载后可以获取SessionFactory。
1
2
3
4
5
6
7
|
private
static
SessionFactory sf =
null
;
static
{
Configuration configuration =
new
Configuration();
configuration.configure(
"cn/itcast/a_primer/hibernate.cfg.xml"
);
configuration.addClass(Customer.
class
);
sf = configuration.buildSessionFactory();
}
|
(2) 新增保存:save方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**保存*/
@Test
public
void
save(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
Customer c =
new
Customer();
c.setName(
"洪七公"
);
c.setAge(
60
);
c.setDes(
"帮助"
);
s.save(c);
tr.commit();
//实质上执行了2步操作,1:s.flush();//清理缓存,让session缓存中的数据与数据库同步,2:事务提交
s.close();
//Session的缓存就没有了
}
|
(3) 更新:update方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**更新*/
@Test
public
void
update(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
Customer c =
new
Customer();
c.setId(
3
);
c.setName(
"黄老邪"
);
c.setAge(
59
);
c.setDes(
"药师"
);
s.update(c);
tr.commit();
s.close();
}
|
(4) 删除:delete方法
1
2
3
4
5
6
7
8
9
10
11
|
@Test
public
void
delete(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
Customer c =
new
Customer();
c.setId(
3
);
s.delete(c);
tr.commit();
s.close();
}
|
(5) 查询:get和load方法
1
2
3
4
5
6
7
8
9
10
|
/**使用ID查询信息*/
@Test
public
void
findCustomerById(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
Customer c = (Customer) s.get(Customer.
class
,
2
);
System.out.println(c.getId()+
" "
+c.getName()+
" "
+c.getAge()+
" "
+c.getDes());
tr.commit();
s.close();
}
|
(6) 查询:query查询(支持hql语句,sql语句,qbc语句)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/**查询所有信息*/
@Test
public
void
findAllCustomerList(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
/**使用Hql语句:操作持久对象和属性
* 复习sql语句:操作数据库表和数据库表的列*/
Query query = s.createQuery(
"from Customer o"
);
List<Customer> list = query.list();
if
(list!=
null
&& list.size()>
0
){
for
(Customer c:list){
System.out.println(c.getId()+
" "
+c.getName()+
" "
+c.getAge()+
" "
+c.getDes());
}
}
tr.commit();
s.close();
}
|
附录: