1. 传统JDBC的缺点
一般的JDBC代码如下:
传统的JDBC代码中含有大量的异常处理语句,使得代码繁杂。
2. 配置数据库资源
在实际工作中,大部分会配置成为数据库连接池,我们既可以使用 Spring 内部提供的类,也可以使用第3方数据库连接池或者从Web服务器中通过 JNDI 获取数据源。
1.使用简单数据库配置
配置SimpleDriverDataSource:
这样就能够配置一个最简单的数据源。这个配置一般用于测试,因为它不是一个数据库连接池,只是一个很简单的数据库连接的应用。在更多的时候,也可以使用第三方的数据库连接。
2.使用第三方数据库连接池
当使用第三方的数据库连接池时,比如 DBCP 数据库连接池,我们下载了对应的 DBCP 数据库连接池相关的包后就可以使用它了。同样的在 Spring 中简单配置后,就能使用它了,配置DBCP数据库连接池:
这样就能够配置 DBCP 的数据库连接池了。
3. 使用JNDI数据库连接池
配置JNDI数据源:
3.JDBC代码失控的解决方法
jdbcTemplateSpring是针对 JDBC 代码失控提供的解决方案:
配置好了dataSource和jdbcTemplate 就可以操作 jdbcTemplate 。通过jdbcTemplate操作数据库:
使用了 jdbcTemplate的queryForObject方法。它包含两个参数,一个是SQL,另一个是RowMapper接口,这里使用匿名类,所以采用new关键字创建一个RowMapper接口对象。
1.jdbcTemplate的增删改查
2.执行多条SQL
jdbcTemplate只执行了一条SQL,当要多次执行 SQL 时,可以使用execute方法。它允许传递ConnectionCallback或者StatementCallback等接口进行回调,从而完成对应的功能。回调ConnectionCallback和StatementCallback接口:
通过实现 ConnectionCallback或者StatementCallback 接口的方法获取 Connection 对象或者Statement对象,这样便能够执行多条 SQL 了。
3.MyBatis-Spring项目
SSM框架中,使用SpringIoC可以有效管理各类java资源,使用AOP框架,数据库事务可以委托给Spring处理,消除很大一部分事务代码,配合MyBatis的高灵活、可配置、可优化SQL等特性,完全可以构建高性能的大型网站。
配置MyBatis-Spring项目需要这么几步:
- 配置数据源
- 配置SqlSessionFactory
- 可以选择的配置有SqlSessionTemplate,同时配置SqlSessionTemplate和SqlSessionFactory的情况,优先采用SqlSessionTemplate。
- 配置Mapper,可以配置单个Mapper,也可以通过扫描方法生成Mapper,较灵活。此时SpringIoC会生成对应接口的实例,这样就可以通过注入的方式获取资源。
- 事务管理
1.配置SqlSessionFactoryBean
SqlSessionFactoryBean的源代码:
从源码可看出,可以配置所有关于MyBatis额组件,并且提供了对应的setter方法让Spring设置它们,完全可以通过SpringIoC容器的规则去配置。由于使用第三方包,更倾向于XML配置。配置SqlSessionFactoryBean:
这里配置了SqlSessionFactoryBean,但只是配置了数据源,然后引入一个MyBatis配置文件,当所配置的内容很简单则可以完全不引入MyBatis配置文件,只需要通过SpringIoC容器注入。MyBatsi配置文件:sqlMapConfig.xml:
这里配置了 MyBatis 配置项,然后定义角色的别名role,跟着引入了映射器 RoleMapper.xml
定义一个命名空间(namespace),并且提供了对角色 增、 删、 查、改方法。按照 MyBatis 的规则需要定义1个接口 RoleMapper.java,才能够调用它。
2.SqlSessionTemplate组件
SqlSessionTemplate并不是一个必须配置组件,它是一个线程安全的类,也就是确保每个线程使用的SqlSession唯一且不互相冲突。配置SqlSessionTemplate:
SqlSessionTemplate 要通过带有参数的构造方法去构建对象,常用的参数SqlSessionFactory和MyBatis执行器( Executor )类型,取值范围是 SIMPLE REUS ATCH,配置好了 Sq!SessionTemplate 就可使用它了 ,比如增、删、查、改的应用。SqlSessionTemplate的应用:
3.配置MapperFactoryBean
由于使用了SqlSessionTemplate的一些不便之处,MyBatis的运行只需要提供类似RoleMapper.java的接口,而不需要提供一个实现类。为解决这个问题,MyBatis-Spring提供一个MapperFactoryBean类作为中介,我们可以通过配置它实现我们想要的Mapper。使用了Mapper接口编程可以有效的在逻辑代码中擦除SqlSessionTemplate。配置RoleMapper对象:
这里有三个属性可以配置:mapperInterface、SqlSessionTemplate和SqlSessionFactory,其中:
- mapperInterface是映射器的接口
- 当同时配置sqlSessionTemplate和SqlSessionFactory,则就会启用sqlSessionTemplate,而SqlSessionFactory作废
当我们配置这样一个Bean,则可以使用如下代码获取映射器:
4.配置MapperScannerConfigurer
这是一个通过扫描的形式进行配置Mapper的类,当一个个去配置Mapper,则工作量很大并且导致配置泛滥,有了它只需要给予一些简单的配置,就可以生成大量的Mapper。对于MapperScannerConfigurer的主要配置项有以下几个:
- basePackage:指定让Spring自动扫描什么包,会逐层深入扫描,如果遇到多个包可以使用半角逗号分割。
- annotationClass:表示如果类被这个注解标识的时候,才能进行扫描。在Spring中使用注解@Repository表示数据访问层。
- SqlSessionFactoryBeanName:指定在Spring中定义SqlSessionFactoryBean的名称,当SqlSessionTemplateBeanName被定义,则会失去作用
- markerInterface:指定实现了什么接口就认为它是Mapper,我们需要提供一个公共的接口去标记。
其实还有其他很多配置项,如SqlSessionFactory和sqlSessionTemplate,但是不推荐。改造RoleMapper:
从代码中可以看到注解@Repository的引入,标志着这是一个dao层,还需要告诉Spring扫描哪个包,这样就可能扫出对应的Mapper到SpringIoC容器中。通过扫描的方法配置RoleMapper:
通过这样的配置SpringIoC容器就可以知道将包命名为com.ssm.chapter12.mapper,把注解为@Repository的接口扫描为Mapper对象,存在容器中,对于多个包的扫描可以用半角逗号分开。
使用@Repository注解,它将允许将接口放到各个包中,然后通过简单的定义类MapperScannerConfigurer的basePackage属性扫描出来,有利于对包的规划。也可以使用扩展接口名的方法进行定义,如这里先定义一个接口-BaseMapper:
使用RoleMapper扩展BaseMapper:
这里RoleMapper扩展了BaseMapper,使得Spring可以扫描到这个接口,使用标记接口注册Mapper:
和注解方法一样,也能够让Spring扫描标记扩展BaseMapper的接口,并生成对应的Mapper。
5.测试Spring+MyBatis
配置MyBatis-Spring项目:
测试Spring+MyBatis:
从代码中可以看到己经没有复杂的SqlSessionTemplate的操作,这些已经被擦除,正因为擦除让大家看不到 MyBatis 框架的 API, 使得代码具有更高的可读性。