详解spring与jdbc整合操作

详解spring与jdbc整合操作

1. Spring JDBC介绍

Spring JDBC是spring框架中最重要的部分之一,提供了一组用于执行SQL操作和访问关系型数据库的类和接口。

Spring JDBC提供的主要API为JdbcTemplate和NamedParameterJdbcTemplate,以及支持Transaction(事务)和DAO(数据访问)的抽象。

2. 整合操作

整合Spring JDBC时,需要在项目中引入Spring JDBC的相关依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework.version}</version>
</dependency>

3. 配置数据源

可以使用Spring框架中的DataSource来管理数据源,DataSource可以通过JNDI、连接池对象以及简单的驱动管理器来实现。使用Spring框架中的JdbcTemplate来执行SQL语句。

在Spring框架中配置数据源时,可以使用JNDI,也可以使用Spring框架中的DataSource直接配置数据库连接信息。

以下是通过DataSource来配置操作MySQL数据库的示例:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/testdb" />
    <property name="username" value="root" />
    <property name="password" value="123456" />
</bean>

4. 编写DAO

DAO是数据访问层的抽象,它通常被设计成一个接口,定义了对数据的CRUD操作。Spring JDBC提供了JdbcDaoSupport和NamedParameterJdbcDaoSupport两个类,可以用它们来简化DAO的实现。

4.1 JdbcTemplate的使用

以下是使用JdbcTemplate实现的一个DAO示例:

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private DataSource dataSource;

    private JdbcTemplate jdbcTemplate;

    @PostConstruct
    private void initialize() {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public User findUserById(int userId) {
        String sql = "SELECT * FROM user WHERE user_id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userId}, new UserMapper());
    }

    @Override
    public List<User> findAllUsers() {
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new UserMapper());
    }

    @Override
    public void addUser(User user) {
        String sql = "INSERT INTO user (user_id, user_name, user_email) values (?, ?, ?)";
        jdbcTemplate.update(sql, user.getUserId(), user.getUserName(), user.getUserEmail());
    }

    @Override
    public void updateUser(User user) {
        String sql = "UPDATE user SET user_name = ?, user_email = ? WHERE user_id = ?";
        jdbcTemplate.update(sql, user.getUserName(), user.getUserEmail(), user.getUserId());
    }

    @Override
    public void deleteUser(int userId) {
        String sql = "DELETE FROM user WHERE user_id = ?";
        jdbcTemplate.update(sql, userId);
    }

    private static final class UserMapper implements RowMapper<User> {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setUserId(rs.getInt("user_id"));
            user.setUserName(rs.getString("user_name"));
            user.setUserEmail(rs.getString("user_email"));
            return user;
        }
    }
}

可以看出,JdbcTemplate提供了简洁而且易于使用的Sql操作方法,它的update()方法和query()方法可以简化操作MySQL的门槛。

4.2 NamedParameterJdbcTemplate的使用

以下是使用NamedParameterJdbcTemplate实现的一个DAO示例:

@Repository
public class UserDaoImpl implements UserDao {
    @Autowired
    private DataSource dataSource;

    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @PostConstruct
    private void initialize() {
        namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    }

    @Override
    public User findUserById(int userId) {
        String sql = "SELECT * FROM user WHERE user_id = :userId";
        SqlParameterSource namedParameters = new MapSqlParameterSource("userId", userId);
        return namedParameterJdbcTemplate.queryForObject(sql, namedParameters, new UserMapper());
    }

    @Override
    public List<User> findAllUsers() {
        String sql = "SELECT * FROM user";
        return namedParameterJdbcTemplate.query(sql, new UserMapper());
    }

    @Override
    public void addUser(User user) {
        String sql = "INSERT INTO user (user_id, user_name, user_email) values (:userId, :userName, :userEmail)";
        SqlParameterSource namedParameters = new MapSqlParameterSource()
                .addValue("userId", user.getUserId())
                .addValue("userName", user.getUserName())
                .addValue("userEmail", user.getUserEmail());
        namedParameterJdbcTemplate.update(sql, namedParameters);
    }

    @Override
    public void updateUser(User user) {
        String sql = "UPDATE user SET user_name = :userName, user_email = :userEmail WHERE user_id = :userId";
        SqlParameterSource namedParameters = new MapSqlParameterSource()
                .addValue("userName", user.getUserName())
                .addValue("userEmail", user.getUserEmail())
                .addValue("userId", user.getUserId());
        namedParameterJdbcTemplate.update(sql, namedParameters);
    }

    @Override
    public void deleteUser(int userId) {
        String sql = "DELETE FROM user WHERE user_id = :userId";
        SqlParameterSource namedParameters = new MapSqlParameterSource("userId", userId);
        namedParameterJdbcTemplate.update(sql, namedParameters);
    }

    private static final class UserMapper implements RowMapper<User> {
        @Override
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setUserId(rs.getInt("user_id"));
            user.setUserName(rs.getString("user_name"));
            user.setUserEmail(rs.getString("user_email"));
            return user;
        }
    }
}

NamedParameterJdbcTemplate提供了比JdbcTemplate更简洁和易于调试的Sql操作方法,它的SqlParameterSource接口能够实现Map或JavaBean的参数绑定。

5. 总结

在本文中,详细介绍了Spring JDBC的基本概念和使用方法,通过整合Spring JDBC和MySQL数据库,演示了使用JdbcTemplate和NamedParameterJdbcTemplate实现的DAO示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解spring与jdbc整合操作 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解SpringMVC中的异常处理机制

    详解SpringMVC中的异常处理机制 在SpringMVC中,异常处理是一个非常重要的话题。在Web应用程序中,异常是不可避免的,因此我们需要一种机制来处理它们。本文将详细讲解SpringMVC中的异常处理机制,包括如何定义异常处理器、如何处理异常、如何返回异常信息等。 定义异常处理器 在SpringMVC中,我们可以使用@ControllerAdvice…

    Java 2023年5月18日
    00
  • Hibernate连接三种数据库的配置文件

    下面是针对Hibernate连接三种数据库的配置文件的完整攻略,包括MySQL、Oracle和SQL Server。本攻略为你提供了每种数据库的示例代码。 准备工作 在开始配置之前,需要先准备好以下工具和环境: 工具: Hibernate, JDBC 驱动程序 环境: Java, 数据库,数据库服务器 MySQL 配置文件 这是一个连接MySQL数据库的Hi…

    Java 2023年5月20日
    00
  • Java创建多线程服务器流程

    创建多线程服务器是Java网络编程的重要部分,具有很高的实用价值。以下是实现Java创建多线程服务器的完整攻略。 过程 第一步:创建ServerSocket对象 ServerSocket类是Java语言提供的Socket接口,用于管理服务器端的网络地址和端口号等信息。创建ServerSocket对象的代码如下: ServerSocket server = n…

    Java 2023年5月26日
    00
  • maven多个仓库查询的优先级顺序案例讲解

    针对“maven多个仓库查询的优先级顺序案例讲解”这个主题,我将以以下方式进行讲解: 一、背景介绍 在使用maven进行依赖管理时,我们常常需要配置多个仓库。而当我们进行依赖查询时,maven也会按照一定的优先级顺序去依次查询这些仓库中是否存在对应的依赖。那么,maven多个仓库查询的优先级顺序是怎样的呢?本文将针对这一问题进行详细解析。 二、查询顺序 ma…

    Java 2023年5月20日
    00
  • 使用java一维数组模拟压栈弹栈

    使用Java一维数组模拟压栈弹栈攻略 前提 在模拟压栈弹栈之前,我们需要了解以下概念: 栈(Stack):后进先出的数据结构,只有一个入口和出口。 压栈(push):将一个元素存入栈中。 弹栈(pop):将栈中最后一个元素取出,栈的长度减一。 使用一维数组模拟栈 Java中通过一维数组就可以很容易地模拟一个栈的操作。 假设我们要实现一个固定长度为10的栈,我…

    Java 2023年5月29日
    00
  • 解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法

    下面我来详细讲解“解决Asp.net Mvc返回JsonResult中DateTime类型数据格式问题的方法”的完整攻略。 问题概述 在使用Asp.net Mvc框架返回JsonResult时,我们经常会遇到DateTime类型的数据无法正确序列化的问题。原因在于Json序列化默认使用了UTC时间,而DateTime类型的数据默认是本机时间。为了解决这个问题…

    Java 2023年5月26日
    00
  • 通过实例了解如何在JavaWeb实现文件下载

    让我来为您详细讲解如何在JavaWeb实现文件下载的完整攻略。 通过实例了解如何在JavaWeb实现文件下载 在JavaWeb中实现文件下载有多种方式,下面我们就分别来介绍一下。 方式一:使用Servlet实现文件下载 实现步骤: 1.在web.xml中配置一个Servlet,用于处理文件下载请求 <servlet> <servlet-na…

    Java 2023年5月19日
    00
  • Java基于IDEA实现qq邮件发送小程序

    下面是”Java基于IDEA实现qq邮件发送小程序”的完整攻略: 一、前期准备 下载安装Java SE Development Kit(JDK),安装完成后配置环境变量,以便于在命令行中能够识别Java命令。 下载安装IDEA(IntelliJ IDEA)集成开发环境。IDEA是一款由JetBrains开发的Java集成开发环境,具有强大的功能,可以大大提高…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部