关于Hibernate,你了解多少?搜索了hibernate常见的面试题,总结如下:
hibernate和mybatis的区别:
答:1.hibernate是全自动,mybatis是半自动(hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理)。
2.hibernate数据库的移植性远大于mybatis(hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高)
3.hibernate拥有完整的日志系统
4.SQL优化,mybatis比hibernate方便
hibernate是ORM框架,ORM是什么?
答:ORM(Object Relational Mapping)对象关系映射,实现面向对象编程语言里不同类型系统的数据之间的转换,用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。
新建一个maven项目
配置pom.xml
<!-- hibernate核心 -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.0.Final</version>
</dependency>
<!-- mysql -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- log4j -->
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
pojo包的Student.java
package com.pojo;
public class Student {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.xh = 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;
}
private String name;
private int age;
}
映射文件student.hbm.xml
<?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="com.pojo.Student" table="student">
<!-- 主键 -->
<id name="id" column="id">
<!-- 主键自增 -->
<generator class="native"></generator>
</id>
<!-- 表名字段名不规范命名加 ` -->
<!-- 其他字段 -->
<property name="name" column="name" length="10" ></property>
<!-- name是属性 column是字段名 -->
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
总的hibernate配置文件hibernate.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="connection.url">jdbc:mysql://127.0.0.1:3306/simi</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 自动根据配置生成表 MySQLInnoDBDialect 加5有关MySQL的版本 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- show_sql显示SQL语句 format_sql格式化SQL语句 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="com/pojo/student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
现在测试自动生成表TestCreateStudent.java
public class TestCreateStudent {
public static void main(String[] args) {
ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
Metadata metadata = new MetadataSources(registry).buildMetadata();
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE), metadata);
}
}