• 初学Hibernate


    Hibernate 是完全ORM的,只需要对 对象 进行操作,生成底层SQL语句

    优势:1、可以简化开发

       2、性能好(原生的Hibernate性能很差,要使用它,需要进行优化),优化方式:一级缓存、二级缓存、查询缓存、抓取策略等。

    下面先简单写一个log4j的demo

    1、新建一Java项目,导入log4j.jar包

    2、在src下新建log4j.properties文件,第一个info表示,输出信息为info级别及其以上

    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=D:mylog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ### file,表示文件输出,stdout表示控制台输出
    
    log4j.rootLogger=info, file,stdout
    log4j.properties

    3、新建一个包含main函数的类,直接运行测试,其代码如下

    import org.apache.log4j.Logger;
    
    public class LogDemo {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Logger logger = Logger.getLogger(LogDemo.class);
            logger.fatal("致命性错误");
            logger.error("普通错误");
            logger.warn("警告错误");
            logger.info("普通信息");
            logger.debug("调试信息");
            logger.trace("堆栈信息");
        }
    }
    LogDemo

    下面开始写Hibernate入门代码,操作MySQL数据库:

    1、创建数据库h1, create database h1;

    2、创建表customer

    create table customer(id int primary key auto_increment,  name varchar(20),  age int ,  city varchar(20)) ;

    3、新建Customer类

    public class Customer {
    private int id;
    private String name;
    private int age;
    private String city;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    }
    Customer类

    4、新建Customer.hbm.xml文件,配置Customer类与customer表的映射关系,一般是将映射文件放在对应类同一包内

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        <hibernate-mapping>
        <!-- 类与表关系,name类全名称,table表名 -->
        <class name="cn.hjp.domain.Customer" table="Customer">
        <!-- id为表主键,如果不配置column,默认为name值 -->
        <id name="id" column="id">
        <generator class="native"></generator>
        </id>
        <!-- property中配置表中简单字段, type可以为Java类型,Hibernate类型或者数据库类型 -->
        <!-- 省略column,默认用name -->
        <property name="name" column="name" type="java.lang.String"></property>
        <!-- int为Hibernate类型,如果用Java应该是Integer -->
        <property name="age" column="age" type="int"></property>
        <!-- 下面使用数据库类型 -->
        <property name="city">
        <column name="city" sql-type="varchar(20)"></column>
        </property>
        </class>
        </hibernate-mapping>
    类与表映射关系

    5、新建hibernate.cfg.xml文件,配置hibernate访问数据库及其自己的一些信息,配置显示SQL语句后,可以在控制台看到Hibernate构造的SQL语句

    <?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>
        <!-- 使用property来配置数据库参数以及Hibernate自己的一些信息 -->
        <!-- dialect方言,用于指定连接的是什么数据库 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///h1</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">hjp123</property>
        
        <!-- 配置显示执行的SQL语句,以及SQL语句格式化 -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <!-- 导入映射文件 -->
        <mapping resource="cn/hjp/domain/Customer.hbm.xml"/>
        </session-factory>
        </hibernate-configuration>
    hibernate与数据关联

    6、新建CustomerTest.java类,简单实现增删改查操作

    注意:在使用hql时,from后面跟的是类名,而不是表名

    session.get方法,第二个参数是数据表ID;session.load方法使用一样。

    session.get和session.load方法区别:1、如果使用get方法,查询结果返回null;如果使用load方法,查询不到数据会抛异常,因为load方法返回的不是PO对象而是其代理

                       2、load方法默认延迟加载,是一种优化策略;而get不会延迟加载,而是立即查询

    package cn.hjp.test;
    
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.classic.Session;
    import org.junit.Test;
    
    import cn.hjp.domain.Customer;
    
    public class CustomerTest {
        @Test
        // 添加操作
        public void addTest() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            Customer customer = new Customer();
            customer.setAge(23);
            customer.setName("Tom");
            customer.setCity("北京");
            session.save(customer);
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
    
        @Test
        // 修改操作
        public void updateTest() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            Customer customer = new Customer();
            customer.setId(1);
            customer.setAge(23);
            customer.setName("Jerry");
            customer.setCity("上海");
            session.update(customer);
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
    
        @Test
        // 删除操作
        public void deleteTest() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            Customer customer = new Customer();
            customer.setId(1);
            session.delete(customer);
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
    
        @Test
        // 查询操作
        public void findCustomerById() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            Customer customer = (Customer) session.get(Customer.class, 2);
            System.out.println("姓名:" + customer.getName() + ";年龄:" + customer.getAge());
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
    
        @Test
        // 使用hql查询所有到List集合
        public void findAllCustomerByHql() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            String hql = "from Customer";//注意,from后面跟的是类名不是表名
            Query query = session.createQuery(hql);
            List<Customer> cusList = query.list();
            System.out.println(cusList.size());
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
    }
    Hibernate数据库操作
    @Test
        // 使用SQL语句查询数据
        public void findAllCustomerBySql() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            String sql = "select * from customer";
            SQLQuery sqlQuery = session.createSQLQuery(sql);
            
            // List<Object[]> cusList=sqlQuery.list();//注意:返回的是Object数组集合
            //数组结合,可以简单理解为,数据库表中的每一行记录为一个数组,然后构成数组集合
            // for(Object[] obj:cusList){
            // System.out.println(Arrays.toString(obj));
            // }
            
            sqlQuery.addEntity(Customer.class);//将数组中的每一条记录封装到Customer对象中
            List<Customer> cusList=sqlQuery.list();
            System.out.println(cusList.get(0).getName());
            
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
        
        @Test
        //用qbc查询所有数据,完全面向对象的查询
        public void findAllCustomerByQBC() {
            // 1.加载hibernate.cfg.xml文件
            Configuration configuration = new Configuration().configure();// 注意:必须调用configure方法
            // 2.得到一个SessionFactory
            SessionFactory sessionFactory = configuration.buildSessionFactory();
            // 3.得到session
            Session session = sessionFactory.openSession();
            // 4.开启事务
            // session.beginTransaction();
            Transaction transaction = session.beginTransaction();
            // 5.操作
            Criteria criteria=session.createCriteria(Customer.class);
            List<Customer> cusList=criteria.list();
            System.out.println(cusList.get(0).getName());
            // 6.提交事物,如果上面开启事务时没有创建事务对象,则可用下面方式提交事务,获得当前回话里的session进行提交
            // session.getTransaction().commit();
            transaction.commit();
            // 7.关闭资源
            session.close();
            sessionFactory.close();
        }
    纯SQL和纯面向对象的查询
  • 相关阅读:
    Leetcode-113 Path Sum II(路径总和 II)
    Leetcode-946 验证栈序列(Validate Stack Sequences)
    Leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量)
    UVa-10129 Play on Words
    UVa-10305 Ordering Tasks
    UVa-816 Abbott's Revenge
    UVa-1103 Ancient Messages
    种子填充(flood fill)
    内存池
    Leetcode-942 DI String Match(增减字符串匹配)
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/4711577.html
Copyright © 2020-2023  润新知