框架介绍
框架:可以完成一部分功能的半成品项目
五种框架:
------------SSH:Spring + Structs2 + Hibernate
------------SSM:Spring + SpringMVC + MyBatis
JAVA三层架构:
--------------------servlet:Structs2或者SpringMVC取代 – 只能单独使用其中一个,不能一起使用
--------------------dao:由Hibernate或MyBatis取代
--------------------连接三层:Spring 连接三层,包容市面上所有技术
Hibernate框架搭建
1.导入jar包
1.hibernate-release-5.0.7.Final\lib\required中所有jar包
2.数据库驱动包
3.以及其他项目所需要的jar包
2.准备数据库/实体类
实体类以Customer为例:成员变量以及各自get/set方法
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
数据库以cst_customer为例:
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
`cust_create_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` varchar(64) DEFAULT NULL COMMENT '联系人',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
3.书写配置文件
Hibernate有两种配置文件
1.Hibernate主配置文件:hibernate.cfg.xml - src下
2.对象关系映射配置文件:ORM元数据,位置随意,文件名推荐:实体类名.hbm.xml
4.代码测试
1.加载配置文件
Configuration configure = new Configuration().configure();
2.获得session-factory
SessionFactory factory = configure.buildSessionFactory();
3.获得session对象,取代connection
Session session = factory.openSession();
4.开启事务
Transaction transaction = session.beginTransaction();
5.session操作数据库
//根据cust_id查找customer
Customer customer = session.get(Customer.class,1L);
6.关闭事务 - commit/rollback
// 6.关闭事务 - commit/rollback
transaction.commit();
7.关闭资源
session.close();
factory.close();
Hibernate配置文件
1.Hibernate主配置文件
hibernate.cfg.xml - 导入dtd约束
位置:src下
1.导入dtd约束的步骤:
Eclipse:工具栏 window - preference - XML catalog - Add -导入本地文件
在dtd文件中:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
第一行为publicID
第二行为URI/WEB Address
本地无dtd,可以从:
jar包-hibernate-core-5.0.7.Final.jar - hibernate-configuration-3.0.dtd 中找到
书写hibernate.cfg.xml配置文件:
配置文件键值对:hibernate-release-5.0.7.Final\project/etc/hibernate.properties - MYSQL
<!--复制hibernate-configuration-3.0.dtd 中的DOCTYPE信息-->
<!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.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///crm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 选填 #hibernate.show_sql true 打印执行的sql语句
hibernate.format_sql true 格式化sql语句-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!-- 选填auto schema export
自动导出表结构
#hibernate.hbm2ddl.auto create-drop -每次操作都是创建新表,操作完在删除表
#hibernate.hbm2ddl.auto create -每次执行都是创建一张新表,原表被删除
以上两种选项不建议使用
#hibernate.hbm2ddl.auto update 如果表不存在,创建表;如果存在,在已有的表中操作 - 建议使用
如果表结构改变,同时会更新表结构-仅限增加新的字段
#hibernate.hbm2ddl.auto validate 只在表存在且表结构正确的时候可用
-->
<property name="#hibernate.hbm2ddl.auto">update</property>
<!-- 引入映射文件,使用相对路径 元数据
resource:从类路径开始
-->
<mapping resource="beans/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.对象关系映射配置文件
hibernate-mapping.hbm.xml:ORM元数据,位置随意
文件名推荐:实体类名.hbm.xml
导入dtd约束:
书写:
<!--复制hibernate-mapping-3.0.dtd 中的DOCTYPE信息-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 表和实体类的关系 -->
<!-- package:如果添加包,那么其中的所有类名可以写简单类名 -->
<hibernate-mapping package="beans">
<class name="Customer" table="cst_customer">
<!--id:由hibernate维护的表,必须存在主键
name:主键对应的属性名 - 必填
column:主键对应的字段名 - 省略时自动识别
name和column一致时,可以省略
type:字段类型 - 省略时自动识别
java类型:java.lang.Long
数据库类型:bigint
hibernate:long/string/int
length:字段允许最大长度 - 省略时为类型允许的最大长度
-->
<id name="cust_id" column="cust_id">
<!-- generator:主键生成策略 -->
<generator class="native"></generator>
</id>
<!--propertity: 除了主键以外的其他普通属性/字段
name和column一致时,column可以省略
-->
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_linkman" column="cust_linkman"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>
HibernateAPI详解
Configuration
public void test02() {
// Configuration config = new Configuration();
// // 必须调用,并且就返回对象本身
// config.configure();
Configuration config = new Configuration().configure();
// configure() 无参,默认加载 classpath[src]/hibernate.cfg.xml
// 添加ORM映射文件
// config.addClass(Customer.class);
// config.addResource("beans/Customer.hbm.xml");
// 直接在主配置文件中添加<mapping>,就可以直接调用而不用调用上面两个方法
}
sessionFactory
public void test03() {
Configuration config = new Configuration().configure();
// SessionFactory: <session-factory>
// 作用简单来说就是为了得到操作数据库的核心对象session
// SessionFactory其中保存了所有的配置信息,非常消耗资源
// SessionFactory设计,本身就是线程安全的
// 结论:项目运行中,SessionFactory只有一个 - 单例模式
SessionFactory factory = config.buildSessionFactory();
// 每次都获得新的Session对象
factory.openSession();
// 获得当前Session对象 - 事务 - ThreadLocal
factory.getCurrentSession();
}
Transcation
public void test04() {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
// 开启事务两种方式
// 1.获得并且直接开启事务 - 推荐使用
Transaction tx = session.beginTransaction();
// 2.单纯的获得事务对象
// Transaction tx = session.getTransaction();
// tx.begin(); // 单独开启事务
tx.commit(); // 提交事务 - try/finally
//tx.rollback();// 回滚事务 - catch
}
数据库的增删改查
// 新增对象
public void test01() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 5.Session操作数据库 增删改查
// -----------------------
// 新增 - id 自增长,不需要传入
Customer c = new Customer();
c.setCust_name("百度");
c.setCust_mobile("123456677");
session.save(c);
// -----------------------
// 6.关闭事务
tx.commit();
// 7.关闭资源
session.close();
}
// 根据ID查询对象
public void test02() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 5.Session操作数据库 增删改查
// -----------------------
// 传参:对象类型,id
// Customer customer = session.get(Customer.class, 1L);
Customer customer = session.load(Customer.class, 2L);
System.out.println(customer);
// -----------------------
// 6.关闭事务
tx.commit();
// 7.关闭资源
session.close();
}
// 修改对象
public void test03() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 5.Session操作数据库 增删改查
// -----------------------
// 先根据ID查询
Customer customer = session.get(Customer.class, 1l);
customer.setCust_name("企鹅");
customer.setCust_level("VVIP");
session.update(customer);
// -----------------------
// 6.关闭事务
tx.commit();
// 7.关闭资源
session.close();
}
// 删除对象
public void test04() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 5.Session操作数据库 增删改查
// -----------------------
// 先根据ID查询
Customer customer = session.get(Customer.class, 1l);
session.delete(customer);
// -----------------------
// 6.关闭事务
tx.commit();
// 7.关闭资源
session.close();
}