iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Spring JDBC 访问数据库
  • 604
分享到

Spring JDBC 访问数据库

2024-04-02 19:04:59 604人浏览 安东尼
摘要

    spring JDBC是Spring所提供的持久层技术,它以一种更直接、更简单的方式使用JDBC api。在Spring JDBC里,用户仅需要做那些必不可杀

    spring JDBC是Spring所提供的持久层技术,它以一种更直接、更简单的方式使用JDBC api。在Spring JDBC里,用户仅需要做那些必不可杀的事儿,而将资源获取、Statement创建、异常处理、资源释放等繁杂的工作交给Spring。

    虽然ORM框架已经很成熟,但是JDBC灵活直接的特性依旧让它有自己的用武之地。

    本节的主要内容:使用JdbcTemplate模板类进行CRUD数据操作、BLOB和CLOB类型数据的操作,支持命名参数绑定NamedParameterJdbcTemplate模拟类的使用。

    1.在DAO中使用JdbcTemplate

    一般情况下,在XML中配置好JdbcTemplate,然后在DAO中注入即可

Spring配置文件中定义的JdbcTemplate并注入DAO中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="Http://www.springframework.org/schema/beans"  
 xmlns:context="http://www.springframework.org/schema/context"  
 xmlns:p="http://www.springframework.org/schema/p"  
 xmlns:mvc="http://www.springframework.org/schema/mvc"  
 xmlns:aop="http://www.springframework.org/schema/aop"  
 xmlns:tx="http://www.springframework.org/schema/tx"  
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 xsi:schemaLocation="http://www.springframework.org/schema/beans  
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
      http://www.springframework.org/schema/context  
      http://www.springframework.org/schema/context/spring-context.xsd  
      http://www.springframework.org/schema/mvc  
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
      http://www.springframework.org/schema/aop  
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
      <!-- 注解扫描包 -->
      <context:component-scan base-package="com.online"/>
      <context:property-placeholder location="classpath:/jdbc.properties"/>
      <!-- 配置数据源信息 -->
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName" value="${dataSource.driverClassName}"/>
       <property name="url" value="${dataSource.url}"/>
       <property name="username" value="${dataSource.username}"></property>
       <property name="passWord" value="${dataSource.password}"></property>
     </bean>
     <!-- 定义JDBC模板Bean -->
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      <property name="dataSource" ref="dataSource"></property>
     </bean>
</beans>
//@Repository声明一个DAO
@Repository    
public class AdminDao implements IAdminDao {
 private static Logger logger=Logger.getLogger(AdminDao.class);
 private static final long serialVersionUID = 1L;
 //@Autowired注入JdbcTemplate实例声明一个DAO
 @Autowired
 private JdbcTemplate jdbcTemplate;
 @Override
 public Admin getAdminByNamAndPassword(String adminId, String password) {
  // TODO Auto-generated method stub
  String sql="select adminId,adminName,adminPassword,adminHead,MAX(FROM_UNIXTIME(lastvisittime,'%Y-%m-%d %H:%m:%S')),lastvisitip from zzia_admin left join zzia_login_log on adminId=userId "
    + "where adminName='"+adminId+"' and adminPassword='"+password+"' ";
  final Admin a=new Admin();
  this.jdbcTemplate.query(sql, new RowCallbackHandler() {
   
   @Override
   public void proce***ow(ResultSet rs) throws SQLException {
    // TODO Auto-generated method stub
    a.setAdminId(rs.getInt(1));
    a.setAdminName(rs.getString(2));
    a.setAdminPassword(rs.getString(3));
    a.setAdminHead(rs.getString(4));
    a.setLastVisitTime(rs.getString(5));
    a.setLastVisitIp(rs.getString(6));
   }
  });
  return a;
 }

    2.基本的数据操作

    数据的增删查改以及存储过程调用是最基本的数据库操作,JdbcTemplate提供了众多的方法,通过JdbcTemplate用户可以用简单的方法完成这些数据操作

    2.1更改数据

        JdbcTemplate提供了若干update()方法,允许用户对数据表记录进行更改和删除操作

        Spring JDBC 访问数据库    

update示例:

public class TestJdbcTemplate {
 ...//这里省略jdbcTemplate的定义
 private static final String sql = "insert into jf_user(user_name,user_pwd,user_age) values(?,?,?)";
 public static void addUser(User user) {
  Object[] params = new Object[]{user.getUsername(),user.getUserpwd(),user.getUserage()};
  int update = jdbcTemplate.update(sql, params);
  if(update > 0){
   System.out.println("插入成功");
  }
 }
}

    2.2、返回数据库的表自增主键值

        用户经常使用数据的子增字段作为表主键,即主键值不在应用层产生,而是在新增记录时,由数据库产生。这样,应用层在保存对象前并不知道对象主键值,而只有在保存数据后才能从数据库中返回主键值。在很多情况下,需要获取新对象持久化后的主键值。在Hibernate、JPA等ORM框架中,新对象在持久化后,主键值会自动绑定到对象上,给程序的开发带来了很多方便。

        Spring提供了一个可以返回新增记录对应主键值的方法。int update(PreparedStatementCreator psc,KeyHolder generatedKeyHolder);org.springframework.jdbc.support.KeyHolder是一个回调接口,spring使用它保存新增记录对应的主键。Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该类返回新增记录时的自增长主键值。假设希望在新增对象后,将主键值加载到对象中,则代码示例

public static void addUserWithKeyHolder(final User user){
  final String sql = "insert into jf_user(user_name,user_pwd,user_age) values(?,?,?)";
  KeyHolder keyHolder = new GeneratedKeyHolder();
  jdbcTemplate.update(new PreparedStatementCreator() {
   
   @Override
   public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setString(1, user.getUsername());
    ps.setString(2, user.getUserpwd());
    ps.setString(3, user.getUserage());
    return ps;
   }
  }, keyHolder);
  user.setSerialNo(keyHolder.geTKEy().intValue());
 }

    如果数据库并发率比较高,如在插入记录后执行查询主键之前,数据库又执行了如果条插入记录,那么通过数据查询语句新增主键值将会只返回最后一条插入的主键值。因此,使用查询语句获取的主键值是不安全的,这也是为什么有些数据库(如oracle)故意不提供自增键,而是只提供序列的原因,序列强制要求用户在新增记录前,先获取主键值。Oracle通过SELECT <SEQUENCE_NAME>.nextval FROM DUAL获取序列的下一个值。

    2.3、批量更改数据

        如果需要一次性插入或更新多条记录,可以使用jdbcTemplate的batchUpdate方法

batchUpdate示例:

public static void addUsers(final List<User> users){
  final String sql = "insert into jf_user(user_name,user_pwd,user_age) values(?,?,?)";
  jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
   @Override
   public void setValues(PreparedStatement ps, int i) throws SQLException {
    // TODO Auto-generated method stub
    User user = users.get(i);
    ps.setString(1, user.getUsername());
    ps.setString(2, user.getUserpwd());
    ps.setString(3, user.getUserage());
   }
   
   @Override
   public int getBatchSize() {
    // TODO Auto-generated method stub
    return users.size();
   }
  });
 }

    2.4、查询数据

    2.4.1、使用RowCallbackHandler处理结果集

        Spring提供了org.springframework.jdbc.core.RowCallbackHandler回调接口,通过该接口可以定义如何从结果集中获取数据。

        RowCallbackHandler示例:

 
 public User getUserBySerialNo(final int serialNo){
  String sql = "SELECT serial_no,user_name,user_pwd,user_age FROM jf_user.jf_users WHERE serial_no = ?";
  final User user = new User();
  jdbcTemplate.query(sql, new Object[]{serialNo},new RowCallbackHandler() {
   
   @Override
   public void proce***ow(ResultSet rs) throws SQLException {
    user.setSerialNo(serialNo);
    user.setUsername(rs.getString("user_name"));
    user.setUserpwd(rs.getString("user_pwd"));
    user.setUserage(rs.getString("user_age"));
   }
  });
  return user;
 }
 
  
 public List<User> getUsers(final int fromSerialNo,final int toSerialNo){
  String sql = "SELECT serial_no,user_name,user_pwd,user_age FROM jf_user.jf_users WHERE serial_no between ? and ?";
  final List<User> users = new ArrayList<>();
  jdbcTemplate.query(sql, new Object[]{fromSerialNo,toSerialNo}, new RowCallbackHandler() {
   
   @Override
   public void proce***ow(ResultSet rs) throws SQLException {
    // TODO Auto-generated method stub
    User user = new User();
    user.setSerialNo(rs.getInt("serial_no"));
    user.setUsername(rs.getString("user_name"));
    user.setUserpwd(rs.getString("user_pwd"));
    user.setUserage(rs.getString("user_age"));
    users.add(user);
   }
  });
  return users;
 }

    2.4.2、使用RowMapper<T>处理结果集

        Spring也提供了一个和RowCallbackHandler功能类似的RowMapper<T>接口,它也可以使用RowMapper<T>定义结果集逻辑映射,在结果集为多行记录时,该接口更容易使用。

        RowMapper<T>代码示例

 
 public List<User> getUsersOnRowMapper(final int fromSerialNo,final int toSerialNo){
  String sql = "SELECT serial_no,user_name,user_pwd,user_age FROM jf_user.jf_users WHERE serial_no between ? and ?";
  return jdbcTemplate.query(sql, new Object[]{fromSerialNo,toSerialNo},new RowMapper<User>(){
   @Override
   public User mapRow(ResultSet rs, int rowNum) throws SQLException {
    // TODO Auto-generated method stub
    User user = new User();
    user.setSerialNo(rs.getInt("serial_no"));
    user.setUsername(rs.getString("user_name"));
    user.setUserpwd(rs.getString("user_pwd"));
    user.setUserage(rs.getString("user_age"));
    return user;
   }
  });
 }

    2.5、查询单值数据

        如果查询的结果集仅有一个值,如SELECT COUNT(*) FROM jf_users等,就可以使用更简单的方式获取结果的值。JdbcTemplate为获取结果集中的单值数据提供了3组方法,分别用于获取int、long的单值,其他类型的单值以Object类型返回

   2.6、调用存储过程

        JdbcTemplate提供了2个调用存储过程的接口方法:

<T> T execute(String callString,CallableStatementCallback<T> action);

<T> T execute(CallableStatementCreator csc,CallableStatementCallback<T> cs);

Spring JDBC 访问数据库

调用存储过程示例:

CREATE PROCEDURE P_GET_VIEW_POINT_NUM(IN in_serialNO,INT,OUT out_num INT)
BEGIN
    SELECT COUNT(*) INTO out_num FROM jf_user WHERE serialNO = in_serialNo;
END;
 
 public int getUserCounts(final int serailNo){
  String sql = "{call P_GET_VIEW_POINT_NUM(?,?)}";
  String execute = jdbcTemplate.execute(sql, new CallableStatementCallback() {
   @Override
   public Object doInCallableStatement(final CallableStatement cs) throws SQLException, DataAccessException {
    // TODO Auto-generated method stub
    cs.setInt(1, serailNo);
    cs.reGISterOutParameter(2, Types.INTEGER);
    cs.execute();
    return cs.getInt(2);
   }
  });
  return Integer.valueOf(execute);
 }
您可能感兴趣的文档:

--结束END--

本文标题: Spring JDBC 访问数据库

本文链接: https://www.lsjlt.com/news/42341.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JDBC怎么直接访问mysql数据库
    这篇文章主要介绍“JDBC怎么直接访问mysql数据库”,在日常操作中,相信很多人在JDBC怎么直接访问mysql数据库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JDBC...
    99+
    2024-04-02
  • jdbc怎么访问云服务器数据库
    要通过JDBC访问云服务器上的数据库,您需要以下步骤:1. 确保云服务器上已经安装并配置了数据库服务,比如MySQL、Oracle等...
    99+
    2023-09-27
    jdbc 云服务器 数据库
  • jdbc访问数据库的步骤是什么
    JDBC(Java Database Connectivity)是一种用于在Java应用程序中访问数据库的API。JDBC访问数据库...
    99+
    2023-08-11
    jdbc 数据库
  • jdbc连接池怎么实现数据库访问
    JDBC连接池是一种管理数据库连接的技术,它可以提供可用的数据库连接给应用程序使用,从而提高数据库访问的性能和效率。以下是实现JDB...
    99+
    2023-09-15
    jdbc 数据库
  • Java中怎么利用JDBC和DBCP访问数据库
    本篇文章为大家展示了Java中怎么利用JDBC和DBCP访问数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JDBC:Connection conn&...
    99+
    2024-04-02
  • jdbc访问数据库类的操作步骤是什么
    这篇文章给大家介绍jdbc访问数据库类的操作步骤是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。String driver="com.micsoft.sqlserver.jdbc.sqlserverDri...
    99+
    2023-06-03
  • Spring数据库访问之ORM的示例分析
    这篇文章主要介绍Spring数据库访问之ORM的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Spring数据库访问中另外一大模块就是ORM,ORM即对象/关系映射。Spring支持大多数ORM框架,比如Hi...
    99+
    2023-06-17
  • Spring Boot使用MyBatis如何实现访问数据库
    今天就跟大家聊聊有关Spring Boot使用MyBatis如何实现访问数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基于spring boot开发的微服务应用,与MyBati...
    99+
    2023-05-31
    springboot 数据库 mybatis
  • Spring boot基于JPA访问MySQL数据库的实现
    本文展示如何通过JPA访问MySQL数据库。 JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Jav...
    99+
    2024-04-02
  • Spring如何连接数据库以及JDBC模板
    这篇文章将为大家详细讲解有关Spring如何连接数据库以及JDBC模板,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、创建工程、导包要想使用Spring的jdbc模板前,还需要导入相关的jar包:二、进...
    99+
    2023-05-31
    spring 数据库 jdbc
  • JDBC 连接数据库
    一、通过Driver接口直接连接 public Connection getConnectionByDriver() throws Exception{  ...
    99+
    2024-04-02
  • 怎么访问vps数据库
    要访问VPS数据库,您需要使用一个数据库管理工具,如MySQL Workbench或phpMyAdmin。以下是一些基本步骤:1. ...
    99+
    2023-08-20
    vps 数据库
  • Spring访问数据库异常的处理方法是什么
    Spring访问数据库异常的处理方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用JDBC API时,很多操作都要声明抛出java.sql.SQLExceptio...
    99+
    2023-06-17
  • Java Spring中怎么同时访问多种不同数据库
    这篇文章主要介绍“Java Spring中怎么同时访问多种不同数据库”,在日常操作中,相信很多人在Java Spring中怎么同时访问多种不同数据库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java Sp...
    99+
    2023-06-17
  • 定义数据模型&访问数据库
    定义数据模型一、Django定义数据模型在App中的models.py文件,数据库的表名称以类的形式来定义:[root@133 web]# cd /opt/python/dja...
    99+
    2024-04-02
  • Java数据库连接(JDBC)
    JDBC(Java DataBase Connectivity) JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API全称:( Java DataBase Connectivi...
    99+
    2023-09-22
    数据库 java mysql
  • JDBC---Java连接数据库
    第一章 JDBC概述 1.1 JDBC概述 jdbc是(Java Database Connectivity)单词的缩写,翻译为java连接数据库。是Java程序连接数据库的技术总称。 JDBC由两个...
    99+
    2023-10-20
    java 数据库 mysql
  • Spring Data:与 Spring Boot 集成的无缝数据访问
    Spring Data 提供了一种用于简化数据访问的全面框架,它无缝集成到 Spring Boot 中,使开发人员能够轻松创建功能丰富且可扩展的后端应用程序。本文将探讨 Spring Data 与 Spring Boot 集成的优势以及使...
    99+
    2024-04-02
  • 外网如何访问数据库
    小编给大家分享一下外网如何访问数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 外网访问数据库的...
    99+
    2024-04-02
  • 使用 SpringBoot 访问 MySQL 数据库
    一、目标 创建一个 MySQL 数据库,构建一个 Spring 应用程序,并将其连接到新创建的数据库。 二、准备工作 最喜欢的文本编辑器或 IDE Java 17或更高版本 Gradle 7.5+或Maven 3.5+ 三、初始化项目 导...
    99+
    2023-08-17
    数据库 mysql spring boot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作