目录
1、ORM思想概述
2、自定义ORM框架
3、第一个Hibernate程序开发步骤(重要)
1)下载完整包
2)创建项目,导入所需jar包
3)建立student表
4)创建和student表对应的Student实体类
5)创建student表与Student实体类之间的关系映射文件
6)创建hibernate与MYSQL数据库的连接配置文件
7)编写测试代码
1、ORM思想概述
对象数据到关系数据映射的规则/框架/工具。
ORM的优点:
1. 完全面向对象的编程思想,无SQL出现.
2. 减少代码编写,提高工作效率.
3. 提高访问数据库的性能,降低访问数据库的频率.
4. 具有独立性,发生变化时,不会影响上层的实现.
Hibernate是什么?
面向java环境的对象/关系数据库映射框架/工具。
1. 开源免费的持久层框架.
2. ORM(Object/Relational Mapping)实现之一,建立面向对象的域和关系之间的映射.
3. 对JDBC进行封装,负责java对象的持久化(CURD).
4. 在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑
结论:Hibernate是一个对jdbc进行封装的ORM思想的持久层框架。
2、自定义ORM框架
目标:在DAO层,设计一个通用的Session类,包含一个通用save()保存方法,任意传入一个带有数据的对象就可以保存到指定的表中。
步骤:
1)在数据库设计一张student表,如下:
2)建立实体对象及对象的映射xml文件
Student实体对象: public class Student { private int id; private String name; private String gender; private int age; 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 String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
Student.hbm.xml文件 <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping> <!-- class: 表示需要保存的实体类 table: 表示需要保存到表 --> <class name="gz.itcast.entity.Student" table="student"> <!-- name: 表示实体类的属性 column:表示表的字段名称 --> <property name="id" column="id"></property> <property name="name" column="name"></property> <property name="gender" column="gender"></property> <property name="age" column="age"></property> </class> </hibernate-mapping> |
3)Student的DAO类
public class StudentDao {
public void saveStudent(Student student){ Session session = new Session(); session.save(student); } } |
4)通用的Session类的设计(目的为了保存对象及保存表的数据)
public class Session { QueryRunner qr = new QueryRunner(C3P0Util.getDataSource()); //执行sql语句 String sql = null; //参数值 Object[] values = null; //保存方法 public void save(Object obj){ //获取sql和参数值 buildSqlAndParam(obj); try { qr.update(sql,values); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } //insert into student(id,name,gender,age) values(?,?,?,?) //构建sql语句 private void buildSqlAndParam(Object obj){ try { List<Object> params = new ArrayList<Object>(); InputStream is = Session.class.getResourceAsStream("/gz/itcast/entity/Student.hbm.xml"); SAXReader reader = new SAXReader(); Document doc = reader.read(is); String sql1 = "insert into "; String sql2 = " values(";
Class clazz = obj.getClass(); String className= clazz.getName();
List<Element> list = doc.getRootElement().elements("class"); for(Element elem:list){ if(elem.attributeValue("name").equals(className)){ //表名 String tableName = elem.attributeValue("table"); sql1 += "student("; //System.out.println(tableName); List<Element> propElems = elem.elements("property");
for(Element propElem:propElems){ String columnName = propElem.attributeValue("column"); sql1 += columnName+","; sql2 += "?,";
//取对象的值 String name = propElem.attributeValue("name"); Field field = clazz.getDeclaredField(name); field.setAccessible(true); params.add(field.get(obj)); } sql1 = sql1.substring(0,sql1.length()-1); sql2 = sql2.substring(0,sql2.length()-1); sql1 += ")"; sql2 += ")"; } } System.out.println(sql1+sql2); System.out.println(params); //赋值 sql = sql1+sql2; values = params.toArray(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } } |
5)测试类
public class TestDao { public static void main(String[] args) { StudentDao stuDao = new StudentDao(); Student student = new Student(); student.setId(1); student.setName("张三"); student.setGender("男"); student.setAge(20); stuDao.saveStudent(student); } } |
3、第一个Hibernate程序开发步骤(重要)
开发步骤:
1)下载完整包
到hibernate官网下载完整zip包 。hibernate-release-4.3.8.Final.zip
2)创建项目,导入所需jar包
建立java项目,导入所需jar包,拷贝%hibernate%/lib/required目录下的所有jar包
3)建立student表
4)创建和student表对应的Student实体类
public class Student { private int id; private String name; private String gender; private int age; 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 String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]"; } } |
5)创建student表与Student实体类之间的关系映射文件
技术:XML
名字:理论上前缀不限,后缀必须是小写字母xml,但提倡使用如下格式:实体类名.hbm.xml
位置:理论不限,但提倡放在与实体类同一个目录下
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="gz.itcast.entity.Student" table="student"> <!-- 主键配置 --> <id name="id" column="id"> <!-- 主键策略 --> <generator class="assigned"></generator> </id> <property name="name" column="name"></property> <property name="gender" column="gender"></property> <property name="age" column="age"></property> </class> </hibernate-mapping> |
6)创建hibernate与MYSQL数据库的连接配置文件
技术:XML
名字:理论上前缀不限,后缀必须是小写字母xml,但提倡使用如下格式:hibernate.cfg.xml
位置:理论不限,但提倡放在IDE工具的src目录下
<!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 name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/day14?useUnicode=true&characterEncoding=utf-8 </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 数据库方言 --> <property name="hibernate.dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </property> <!-- 对象关系映射的配置 --> <mapping resource="gz/itcast/entity/Student.hbm.xml" /> </session-factory> </hibernate-configuration> |
7)编写测试代码
public class TestHello {
public static void main(String[] args) { //创建配置管理器对象 Configuration configuration = new Configuration().configure();
//创建服务注册器 StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder(). applySettings(configuration.getProperties()). build(); //创建SessionFactory对象 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); //获得Session对象 Session session = sessionFactory.openSession(); //打开事务 Transaction tx = session.beginTransaction();
Student s = new Student(); s.setId(4); s.setName("陈六"); s.setGender("男"); s.setAge(20); //保存方法 session.save(s); //提交事务 tx.commit(); //关闭Session连接 sessionFactory.close(); } } |