首先这是我的工程文件目录,单做hibernate的操作,没有与任何集成:
1.加载jar包
2.配置hibernate.cfg.xml文件:
基本都是模板化的东西,照着填就行了。这个文件只在初始化的时候用,如果与别的框架集合,则没有此文件。
<?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-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 指定数据库类型 -->
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property><!-- 指定数据库地址 -->
<property name="connection.username">root</property><!-- 指定数据库连接用户名 -->
<property name="connection.password">admin</property><!-- 指定数据库连接密码 -->
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property><!-- 指定数据库连接池大小 -->
<!-- SQL dialect --><!-- 必须定义 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 指定数据库方言 -->
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property><!-- 指定缓存方式,当前不使用缓存机制 -->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property><!-- 为了debug方便,查看自动生成的SQL语句 -->
<property name="format_sql">true</property><!-- 为了debug方便,把一行的SQL语句分多行显示,便于查看 -->
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property><!-- 定义是否自动生成数据库表,当前为自动生成 -->
<!-- 两种定义映射的方式(都行): -->
<!-- 1.配置文件使用这一种 -->
<mapping resource="com/slh/hibernate/po/Employee.hbm.xml"/><!-- 定义需要管理的映射文件 -->
<!-- 2.注解方式使用这一种 -->
<mapping class="com.slh.hibernate.po.Student"/><!-- 定义在注解方式下需要管理的实体类 -->
</session-factory>
</hibernate-configuration>
3.新建一个表的实体类:
这里有两种方式,一种用xml文件配置,一种用注解方式配置。
建议大项目用xml便于管理,小项目用注解方便。
3.1使用xml方式:
/**
* 使用xml配置方式,用于大项目,便于管理。
* @author Administrator
*
*/
public class Employee {
private Integer id; // OID,标识符属性,对应数据库主键
private String name;
private char sex;
private String job;
private double salary;
private Date hiredate;
private String temp; // 没有在XML映射文件里声明,故不交给hibernate管理,与数据库字段无关仅用于用户自定义使用
// 无参构造方法,必须有
public Employee() {
super();
}
public Employee(String name, char sex, String job, double salary,
Date hiredate) {
super();
this.name = name;
this.sex = sex;
this.job = job;
this.salary = salary;
this.hiredate = hiredate;
}
// get和set方法,必须有
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", sex=" + sex
+ ", job=" + job + ", salary=" + salary + ", hiredate="
+ hiredate + ", temp=" + temp + "]";
}
}
对应的映射文件:
<?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">
<!-- 指定映射包 -->
<hibernate-mapping package="com.slh.hibernate.po">
<!-- 由于上面指定了映射包,所以这里直接写实体类名;否则要写全名 -->
<class name="Employee" table="t_emps"><!-- 这个类对应的表名 -->
<!-- 主键映射 -->
<id name="id" column="id">
<!-- 主键的生成策略,当前代表使用数据库自动增长策略(就是1,2,3……递增) -->
<generator class="native"></generator>
</id>
<!-- 其它属性的映射 -->
<property name="name" column="ename" length="30" not-null="true"/><!-- 实体类字段名对应表字段名,长度,不为空 -->
<property name="sex" /><!-- 简便写法,不过类字段名和表字段名要相同 -->
<property name="job" length="20" />
<property name="salary" column="sal" />
<property name="hiredate" type="date" /><!-- 声明日期类型的生成策略,这里记录的是日期 -->
</class>
</hibernate-mapping>
3.2使用注解方式配置
/**
* 使用注解方式,用于小项目,方便快捷。
* @author Administrator
*
*/
@Entity
@Table(name="t_studs") // 指定对应数据库表名
public class Student {
@Id // 指定这个字段为主键
@GeneratedValue // 指定主键字段的生成方式
private Integer id; // OID,标识符属性,对应数据库主键
@Column(name="ename",length=30,nullable=false) // 对应字段名,字符串长度,不允许为空
private String name;
@Column // 简便写法,对应字段名必须相同
private char sex;
@Column(name="job",length=30)
private String job;
@Column(name="sal")
private double salary;
@Column(name="hiredate")
@Temporal(TemporalType.DATE) // 对于日期类型必须要声明生成方式,当前为仅记录日期
private Date hiredate;
@Transient // 代表与数据库字段无关,不交给hibernate管理,用户自定义使用字段
private String temp;
// 无参构造方法,必须有
public Student() {
super();
}
public Student(String name, char sex, String job, double salary,
Date hiredate) {
super();
this.name = name;
this.sex = sex;
this.job = job;
this.salary = salary;
this.hiredate = hiredate;
}
// get和set方法,必须有
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", sex=" + sex
+ ", job=" + job + ", salary=" + salary + ", hiredate="
+ hiredate + ", temp=" + temp + "]";
}
}
4.hibernate最重要的部分已经配置完了,接下来就使用吧
/**
* 根据主键查询
*/
public void testFindById() {
//创建SessionFactory (在应用中只需要初始化一次)
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
//创建Session
Session session = sf.openSession();
session.beginTransaction(); //开始事务
Employee emp1 = (Employee)session.get(Employee.class, 1);
System.out.println(emp1);
//提交事务
session.getTransaction().commit();
//关闭session
session.close();
}
/**
* 参数查询
*/
public void testQuery() {
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
//创建Session
Session session = sf.openSession();
//HQL查的是类与属性,而不是表与列,(关键字不区分大小写,但类名,属性名区分大小写)
String hql = "From Employee e where e.name like ? and e.sex=? ";
Query query = session.createQuery(hql);
query.setString(0, "张%");
query.setCharacter(1, '男');
List<Employee> emps = query.list();
for(Employee emp : emps) {
System.out.println(emp);
}
//关闭session
session.close();
}
/**
* 保存
*/
public void testSave() {
Student emp = new Student("王麻子",'女',"出纳",1800,new Date()); // 1.临时对象,对数据库不影响。
//emp.setId(100);不用定义主键是因为在配置中定义了主键生成策略为数据库自动生成,若没有定义则需要手动添加。
// 2.创建SessionFactory (在应用中只需要初始化一次)
Configuration cfg = new Configuration();
cfg.configure(); // 读取配置文件
SessionFactory sf = cfg.buildSessionFactory();
//3.创建Session
Session session = sf.openSession();
session.beginTransaction(); //开始事务
session.save(emp); // 保存对象,此时emp对象转化为持久对象。生成insert_SQL
emp.setSex('男'); // 例:此时若对持久对象进行任何操作,都生效。生成update_SQL
//4.提交事务
session.getTransaction().commit(); // 执行事务提交操作,此时emp对象脱离管理,从持久对象转为托管对象。
//若再对emp做任何操作,都不会保存到数据库中。除非再次开启事务,保存或修改提交。
//5.关闭session
session.close();
//Configuration不用关闭
}
/**
* 修改,先查后改。(推荐使用这种方法)
*/
public void testUpdate() {
//创建SessionFactory (在应用中只需要初始化一次)
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sf = cfg.buildSessionFactory();
//创建Session
Session session = sf.openSession();
session.beginTransaction(); //开始事务
Student emp1 = (Student)session.get(Student.class, 1); // 查询主键Integer=1的Student类数据。生成select_SQL
System.out.println(emp1);
emp1.setSalary(emp1.getSalary() + 100); // 修改工资字段。生成update_SQL
//提交事务
session.getTransaction().commit();
//关闭session
session.close();
}
/**
<span style="white-space:pre"> </span> * 删除操作
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void testDelete() {
<span style="white-space:pre"> </span>//创建SessionFactory (在应用中只需要初始化一次)
<span style="white-space:pre"> </span>Configuration cfg = new Configuration();
<span style="white-space:pre"> </span>cfg.configure();
<span style="white-space:pre"> </span>SessionFactory sf = cfg.buildSessionFactory();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//创建Session
<span style="white-space:pre"> </span>Session session = sf.openSession();
<span style="white-space:pre"> </span>session.beginTransaction(); //开始事务
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>Employee emp = (Employee)session.get(Employee.class, 4); // 查出来
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>session.delete(emp); // 删掉它
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>session.getTransaction().commit();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//关闭session
<span style="white-space:pre"> </span>session.close();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>}
如上所示,hibernate对所有的操作都是基于对象而不是数据库表,HQL里也是对象的声明名salary而不是表字段名sal
目前只是关于hibernate的基础操作,仅供小白参考。
关联关系并未涉及!还望海涵。
实例下载地址:http://download.csdn.net/detail/yingfengquan/8416091 点击打开链接