ORM:Object Relational Mapping 实体关系映射,Hibernate将关系型数据库转换为对象操作
利用Java Project项目演示试用Hibernate技术添加数据到数据库
1、引用相关jar包
在项目下新建Mylib文件夹,加jar包粘贴就去,试用Build Path添加在项目中(若是Jave Web项目则放在WebRoot-->WEB-INF-->lib中直接使用)
2、创建Hibernate配置文件, hibernate.cfg.xml或是hibernate.properties 。添加在src下
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- thread:一个线程中使用一个,获取session会话时使用 --> <property name="current_session_content_class">thread</property> <!-- 是否显示SQL语句,值为布尔型,默认false --> <property name="hibernate.show_sql">true</property> <!-- 是否格式化显示sql语句,让显示更美观,值为布尔型,默认false --> <property name="hibernate.format_sql">false </property> <!-- 自动建表 update:每次执行时,无表则建表,无列则建列,只增不减 create:每次启动的时候,删除原表,再次创建 create-drop:每次启动时创建新表,当显式关闭sessionFactory时,删除表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 连接数据库 --> <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/zxd_db</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">zxd</property> <property name="hibernate.connection.password">123456</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 读取映射文件 --> <mapping resource="demo/orm/entity/Hero.hbm.xml" /> </session-factory> </hibernate-configuration>
hibernate.properties配置文件只能配置属性信息,不能配置映射等
hibernate.connection.username=zxd
hibernate.connection.password=123456
3、创建实体
package demo.orm.entity; import java.util.Date; public class Hero { private int heroId; private String heroName; private int heroAge; private Date birthday; public int getHeroId() { return heroId; } public void setHeroId(int heroId) { this.heroId = heroId; } public String getHeroName() { return heroName; } public void setHeroName(String heroName) { this.heroName = heroName; } public int getHeroAge() { return heroAge; } public void setHeroAge(int heroAge) { this.heroAge = heroAge; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
4、创建实体映射关系
<?xml version="1.0"?> <!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="demo.orm.entity.Hero" table="yingxiong"> <!-- name:主键的名字,column:主键数据库表列,identity自增 --> <id name="heroId" column="ID"> <!-- Hibernate使用generator类来生成主键 --> <generator class="identity" /> </id> <!-- name:实体中的属性名,length:长度 ,column:表中的字段(实体属性和字段一致可省略),type:类型(可不写由hiberbate自动匹配) --> <property name="heroName" length="100" column="NAME" type="string" /> <property name="heroAge" column="AGE" type="int" /> <property name="birthday" column="BIR" type="timestamp" /> </class> </hibernate-mapping>
5、保存数据
package demo.orm.test; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; import demo.orm.entity.Hero; public class SaveTest { public static void main(String[] args) { /* * 两种配置文件的加载方式,hibernate.properties只配置数据库的连接方式 * 属性文件(hibernate.properties)调用代码:Configuration cfg = new Configuration(); * Xml文件(hibernate.cfg.xml) 调用代码:Configuration cfg = new Configuration().configure(); * */ //加载Hibernate配置信息,默认读取src下的hibernate.cfg.xml Configuration cfg = new Configuration().configure(); //也可以指定hibernate.cfg.xml 的路径加载 //Configuration cfg1 = new Configuration().configure(Path); /* * 应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。 * 通常情况下,整个应用只有唯一的一个会话工厂,SessionFactory由Configuration对象创建, * 每个Hibernate配置文件,实际上是对SessionFactory的配置 * */ //试用配置信息构建sessionFactory SessionFactory factory = cfg.buildSessionFactory(); /* * Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。 * Session也称为持久化管理器,因为它是与持久化有关的操作接口。 * 持久化对象的状态:瞬时对象(Transient Objects)、持久化对象(Persist Objects)、离线对象(Detached Objects) * Session通过SessionFactory打开,在所有的工作完成后,需要关闭。 * 它与Web层的HttpSession没有任何关系。 * */ //方式一:通过会话工厂构建session会话,进行增删改查,是Hibernate与数据库的会话(需要关闭) Session session = factory.openSession(); //通过Id值查询(查询的时候不需要使用事物) session.get(Hero.class, 1); //通过hql查询 Query query =session.createQuery("from Hero where hreoAge=30"); List<Hero> list = query.list(); for(Hero model:list){ System.out.println(model.getHeroName()); } //方式二:获取当前线程中最近试用的session,没有再open。节省资源 Session session1 =factory.getCurrentSession(); //CurrentSession必须使用事物(增删改查) session1.beginTransaction(); session1.get(Hero.class, 1); session1.getTransaction().commit(); //启动会话事物 session.beginTransaction(); /*******执行增删改查会话操作********/ Hero model= new Hero(); model.setHeroName("Don"); model.setHeroAge(28); model.setBirthday(new Date()); session.save(model); //提交事物 session.getTransaction().commit(); //判断会话是否开启 if(session.isOpen()){ session.close(); } } }
注意:数据库使用MySql,连接工具使用navicat连接,需要在数据库中建立相关表,并查看相关数据信息