通过maven我们无需手动下载一些Hibernate相关的包,直接在pom.xml中添加相应的依赖就行。
添加Hibernate依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.4.Final</version>
</dependency>
可以设置不同的hibernate的版本号,不同的版本号在session对象的创建上可能会有不同,请谨慎考虑。
添加数据库依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
在这里我使用的是mysql数据库。
到此hibernate的依赖就可以了,相比手动添加十几个jar包还是方便点的。在添加依赖后,系统可能会加载一段时间来进行文件的下载。
创建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.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/bookstore?serverTimezone=UTC</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>
</session-factory>
</hibernate-configuration>
这是对数据库连接和操作的一些基本配置。
参数说明:
- dialect:发言,是告诉系统需要转换为哪种类型的sql语句。
- show_sql:表示在控制台中是否会显示使用的sql语句。
- format_sql:表示是否对生成的sql语句就行格式化。
hbm2ddl.auto:有四个可选择的值:
1.create:表示如果在数据库中已经存在相应的表会先删除原表,再创建一个新表,若不存在,则直接创建一个新表。
2.update:会对数据库中的表进行更新操作。
3.create-drop:该值也会创建一个表,不过在结束的时候会把创建的表给删除。
4.validate:会通过shema与hibernate的配置进行比较,如果不一致会抛出异常,可以用来插入数据,不能创建表。
- hibernate.default_schema:设置表的默认前缀。
在写hibernate参数的属性名是可以省略前面的hibernate,直接写“.”后面的名称即可。
下面通过Book类例子来讲述单表操纵。。
创建Book类:
public class Book {
private int bid;
private String bname;
private float price;
private String author;
private int bnum;
public Book() {
}
public Book(int bid, String bname, float price, String author, int bnum) {
super();
this.bid = bid;
this.bname = bname;
this.price = price;
this.author = author;
this.bnum = bnum;
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getBnum() {
return bnum;
}
public void setBnum(int bnum) {
this.bnum = bnum;
}
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + ", author=" + author + ", bnum=" + bnum
+ "]";
}
}
创建类需要满足要有一个无参的构造函数和变量对应的get,set方法。
创建Book.hbm.xml:
我们可以直接新建一个Hibernate XML Mapping file,系统会自动为我们配置好一些相应的设置。
<?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 2018-11-4 17:12:42 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.testHibernate.hibernateTest.Book" table="BOOK">
<id name="bid" type="int">
<column name="BID" />
<generator class="assigned" />
</id>
<property name="bname" type="java.lang.String">
<column name="BNAME" />
</property>
<property name="price" type="float">
<column name="PRICE" />
</property>
<property name="author" type="java.lang.String">
<column name="AUTHOR" />
</property>
<property name="bnum" type="int">
<column name="BNUM" />
</property>
</class>
</hibernate-mapping>
然后,我们要把配置好的Book.hbm.xml文件映射到hibernate.cfg.xml文件中。
<mapping resource="Book.hbm.xml"/>
在基本配置都完成后,我们就可以对数据库进行测试操作了。
这里,我使用的是Junit的环境。
需要在测试类中首先添加三个变量:
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象
session=sessionFactory.openSession();
//开启事务(不然无法将数据保存到数据库中)
transaction=session.beginTransaction();
}
该方法是对变量的初始化操作,包括创建Session对象和打开事务。
Session简介
session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
获得Session的方法有两个:1)openSession() 2)getCurrentSession()
openSession与getCurrentSession的区别
1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要你手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。
2.openSession每次创建新的session对象,getCurrentSession使用现有的session对象。
@After
public void destory() throws SecurityException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException {
transaction.commit(); //提交事务
session.clear();//关闭会话
sessionFactory.close(); //关闭会话工厂
}
在操作完事务后,要及时关闭资源。
@Test
public void testSaveBooks() {
//生成学生对象
Book b=new Book(100,"sd",100,"d",100);
session.save(b); //保存对象进入数据库
}
在测试方法中,直接声明一个Book对象,然后调用session的save方法就可以把数据保存到数据库中。
拓展:
我们也可以通过session对象来设置成和jdbc一样来进行操作。
// 设置session和jdbc一样自动连接
session.doWork(new Work() {@Override
public void execute(Connection arg0) throws SQLException {
arg0.setAutoCommit(true);
}
});
最后一定要进行flush()操作。
session.flush();
一般并不推荐修改成jdbc的使用。