hibernate入门

来源:互联网 发布:淘宝在哪里评价 编辑:程序博客网 时间:2024/06/08 05:37

坚持每天写博文,积累下开发中的点点滴滴
使用hibernate的前提:
1. 导包
2. 配置文件
hibernate有一个默认的配置文件:hibernate-cfg.xml,它表示是一个hibernate的配置文件 name不可以乱写 key可以从hibernate.properties中查询
在hibernate.cfg.xml中可以省略hibernate.这个前缀
hibernate.properties内容
hibernate-cfg.xml(测试)

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC  "-//Hibernate/Hibernate Configuration DTD//EN"  "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><!--  表示是一个hibernate的配置文件    name不可以乱写 key可以从hibernate.properties中查询在hibernate.cfg.xml中可以省略hibernate.这个前缀--><hibernate-configuration><!-- 会话工厂org.hibernate.SessionFactory,用来创建会话:org.hibernate.Session    把SessionFactory理解为数据源(DataSource)    Session理解成:java.sql.Connection     -->    <session-factory name="hibernateLearn">    <!--配置若干配置信息     配置顺序:property*, mapping*, (class-cache | collection-cache)*, event*, listener*     -->     <!-- 是否显示sql语句  name值中间注意不能有空格-->        <property name="show_sql">true</property>        <!-- 驱动 -->        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <!-- url -->        <property name="connection.url">jdbc:mysql://localhost:3306/shtext</property>        <!-- 账号 -->        <property name="connection.username">root</property>        <!-- 密码 -->        <property name="connection.password">314159</property>        <!-- 方言 (必须配) -->        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <!-- 加载映射文件 映射文件是java对象和关系模型的转换规则        1.路径前不要/;2.这里加载的路径是文件路径而不是类的路径             -->        <mapping resource="text/User.hbm.xml"/>    </session-factory></hibernate-configuration>

3 . 映射文件
比如我有一个User对象,需要存到数据库的User表中,那么先创建一个xml文件:我这里以User.hbm.xml为例子,然后要在hibernate-cfg.xml中配置<mapping resource="text/User.hbm.xml"/>
注意:区分大小写
紧接着创建User.hbm.xml文件:

<!--User映射文件 --> <hibernate-mapping> <!-- class 表示由hibernate管理的domain类     name全类名  table表示对应数据库的表名    id表示对应数据库的主键    除了class标签的name属性表示全类名,其他标签的name属性全是表示java的属性    column表示数据库里面的字段名    type表示数据库表里字段类型  type中的long表示hibernate的类型,还有一种写法    java.lang.Long 表示java类型 两种写法结果一样,其实hibernate可以通过反射获取类型,可以不写 -->    <class name="text.User" table="user">        <id name="user_id" type="long" column="user_id">        <!-- id生成方式   native表示使用数据库本地方式-->            <generator class="native"></generator>        </id>        <!-- property 配置非主键的简单属性 并非domain对象属性        column属性不配的时候默认使用java中的属性名         -->        <property name="user_name" column="user_name"></property>        <property name="user_passWord" column="user_passWord"></property>    </class> </hibernate-mapping>

现在已经将domain对象和数据库表一一对应了起来,现在进行操作。我写了一个测试类CRUDText.java:

package text;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;/** * * @ClassName: CRUDText * @Description: TODO(    hibernate增删改查的测试) * @author Ash * @date 2017年11月17日 下午7:51:33 * */public class CRUDText {    public static void main(String[] args) {        CRUDText text = new CRUDText();        text.doSave();    }    private void doSave(){        //实例化对象        User user = new User();        user.setUser_name("user_name");        user.setUser_passWord("user_passWord");        //实例化配置对象        Configuration concfg = new Configuration();        //解析配置文件         concfg.configure();//加载默认的hibernate-cfg.xml        /**         * 此方法用于改变默认配置文件         *//*        concfg.configure("改变配置文件名称");*/        //获取sessionFactory对象    过时的方法buildSessionFactory()也可以用        //新的方法从bibernate4.1开始需要传进去一个参数        SessionFactory sessionFactory = concfg.buildSessionFactory();        //获取session对象 两个方法:getCurrentSession()和openSession() 测试都有open        Session session = sessionFactory.openSession();        //保存        session.save(user);        //关闭资源        session.close();        sessionFactory.close();    }}

此时运行以后不报错,打印出来sql语句了但是数据库并没有新增数据
原因是JDBC中事务默认是提交的,hibernate中事务默认不提交,所以我们必须在save()方法之前开启事务,在之后提交事务

//开启事务        Transaction transaction = session.beginTransaction();        //保存        session.save(user);        //提交事务        transaction.commit();

此过程中可能出现的异常:

  1. 当我使用save()方法时,参数可以放入任何对象且编译没问题但会报错

这里写图片描述
2. 当我没有在配置文件中加载映射文件也会出现同样的问题
这里写图片描述
3.当我在配置文件中<property name="connection.url">多一个空格
这里写图片描述
4.当我驱动写错时这里写图片描述

原创粉丝点击