Hibernate搭建框架(一)
什么是hibernate?
hibernate是一个orm框架,实现了对JDBC的封装。通过xml文件来实现类和表之间的映射,这样就可以使用操作对象的方式来操作数据库。
官网:http://hibernate.org/
这里使用最新的5.3版本,下载到本地。
hibernate框架搭建:
1.导入包 下载后将lib/required文件夹中的jar包以及mysql数据库的驱动jar包(mysql-connector-java-5.1.46.jar)导入到项目中
2.编写主配置文件 创建hibernate.cfg.xml
<?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> <!--必选5个--> <!--数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--数据库url --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/david2018_db?characterEncoding=UTF-8</property> <!--数据库连接用户名 --> <property name="hibernate.connection.username">root</property> <!--数据库连接密码 --> <property name="hibernate.connection.password">1234</property> <!--数据库方言 mysql(limt) sqlserver(top)--> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!--可选3个 --> <!--自动建表: create:每次都删除新建(数据会丢失) create-drop:每次运行结束会将表删除 update:如果存在不会生成,不存在新建,如果表修改也会新增列到表中(不会删数据) validate:校验不自动生成表,每次启动会检查表是否正确 --> <property name="hibernate.hbm2ddl.auto">update</property> <!--输出生成的SQL语句 --> <property name="hibernate.show_sql">true</property> <!--对SQL语句进行格式化 --> <property name="hibernate.format_sql">true</property> <!--映射文件的路径 --> <mapping resource="com/hibernate/domain/User.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
3.实体类
package com.hibernate.domain; public class User { private int UserId; private String UserName; private String PassWord; private int Age; private String Sex; public User(){ } public User(String userName,String password,int age,String sex){ this.UserName = userName; this.PassWord = password; this.Age = age; this.Sex = sex; } public int getUserId() { return UserId; } public void setUserId(int UserId) { this.UserId = UserId; } public String getUserName() { return UserName; } public void setUserName(String UserName) { this.UserName = UserName; } public String getPassWord() { return PassWord; } public void setPassWord(String PassWord) { this.PassWord = PassWord; } public int getAge() { return Age; } public void setAge(int Age) { this.Age = Age; } public String getSex() { return Sex; } public void setSex(String Sex) { this.Sex = Sex; } }
4.编写orm元数据 User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" > <!--映射标签 package:内部类的所在的包名,内部不用写完整类名 --> <hibernate-mapping package="com.hibernate.domain"> <!--需要设置的映射类:设置该类对应的表 --> <!--属性:name:类名 table:表名 --> <!-- name="com.hibernate.domain.User" 因为用了package就不用写完整包名了--> <class name="User" table="User"> <!--id:主键,name:属性名称,column:字段名称 --> <id name="UserId" column="UserId"> <!--generator:主键生成策略 class:标记主键如何生成 取值: 1、native:自动增长,会根据当前的数据库自动切换 2、identity:mySQL的自增策略 3、sequence:Oracle的自增标记 4、uuid:32位字符串 5、assigned:自定义字符串 6、foreign:外键 7、increment:自己维护自增关系--> <generator class="native"/> </id> <!--配置属性对应的字段 column(可选):不填就自动走属性名 type(可选)填写该列的类型 不填会自动识别 not-null(可选):默认false可为空 length(可选):长度,默认值数据库类型最大长度--> <property name="UserName" column="UserName" type="java.lang.String"/> <property name="PassWord" column="PassWord" type="string"/> <property name="Age" column="Age"/> <property name="Sex" column="Sex"> <!--<column name="Sex" sql-type="varchar"></column> string还可以这样定义--> </property> </class> </hibernate-mapping>
5.增删改查
import com.hibernate.domain.User; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class Main { public static void main(String[] args) { //加载配置文件 空参默认加载src下的hibernate.cfg.xml Configuration conf = new Configuration().configure(); // 创建SessionFactory (保存和使用所有配置信息,消耗内存资源非常大,保证在web项目中只创建一个) SessionFactory sf = conf.buildSessionFactory(); // 创建Session对象 打开一个新的session对象 Session session = sf.openSession(); //sf.getCurrentSession();获得一个现有的session对象 没有就创建 需要在配置文件中进行配置 // 开启事务 Transaction trans = session.beginTransaction(); //新增 session.save(new User("测试", "666666",18,"男")); //查询 User user = session.get(User.class,1); System.out.println(user.getUserName()); //修改 user.setUserName("武大郎"); session.update(user); //删除 User u = session.get(User.class,2); session.remove(u); trans.commit(); //trans.rollback(); session.close(); sf.close(); } }
不用去数据库建表,hibernate会自动根据实体反向生成。
编写工具类
package com.hibernate.utils; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { public static final SessionFactory sessionFactory; static { Configuration conf = new Configuration().configure(); sessionFactory = conf.buildSessionFactory(); } public static Session openSession(){ Session session = sessionFactory.openSession(); return session; } public static Session getCurrentSession(){ Session session = sessionFactory.getCurrentSession(); return session; } }
测试
Session session = HibernateUtils.openSession(); session.save(new User("测试", "666666",18,"男")); session.close();