Hibernate配置详解
package cn.hd.bean;
public class Student {
private Integer sid;
private String name;
private String age;
public Integer getSid() {
return sid; }
public void setSid(Integer sid) {
this.sid = sid; }
public String getName() {
return name; }
public void setName(String name) {
this.name = name; }
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age; }
@Override public String toString() {
return "Student{" +
"sid=" + sid +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}'; }}
<!--导入文件约束--> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!--文件声明--> <hibernate-mapping> <!--class中的name代表实体类名 table代表数据库的表名--> <class name="cn.hd.bean.User" table="user"> <!--数据库的主键 对应的实体类中的id(主键)和数据表中的主键 name代表实体类中的名字 column是字段名(可以省略不写)--> <id name="uid" column="uid"> <!--主键生成策略--> <!--代理主键和自然主键 主键生成策略: identity:是由于数据库自己维护先查id 自动加一 increment:自动加1 hilo:(了解) native:(我们用的) uuid:(java API的生成策略) 自然主键: assigned:自己输入主键 --> <generator class="native"></generator> </id> <!--其他的属性 这里也可以设置数据库中的字段属性 type 生成表中的类型 length not-null--> <property name="name" column="name"></property> <property name="psd" column="psd"></property> </class> <class name="cn.hd.bean.Student" table="student"> <id name="sid" column="sid"> <generator class="native"></generator> </id> <property name="name" column="name"></property> <property name="age"></property> </class> </hibernate-mapping>
<!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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <!--方言 sql语句的方言 我们在上面设置了数据库的信息是mysql mysql中的sql limit 在oracle 中没有 所以要设置方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!--设置hibernate执行sql语句的时,自动实现在控制台上 --> <property name="hibernate.show_sql">true</property> <!--设置显示的格式--> <property name="hibernate.format_sql">true</property> <!--设置数据库表的生成策略 create 每次执行hibernate 就会创建新的表 原来的数据丢失 create-drop 每次执行hibernate 就会删除所有的表 原来的数据丢失 update 检查数据表有没有更新,如果有则自动更新,如果没有则不变 validate 只做校验 对数据表不进行任何错误 只会提示错误 --> <property name="hibernate.hbm2ddl.auto">update</property> <!--加载映射文件--> <mapping resource="cn/hd/bean/User.hbm.xml" ></mapping> </session-factory> </hibernate-configuration>
public static void main(String[] args) { /*读取配置信息*/ Configuration cfg=new Configuration(); /*调用他的方法 名字保持一致*/ cfg.configure(); /*获得sessFactory对象 这个对象我们只用它获取session 实际上这行代码他检查了数据库和实体类的关系 如果有变化他会更新 非常耗费资源 封装工具类 */ SessionFactory sf = cfg.buildSessionFactory(); /*获得session对象*/ Session session=sf.openSession(); /*开启事务 不开启事务不会保存你的数据 * 不开启不会保存数据到数据库 * */ Transaction ts = session.beginTransaction(); /**/ User user =new User(); user.setName("李菲菲"); user.setPsd("38383"); session.save(user); /* Student student=new Student(); student.setName("张帅杰"); student.setAge("18"); session.save(student);*/ /*提交事务*/ ts.commit(); /*关闭资源*/ session.close(); sf.close();
}
Hibernate crud
Save update get delete
这四个方法不能单纯理解为添加、修改、查找、删除
实际是修改hibernate中的对象状态
在hibernate中对象有三种状态
1. 瞬时状态
一个实体对象 没有id 也没有和session绑定
2. 游离状态
有id没有和session绑定
3. 持久状态
有id 也有和session绑定
实际上session的四个方法 就是在改变实体对象在hibernate中的对象状态
持久化状态的特点: 任何对象的变化都会自动同步到数据库中
Hibernate提供了一个saveOrUpdate的方法,这个方法自动识别对象的状态。实体开发中不去思考对象的实际状态,直接调用该方法。