Spring总结四:JDBC操作

Spring 对 JDBC 的支持

    为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架。
    JdbcTemplate(JDBC 模板)作为 Spring JDBC 框架的核心(其实Spring还有一一个常用模板,后面会提到), JDBC 模板的设计目的是为不同类型的 JDBC 操作提供模板方法. 每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务. 通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低。

数据源

    介绍JdbcTemplate之前先来介绍一下数据源。

    惯例(数据源的官方概念):
    数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体。在数据源中存储了所有建立数据库连接的信息。就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数据源名称,你可以找到相应的数据库连接。

    数据源是使用持久化技术必须的,数据源说白了就是数据库连接池技术的一种具体实现,意义就是我们将与数据库的连接交给数据源去管理,我们在数据源中配置好信息之后,我们就可以在需要的时候从数据源中取出连接来供我们使用,而我们使用完之后也不用去考虑这个连接是否需要关闭,数据源会自动为我们管理(一般初始的连接不会关闭,跟我们对数据源的配置有关)。

    Spring有默认的数据源,但我们一般不用,以我目前的知识了解到的当前常用的数据源有C3p0、DBCP、JNDI、Druid

以C3P0为例演示配置:

	<!-- 导入资源文件 -->
	<context:property-placeholder location="classpath:db.properties"/>
		数据库信息配置在配置文件中,我们导入进来,可以通过${}的方式取出配置的值
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	 	<property name="user" value="${jdbc.user}"></property>
	 	<property name="password" value="${jdbc.password}"></property>
	 	<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
	 	<property name="driverClass" value="${jdbc.driverClass}"></property>
	 	<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
	 	<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
	 </bean> 

JdbcTemplate

    先来回顾一下不使用框架 JDBC 的操作流程。

  • 首先加载驱动Class.forName(“com.mysql.cj.jdbc.Driver”)
  • 获取连接Drivermanager.getConnection(url,username,password)
  • 创建 statement 对象(如果需要动态传入参数,可以使用preparedStatement对象,推荐都使用这个对象,PreperedStatement对于sql中的参数,允许使用占位符的形式进行替换,Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement可对SQL进行预编译,从而提高数据库的执行效率,减少数据库压力)connection.createStatement()
  • 执行 sql 语句得到结果statement.executeQuery(sql),这步骤注意一定要用ResultSet对象来接受结果
  • 关闭资源(可以简单理解为先开的后关),resultSet.close(),statement.close(),connection.close()

    JdbcTemplate封装了连接等一系列过程,只需要调用该对象的方法并传入参数就可以完成对数据库的操作。
    JdbcTemplate 类被设计成为线程安全的, 所以可以在IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.
在这里插入图片描述
    JdbcTemplate有许多方法,我当时学习的时候就学了几个比较典型的,毕竟实际开发也会整合其他框架,很少使用JdbcTemplate,所以只列举几个比较常用的方法吗,如果想了解更多,可以去查一下官方文档。

简单使用
  • 查询单行数据
    在这里插入图片描述
从数据库中获取一条记录,示意得到对应的一个对象
1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类的 BeanPropertyRowMapp(从这个类的名字就可以看出这个类的作用是将数据库行的属性值映射到Bean实体类的属性上)
	用法实例:
		RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
	结果集的行中的各列会映射到实体类对应的属性中。
2、使用 sql 中列的别名完成列名和类的属性名的映射,例如 username userName
3、不支持级联属性, JdbcTemplate 到底是 JDBC 的小工具,而不是 ORM 框架

由于使用了泛型,所以我们可以直接得到对应的对象
	String sql="select id,username,balance from account where id=?";
	User user=jdbcTemplate.queryForObject(sql, rowMapper, 1);
	
	1代表要传入的参数,参数个数与写的sql语句有关
  • 查询多行数据
    在这里插入图片描述
String sql="select id,username,balance from account where id>?";
List<User> userList=new ArrayList<User>();
RowMapper<User> rowMapper=new BeanPropertyRowMapper<User>(User.class);
userList=jdbcTemplate.query(sql, rowMapper,3);

这里注意 query方法返回的是 List<T> 类型的对象
  • 查询单个列的值或做统计查询
    在这里插入图片描述
String sql="select count(id) from account";
long count=jdbcTemplate.queryForObject(sql, Long.class);
第二个参数是要查询的列属性的类类型
  • 更新数据库
    在这里插入图片描述
String sql="update account set username=? where balance=?";
jdbcTemplate.update(sql, "Jack",99);
  • 批量操作

在这里插入图片描述

String sql="insert into account values(default,?,?)";
List<Object[]> batchArgs=new ArrayList<Object[]>();
batchArgs.add(new Object[] {"AA",12});
batchArgs.add(new Object[] {"BB",24});
batchArgs.add(new Object[] {"CC",48});
batchArgs.add(new Object[] {"DD",96});
batchArgs.add(new Object[] {"EE",192});
jdbcTemplate.batchUpdate(sql,batchArgs);

专门的批量操作方法可以提高效率
注意:
	可以看到在sql的参数中使用到了default,这个是告诉数据库采用默认的值,如果是主键的话,会自增,这样的好处是当我们只需要按照当前对象的序列
	来唯一标识这个数据的话,就不用先去查询数据库中原来有多少条数据去确定该数据的主键了。

    Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. 该类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建.
在这里插入图片描述
配置之后我们就可以直接在类中使用getJdbcTemplate()方法来得到JdbcTemplate,就可以直接调用方法了

NamedParameterJdbcTemplate

     NamedParameterJdbcTemplate 与 JdbcTemplate最大的区别是,该对象可以使用具名参数,但是它没有无参的构造器,所以必须配置的时候为其构造器指定参数(配置数据源)

NamedParameterJdbcTemplate的配置:

 <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
		<constructor-arg ref="dataSource"></constructor-arg>
 </bean>
简单使用
	/**
	 * 可以为参数起名字。
	 * 1、好处:若有多个参数,则不用再去对应位置,直接对应参数名,便于维护
	 * 	 如果sql中使用了in,那么通过?占位符来传参是不能解决问题的,直接拼接sql又会有sql注入的风险。
	 * 这种情况下可以使用NamedParameterJdbcTemplate 来解决问题。
	 * 具名参数:SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
	 * 2、缺点:较为麻烦
	 * 	 在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键
	 * 也可以使用 SqlParameterSource 参数
	 * 批量更新时可以提供 Map 或 SqlParameterSource 的数组
	 */
	@Test
	public void testNameParameterJdbcTemplate() {
		String sql="insert into account values(:id,:un,:bal)";
		Map<String,Object> paramMap=new HashMap<String,Object>();
		paramMap.put("id", 21);
		paramMap.put("un", "liqiye");
		paramMap.put("bal", 88);
		nameParameterJdbcTemplate.update(sql, paramMap);
	}
	/**
	 * 使用具名参数时,可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作
	 * 1、SQL 语句中的参数名和类的属性一致!
	 * 2、使用  SqlParameterSource 的  BeanPropertySqlParameterSource 实现类作为参数
	 */
	@Test
	public void testNameParameterJdbcTemplate2() {
		String sql="insert into account(id,username,balance) values(:id,:userName,:balance)";
		User user=new User();
		user.setId(22);
		user.setUserName("帝释");
		user.setBalance(33);
		SqlParameterSource paramSource=new BeanPropertySqlParameterSource(user);
		nameParameterJdbcTemplate.update(sql, paramSource);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值