Spring和Hibernate整合
这里是java框架技术Spring和Hibernate的整合,后期会有关于SSH以及SSM的项目配置。
-
新建web工程SH
-
导包(这里导入Spring、Hibernate以及数据库连接相关jar包)
如下图所示:可根据自己的JDK版本等开发环境下载需要的jar包
-
配置
注意:把Hibernate配置文件整合到Spring配置文件中
① 配置数据源:Hibernate中数据库连接信息
DriverClass | jdbcurl | user | password
② 配置session工厂:sessionFactory------Hibernate4
配置依赖的数据源对象
配置其他的Hibernate信息
数据库方言(hibernate.dialect)
显示数据库信息(hibernate.show_sql)
格式化(hibernate.format_sql)
(hibernate.hbm2ddl.auto)
配置元数据
Xml元数据配置(mappingResources)
注解元数据配置(packagesToScan) -
数据库连接池
作用:用来提高程序的性能
工作原理:在项目启动的时候先创建一定数量的数据库连接对象放在数据库连接池中,在运行的过程中,程序如果需要数据库连接直接从数据库连接池中获取,不需要数据库直接获取连接。
常用数据库连接池
数据源 | 说明 |
---|---|
DBCP | 较稳定,性能低 |
C3P0 | 不稳定,性能高 |
Proxool | 不稳定,性能最高 |
配置数据库连接池(C3P0)的信息
设置最大连接数量限制(maxPoolSize)
设置数据库连接池初始数量(initialPoolSize)
设置每次创建的数量(acquireIncrement)
设置数据库连接池的最低数量(minPoolSize)
设置数据库连接池最大钝化时间(等待时间)(maxIdleTime)
applicationContext.xml
<!-- 配置数据源 :包括数据库连接信息-->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver}"></property>
<property name="jdbcUrl" value="${url}"></property>
<property name="user" value="${username}"></property>
<property name="password" value="${password}"></property>
<!-- 数据库连接池信息 -->
<!-- 设置数据库连接池的最大数量 -->
<property name="maxPoolSize" value="100"></property>
<!-- 设置数据库连接的初始数量 -->
<property name="initialPoolSize" value="30"></property>
<!--设置每次创建的量 -->
<property name="acquireIncrement" value="10"></property>
<!-- 设置数据库连接池的最低数量 -->
<property name="minPoolSize" value="5"></property>
<!--设置数据库连接的最大等待时间 -->
<property name="maxIdleTime" value="120"></property>
- AOP技术进行事务处理
配置事务相关处理
在Spring主配置文件applicationContext.xml中进行事务相关配置
<!-- 进行事务相关配置 -->
<!-- 配置事务管理器 -->
<bean id="tr" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<!-- 设置依赖关系,依赖session工厂 -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置tx类型的通知 (前提要加入新的命名空间tx),依赖事务管理器-->
<tx:advice transaction-manager="tr" id="mytx">
<!--设置属性
Method:该通知要加到哪些方法上(可以使用通配符)
Isolation:设置事务的隔离级别
Propagation:设置事务的传播行为
-->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="query*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入点pointcut -->
<aop:pointcut expression="execution(* com.xixw.service.*.*(..))" id="point"/>
<!-- 配置切面advisor -->
<aop:advisor advice-ref="mytx" pointcut-ref="point"/>
</aop:config>
- 在数据库中经常出现的问题
问题 | 说明 |
---|---|
脏读 | 事务A未提交的数据被事务B读取到,然后事务A在提交的过程中失败,数据回滚,导致脏数据的产生。(任何时候都不允许) |
不可重复读 | 事务A有两处读取数据,第一次读完后,数据被事务B修改,导致第二次读取到的数据和第一次不一致。(允许存在) |
幻读 | 和不可重复读类似,但是操作的是结果集。(允许存在) |
- 隔离级别设置(为了解决数据库中经常出现的问题)
*Isolation:设置事务的隔离级别
隔离级别 | 说明 |
---|---|
SERIALZABLE | 串行读,可以解决上述三个问题,隔离级别最高,只有在数据安全性要求很高的时候使用,会影响程序的性能。 |
REPEATABLE_READ | 可重复读,可以解决脏读和不可重复读 |
READ_COMMITTED | 提交读,只能解决脏读 |
READ_UNCOMMITTED(默认) | 未提交读,不能解决问题 |
- Propagation:设置事务的传播行为
传播行为 | 说明 |
---|---|
REQUIRED | 该类方法必须要添加到事务中运行,若当前有事务则参与其中,否则开启新事务 |
SUPPORT | 该类方法支持事务运行,若当前有事务则参与其中,否则直接运行 |
NOTSUPPORT | 该类方法不支持事务运行,若当前有事务则挂起事务,然后运行 |
NEVER | 该类方法不支持事务运行,若当前有事务直接抛出异常 |
NESTED | 嵌套事务 |
REQUIRES_NRW | 该方法必须要放在事务中运行,如果当前存在事务则将该事务挂起,开启新事务 |
MANDATORY | 该方法必须运行在当前事务中,如果没有事务则报错 |
- getCurrentSession和openSession的区别
getCurrentSession | openSession |
---|---|
只能获取和当前线程绑定的session | 获取全新的session |
若在Spring中单独使用getCurrentSession获取session则要将session对象与当前线程绑定,已经整合则不需要 | 若使用openSession则不需要配置 |
若使用getCurrentSession不能手动调用close方法关闭session | 若使用openSession则必须手动调用close方法进行关闭session |
都可以获取session对象 |
小总结:
- jdbc的使用流程?怎么加载MySQL驱动?
JDBC连接数据库的流程:
首先导入数据库驱动jar包;
注册驱动:Class.forName(“com.mysql.jdbc.Driver”)
创建一个连接对象:Connection conn = DriverManager.getConnection(“jdbc:mysql://
localhost:3306/mydb”,“root”,“root”)
创建一个sql语句的发送命令对象:Statement stmt = conn.createStatement();;
执行sql,拿到查询的结果集对象:ResultSet rs = stmt.executeQuery(“select * from stu”);
遍历结果集获取数据;
释放资源,关闭连接:close();
加载驱动方法有三个:
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);
- 在连接数据库之前,首先加载要连接的数据库驱动到JVM,较常用的方法是通过java.lang.Class类的静态方法forName实现,因为class.forName与类加载机制有关,会触发执行com.mysql.jdbc.Driver类中的静态方法,从而使主类加载数据库驱动。这种方法不会对具体的驱动类产生依赖。
- 如果要注册多个驱动,则采用第三种方法,通过系统属性指定数据库驱动,虽然不会对具体的驱动类产生依赖,但注册不太方便,所以很少使用。
- 使用DriverManager加载的时候注册一次驱动,实例化的时候又注册一次,因此注册了两次,由于实例化了com.mysql.jdbc.Driver.class,导致必须导入该类,从而具体驱动产生了依赖,不方便扩展代码。
- 对于连接数据库,需要什么?除了JDBC