hibernate
总结
crm系统:客户关系管理系统。
crm系统技术架构:采用b/s模式,基于javaEE三层标准架构,表示层(web层)、业务层、持久层
技术层技术方案:使用hibernate实现数据访问接口,采用dao模式开发数据访问接口,dao包括:dao接口和pojo类。
hibernate:是orm框架,orm即对象关系映射。
hibernate完成java类和表的映射之后,自动实现向数据库发起操作(增、删、改、查)
hibernate 执行流程:
- 配置文件
1)映射文件,xxx.hbm.xml(配置表和类的映射关系)和pojo类(bean),一对儿对应一张表
2)hibernate.cfg.xml,配置hiberante运行参数(属性)、加载hbm.xml
- 使用configuration对 文件,创建sessionFactory会话工厂
sessionFactory会话工厂,生产session,sessionFactory是线程安全的,可以采用单例模式管理sessionFacrory
-
通过sessionFactory创建session(包括数据库连接),session中包括一个connection数据库连接,通过session向数据库发出sql语句
-
通过session操作数据库
1)对于增删改操作,需要开启事务
2)对查询操作,通过query对象查询。
- 释放资源
- xxx.hbm.xml
<hibernate-mapping>
<!-- 将表和类对应起来
name:类名,写类的全限定名(必须配置)
table:表名(必须配置)
catalog:使用mysql配置数据库名,可以不用配置,默认使用连接的哪个数据库的名字
schema:使用oracle时候配置用户名
-->
<class name="cn.itcast.crm.domain.CstCusomer" table="cst_customer">
<!-- 主键映射
name:表中的主键对应的属性
type:属性的类型
-->
<id name="custId" type="java.lang.Long">
<!--对应表中的主键字段-->
<conlumn name="cust_id"></conlumn>
<!--主键生成策略
identity:自增主键生成策略
其他策略:uuid(唯一串),assgiend(手动指定),sequence(用于oracle中的序列生成主键)
-->
<generator class="identity"></generator>
</id>
<!--普通属性和字段的映射
name:类中的属性
-->
<property name="custName" type="string">
<!-- 属性对应的字段 -->
<conlumn name="cust_name"></conlumn>
</property>
</class>
</hibernate-mapping>
- hibernate.cfg.xml
<hibernate-configuration>
<!-- 配置会话工厂所需要的属性 -->
<session-factory>
<!-- 配置hibernate运行的参数 -->
<!-- 数据库方言,根据数据库选择 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库连接url -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/crm_hibernate0120</property>
<!-- 数据库用户名和密码 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mysql</property>
<!-- 配置c3p0 -->
<!-- 连接池提供商 -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- 连接池中保留的最大连接数-->
<property name="hibernate.c3p0.max_size">10</property>
<!-- 连接池中保留的最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃 -->
<property name="hibernate.c3p0.maxIdleTime">60</property>
<!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!--为了方便调试是否在运行hibernate时在日志中输出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否对日志中输出的sql语句进行格式化 -->
<property name="hibernate.format_sql">true</property>
<!--
hbm2ddl.auto的4个值,如果不需要设置为none,建议正式环境设置为none
validate 加载hibernate时,验证创建数据库表结构
create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
create-drop 加载hibernate时创建,退出是删除表结构
update 加载hibernate自动更新数据库结构
none 不执行检查
-->
<property name="hibernate.hbm2ddl.auto">none</property>
<!-- 加载hbm.xml映射文件 -->
<mapping resource="cn/itcast/crm/domain/CstCustomer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Dao
Dao模式(data access object)它包括Data Accessor和Domain Object两部分。
- data accessor可以将业务层访问数据库的细节代码封装起来,常见的是封装成一个java接口,比如插入用户信息dao接口。
- Domain Object为领域对象,将业务数据封装在一个java对象中,供dao接口使用,比如将用户信息封装在一个User对象中。
hibernate
hibernate是轻量级javaee应用的持久层框架,它用于实现DAO,它是一个关系型数据库的ORM框架。
- ORM框架:Object Relational Mapping对象关系映射
- Object:对象,java对象
- Relational:关系,关系数据库中的二维表
- Mapping:映射,通过操作java对象去操作数据库
对应关系 | |
---|---|
java类 | 表 |
java对象 | 表中每一条记录 |
java对象属性 | 表中字段 |
新增客户功能实现
1. sessionFactory生命周期
sessionFactory是会话工厂,它的作用是创建session。sessionFactory是线程安全的,多个并发线程可以同时访问一个sessionFactory并从中获取session实例,sessionFactory在实际开发中可以单例模式管理,即应用程序在执行过程中只存在一个sessionFactory,创建工具类如下:
public class HibernateUtil{
private static SessionFactory sessionFactory;
//通过单例管理sessionFactory,整个系统运行过程中只会构建一个sessionFactory对象
static{
sessionFactory = new Configuration().configure().buildSessionFactory();
}
//获取sessionFactory
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
//获取session
public static Session openSession(){
return sessionFactory.openSession();
}
}
2. Dao
开发dao原则:
-
针对每一张表有一个dao 接口
-
dao中不要有业务逻辑,因为dao是一个通用的数据库访问的接口
public interface CstCustomerDao{
//插入客户信息
public void insert(CstCustomer customer);
}
public class CstCustomerDaoImpl implements CstCustomerDao{
@Override
public void insert(CstCustomer customer){
//创建session
Session session = HibernateUtil.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
try{
session.save(customer);
transaction.commit();
}catch(Exception e){
e.printStackTrace();
//回滚事务
transaction.rollback();
}finally{
session.close();
}
}
}
3. service
开发service根据模块去创建,一个模块创建一个service
public class CusomerServiceImpl implements CustomerService{
@Override
public void insertCustomer(CstCustomer cstCustomer){
//调用dao插入客户信息
CstCustomerDao cstCustomerDao = new CstCustomerDaoImpl();
cstCustomerDao.insert(cstCustomer);
}
}
4. servlet
接受http请求,调用service执行业务逻辑,返回http结果。
接受客户信息:jsp向servlet提交客户信息
将客户信息封装成polo对象,调用service