努力是最不值得炫耀的,只要有了渴望和意愿,人人都会。
安装好hibernate tools之后,写个使用hibernate对数据库表实现增删改查的demo(新建项目并导入hibernate、mysql、junit的jar包就不用说了吧)
1. 创建hibernate配置文件(怎么创建就不用说了吧,用hibernate tools自动生成或者在别的地方复制一份过来),即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>
<!-- 数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 打印SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="format_sql">true</property>
<!--ddl语句生成策略 save自动创建数据库并覆盖以前的 update更新不会覆盖以前的-->
<property name="hbm2ddl.auto">update</property>
<!-- 创建数据库时 给表加上前缀 -->
<!-- <property name="default_schema">hibernate</property> -->
<!-- 使用getCurrentSession时的事物配置 thread本地事务(jdbc事务) 全局事务(jta事务)-->
<!-- <property name="current_session_context_class">thread</property> -->
<mapping resource="com/hibernate/bean/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
注意:配置文件中的mapping是在步骤二完成后才写入的
2. 创建数据库表的实体类和对应的hibernate mapping文件
学生类实体:
public class Student {
private int sid;//ID
private String sname;//姓名
private String gender;//性别
private Date birthday;//出生日期
private String address;//地址
private Blob picture;//照片
public Student() {
}
public Student(int sid, String sname, String gender, Date birthday, String address) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Blob getPicture() {
return picture;
}
public void setPicture(Blob picture) {
this.picture = picture;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
+ ", address=" + address + "]";
}
}
学生类的hibernate映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-6-23 16:17:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.hibernate.bean.Student" table="STUDENT">
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
<property name="picture" type="java.sql.Blob">
<column name="PICTURE" />
</property>
</class>
</hibernate-mapping>
3. 写测试类
新建一个StudentTest类,使用junit的三个方法注解@Before、@Test、@After。新建初始化、运行、销毁三个方法(使用hibernate的代码可能根据使用的hibernate版本有些细微差别,这里使用的是hibernate4.2.4的版本,如果你使用最新的hibernate版本创建服务注册对象的代码就会报错,可以根据代码提示进行修改)
public class StudentTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
//创建配置对象 读取配置文档Hibernate.cfg.xml
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建回话工厂对象 创建和注销都比较耗费资源
sessionFactory = config.buildSessionFactory(serviceRegistry);
//打开会话 操作数据库的对象
session = sessionFactory.openSession();
//开启事务
transaction = session.beginTransaction();
}
@Test
public void saveStudentTest(){
}
@After
public void destory(){
transaction.commit();//提交事物
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
}
}
4. 保存对象
编辑一下saveStudentTest()方法的内容
/**
* 保存学生对象
*/
@Test
public void saveStudentTest(){
Student stu = new Student(1,"张三","男",new Date(),"武汉");
session.save(stu);
}
执行一下这个方法,可以看到控制台打印了执行的sql语句
再看数据库,数据已经成功插入学生表
5. 依次加上查询、修改、删除的方法
/**
* 查询
* get在调用之后立即向数据库发出sql语句,返回持久化对象
* 查询数据不存在 返回null
*/
@Test
public void testGetStudents(){
Student s= (Student) session.get(Student.class, 1);
System.out.println(s);
}
/**
* 查询
* load方法会在调用后返回一个代理对象
* 该代理对象之保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句
* 查询数据不存在 抛出异常
*/
@Test
public void testLoadStudent(){
Student s = (Student) session.load(Student.class, 1);
System.out.println(s);
}
/**
* 修改
*/
@Test
public void testUpdateStudent(){
Student s= (Student) session.get(Student.class, 1);
s.setGender("女");
session.update(s);
System.out.println(s.toString());
}
/**
* 删除
*/
@Test
public void testDeleteStudent(){
Student s= (Student) session.get(Student.class, 1);
session.delete(s);
}
查询要注意get和load的区别,另外执行下面方法可能会报错,因为配置文件里面的ddl语句生成策略配置的create,每次都会覆盖原来的表导致表数据总是空的,我们把create换成update就可以了。