01 Hibernate基础

jdbc和hibernate优缺点

JDBC
优点

效率比较高

缺点
  1. 编程的时候很繁琐,用的try和catch比较多
  2. jdbc没有做数据的缓存
  3. 没有做到面向对象编程
  4. sql语句的跨平台性很差
Hibernate
优点
  1. 完全的面向对象编程
  2. hibernate的缓存很牛的,一级缓存,二级缓存,查询缓存
  3. 编程的时候就比较简单了
  4. 跨平台性很强
  5. 使用场合就是企业内部的系统
缺点
  1. 效率比较低
  2. 表中的数据如果在千万级别,则hibernate不适合
  3. 如果表与表之间的关系特别复杂,则hibernate也不适合

创建Hibernate工程

所需jar包
  1. antlr.jar:语言转换工具,实现HQL到SQL的转换
  2. commons-collections.jar:增强Java对集合的处理能力
  3. dom4j:XML解析器
  4. javassist:用于创建代理对象。类似的创建方式还有jdkproxy、cglib
  5. jta:Java Transaction API,JAVA事务处理接口
  6. slf4j-api和slf4j-log4jf2:hibernate使用的日志系统
添加hiberbate.cfg.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/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/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">adfds</property>
        <!-- 设置事务自动提交 
        <property name="hibernate.connection.autocommit">true</property>-->
        <!-- 其他配置 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 
            根据持久化类生成表的策略
            validate   通过映射文件检查持久化类与表的匹配
            update   每次hibernate启动的时候,检查表是否存在,如果不存在,则创建,如果存在,则什么都不做了
            create   每一次hibernate启动的时候,根据持久化类和映射文件生成表
            create-drop
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.show_sql">true</property>
        <!-- 添加映射 -->
        <mapping resource="com/test/hibernate/domain/hibernate.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
持久化类和映射文件
//com.test.hibernate.domain
public class Person implements Serializable{
    private Long pid;
    private String name;
    private String description;

    public Person(String name){
        this.name = name;
    }

    public Person(){}

    public Long getPid() {
        return pid;
    }
    public void setPid(Long pid) {
        this.pid = pid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}
<!--com.test.hibernate.domain-->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- 
        class用来描述一个类
           name 类的全名
           table 该持久化类对应的表名   可以不写,默认值为类名
           catalog  数据库的名称
     -->
    <class name="com.test.hibernate.domain.Person" table="person">
        <!-- 
            用来描述主键
              name 属性的名称
              column 属性的名称对应的表的字段   可以不写  默认值就是属性的名称
              length  属性的名称对应的表的字段的长度  如果不写,默认是最大的长度
         -->
        <id name="pid" column="pid" length="5">
            <!-- 
                主键的产生器
             -->
            <generator class="increment"></generator>
        </id>

        <property name="name" length="20" type="java.lang.string"></property>

        <property name="description" length="50" type="java.lang.String"></property>
    </class>
</hibernate-mapping>
测试
//com.test.hibernate.db
public class CreateTable {
    //如果没有该表,则会在数据库中生成该表
    @Test
    public void testCreateTable(){
        Configuration configuration = new Configuration();
        configuration.configure();
        configuration.buildSessionFactory();
    }
    //保存seeeion
    @Test
    public void testSavePerson(){
        //加载了hibernate的配置文件
        Configuration configuration = new Configuration();
        configuration.configure();
        //configuration.configure("");//按照指定的路径加载指定的配置文件
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        //产生session
        Session session = sessionFactory.openSession();
        //产生事务
        Transaction transaction = session.beginTransaction();

        //创建一个对象
        Person person = new Person("aa");
        person.setName("王二麻子");
        person.setDescription("很爷们");

        //保存该对象
        session.save(person);

        //事务提交,session关闭
        transaction.commit();
        session.close();
    }

    @Test
    public void testGetPersonById(){
        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        /**
         * 第一个参数为持久化类的class形式
         * 第二个参数为主键的值
         */
        Person person = (Person)session.get(Person.class, 1L);
        System.out.println(person.getName());
        session.close();
    }
    @Test
    public void testUpdate(){
        /**
         * 1、先根据ID把要修改的对象查询出来
         * 2、对对象进行修改
         */
        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        /**
         * 先根据主键把其中的一行数据查询出来,查询出来的就是一个对象
         */
        Person person = (Person)session.get(Person.class, 1L);
        /**
         * 修改person对象
         */
        person.setDescription("就是爷们");
        //执行修改操作
        session.update(person);
        transaction.commit();
        session.close();
    }
    @Test
    public void testDelete(){
        /**
         * 1、根据id把对象查询出来
         * 2、删除该对象
         */
        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        /**
         * 把pid为1的对象提取出来
         */
        Person person = (Person)session.get(Person.class, 1L);

        //删除一个对象
        session.delete(person);

        transaction.commit();
        session.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值