Hibernate搭建框架(一)

什么是hibernate?

  hibernate是一个orm框架,实现了对JDBC的封装。通过xml文件来实现类和表之间的映射,这样就可以使用操作对象的方式来操作数据库。

官网:http://hibernate.org/

这里使用最新的5.3版本,下载到本地。

hibernate框架搭建:

1.导入包 下载后将lib/required文件夹中的jar包以及mysql数据库的驱动jar包(mysql-connector-java-5.1.46.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>
        <!--必选5个-->
        <!--数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--数据库url -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/david2018_db?characterEncoding=UTF-8</property>
        <!--数据库连接用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!--数据库连接密码 -->
        <property name="hibernate.connection.password">1234</property>
        <!--数据库方言 mysql(limt) sqlserver(top)-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>


        <!--可选3个 -->
        <!--自动建表:
        create:每次都删除新建(数据会丢失)
        create-drop:每次运行结束会将表删除
        update:如果存在不会生成,不存在新建,如果表修改也会新增列到表中(不会删数据)
        validate:校验不自动生成表,每次启动会检查表是否正确 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!--输出生成的SQL语句  -->
        <property name="hibernate.show_sql">true</property>
        <!--对SQL语句进行格式化  -->
        <property name="hibernate.format_sql">true</property>

        <!--映射文件的路径 -->
        <mapping resource="com/hibernate/domain/User.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

3.实体类

package com.hibernate.domain;

public class User {
    private int UserId;
    private String UserName;
    private String PassWord;
    private int Age;
    private String Sex;

    public User(){

    }
    public User(String userName,String password,int age,String sex){
        this.UserName = userName;
        this.PassWord = password;
        this.Age = age;
        this.Sex = sex;
    }

    public int getUserId() {
        return UserId;
    }
    public void setUserId(int UserId) {
        this.UserId = UserId;
    }

    public String getUserName() {
        return UserName;
    }
    public void setUserName(String UserName) {
        this.UserName = UserName;
    }

    public String getPassWord() {
        return PassWord;
    }
    public void setPassWord(String PassWord) {
        this.PassWord = PassWord;
    }
    public int getAge() {
        return Age;
    }
    public void setAge(int Age) {
        this.Age = Age;
    }
    public String getSex() {
        return Sex;
    }
    public void setSex(String Sex) {
        this.Sex = Sex;
    }
}

4.编写orm元数据 User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<!--映射标签 package:内部类的所在的包名,内部不用写完整类名 -->
<hibernate-mapping package="com.hibernate.domain">
    <!--需要设置的映射类:设置该类对应的表  -->
    <!--属性:name:类名 table:表名  -->
    <!-- name="com.hibernate.domain.User" 因为用了package就不用写完整包名了-->
    <class name="User" table="User">
        <!--id:主键,name:属性名称,column:字段名称  -->
        <id name="UserId" column="UserId">
            <!--generator:主键生成策略 class:标记主键如何生成 取值:
            1、native:自动增长,会根据当前的数据库自动切换
            2、identity:mySQL的自增策略
            3、sequence:Oracle的自增标记
            4、uuid:32位字符串
            5、assigned:自定义字符串
            6、foreign:外键
            7、increment:自己维护自增关系-->
            <generator class="native"/>
        </id>
        <!--配置属性对应的字段
        column(可选):不填就自动走属性名
        type(可选)填写该列的类型 不填会自动识别
        not-null(可选):默认false可为空
        length(可选):长度,默认值数据库类型最大长度-->
        <property name="UserName" column="UserName" type="java.lang.String"/>
        <property name="PassWord" column="PassWord" type="string"/>
        <property name="Age" column="Age"/>
        <property name="Sex" column="Sex">
            <!--<column name="Sex" sql-type="varchar"></column> string还可以这样定义-->
        </property>
    </class>
</hibernate-mapping>

5.增删改查

import com.hibernate.domain.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Main {
    public static void main(String[] args) {
        //加载配置文件 空参默认加载src下的hibernate.cfg.xml
        Configuration conf = new Configuration().configure();
        // 创建SessionFactory (保存和使用所有配置信息,消耗内存资源非常大,保证在web项目中只创建一个)
        SessionFactory sf = conf.buildSessionFactory();
        // 创建Session对象 打开一个新的session对象
        Session session = sf.openSession(); //sf.getCurrentSession();获得一个现有的session对象 没有就创建 需要在配置文件中进行配置
        // 开启事务
        Transaction trans = session.beginTransaction();

        //新增
        session.save(new User("测试", "666666",18,"男"));

        //查询
        User user = session.get(User.class,1);
        System.out.println(user.getUserName());

        //修改
        user.setUserName("武大郎");
        session.update(user);

        //删除
        User u = session.get(User.class,2);
        session.remove(u);

        trans.commit();
        //trans.rollback();

        session.close();
        sf.close();
    }
}

不用去数据库建表,hibernate会自动根据实体反向生成。

编写工具类

package com.hibernate.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


public class HibernateUtils {
    public static final SessionFactory sessionFactory;

    static {
        Configuration conf = new Configuration().configure();
        sessionFactory = conf.buildSessionFactory();
    }
    public static Session openSession(){
        Session session = sessionFactory.openSession();
        return session;
    }

    public static Session getCurrentSession(){
        Session session = sessionFactory.getCurrentSession();
        return session;
    }
}

测试

    Session session = HibernateUtils.openSession();
    session.save(new User("测试", "666666",18,"男"));
    session.close();

 

posted @ 2018-05-18 21:00  海盗船长  阅读(268)  评论(0编辑  收藏  举报