Hibernate的配置
总配置:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- hibernate的配置文件,创建在src目标中,配置访问数据库的驱动,用户名,密码等 -->
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class" >com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- 告诉hibernate使用的是MySQL数据库 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- hibernate事务管理方式 ,每个线程一个事务 -->
<property name="current_session_context_class">thread</property>
<!-- true:打印出sql语句到控制台 -->
<property name="show_sql">true</property>
<!-- 表示是否会自动更新数据库的表结构,可以不用创建表,自动创建 -->
<property name="hbm2ddl.auto">update</property>
<!-- 对应的类的xml -->
<mapping resource="com/study/hibernate/Category.hbm.xml" />
</session-factory>
</hibernate-configuration>
每个类的单独配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 这是类Category的配置文件,创建在该类包目录中, hibernate-mapping代表该类的包名-->
<hibernate-mapping package="com.study.hibernate">
<!-- name:类名,table:该类对应的表名 -->
<class name="Category" table="Category">
<!-- name:主键名 column:对应表主键字段id -->
<id name="id" column="id">
<!-- id的自增长方式采用数据库的本地方式 -->
<generator class="native"></generator>
</id>
<!-- 类Category的属性名 -->
<property name="name" />
</class>
</hibernate-mapping>
类代码:一定要有getter,setter
package com.study.hibernate;
public class Category {
public int id;
public String name;
public Category(String name) {
this.name=name;
}
public Category() {}
public void setId(int id) {
this.id=id;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
}
Hibernate中类的状态:
//对象在hibernate中的状态,瞬时,持久,脱管
public static void method() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
Category c=new Category("hibernate");//此时Category对象是瞬时的
s.save(c);//此时对象Category是持久的
s.getTransaction().commit();//此时对象Category是脱管的
s.close();
sf.close();
Hibernate获取存在数据库中对象的的方法
//获取数据库中数据的方法
public static void getMethod() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
//传入Category类的类类型,和主键id
Category c=(Category)s.get(Category.class, 1);
s.getTransaction().commit();
System.out.println(c.getName());
s.close();
sf.close();
}
Hibernate删除数据的方法
//删除数据的方法
public static void delete() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
//获取id为5的字段
Category c=(Category)s.get(Category.class, 5);
//删除获得的字段
s.delete(c);
s.getTransaction().commit();
s.close();
sf.close();
}
Hibernate更新数据的方法
//修改数据的方法
public static void update() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
//获取对象
Category c=(Category)s.get(Category.class, 4);
System.out.println(c);
//修改对象
c.setName("newIphone");
//更新对象
s.update(c);
s.getTransaction().commit();
s.close();
sf.close();
}
Hibernate查找数据的方法(不常用)
//查找数据的方法(不常用)
public static void select() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
//获取Query对象 ,HQL语句不用写select*
Query q=s.createQuery("from Category c where c.name like?");
//与preparedStatement不同的是计算从0开始;
//%name:表示左匹配。 name%:表示右匹配。 %name%:表示模糊查询。
q.setString(0, "%iphone2%");
s.getTransaction().commit();
List<Category> list=q.list();
for(Category c:list) {
System.out.println(c);
}
s.close();
sf.close();
}
//通过Criteria查找数据
public static void selectFromCriteria() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
//获取criteria对象
Criteria criteria=s.createCriteria(Category.class);
//增加约束
criteria.add(Restrictions.like("name","%iphon%"));
List<Category> list=criteria.list();
for(Category c:list) {
System.out.println(c);
}
}
//通过标准Sql查询
public static void selectFromSql() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
SQLQuery query=s.createSQLQuery("Select * from Category c where c.name like 'iphone%'");
s.getTransaction().commit();
List<Object[]> list=query.list();
for(Object[] c:list) {
for(Object o:c) {
//Category category=(Category)o;
System.out.println(o);
}
}
}
//一对多关系
public static void manyToOne() {
SessionFactory sf=new Configuration().configure().buildSessionFactory();
Session s=sf.openSession();
s.beginTransaction();
//先把one存入
Category c=new Category("iphone");
s.save(c);
//product 对应一个category
Product p=(Product)s.get(Product.class, 1);
System.out.println(p.getName());
p.setCategory(c);
s.update(p);
s.getTransaction().commit();
s.close();
sf.close();
}
1.为Product类增加Category属性;
2.在Product.hbm.xml中设置many-to-one属性;
<many-to-one name="category" class="Category" column="cid" />
3.在hibernate.cfg.xml中加入类Category的映射;