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
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("堆栈信息"); } }
下面开始写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; } }
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>
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(); } }
@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(); }