Spring与数据库编程

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, 使得代码具有更高的可读性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值