详解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日

相关文章

  • java 使用readLine() 乱码的解决

    Java中的readLine()方法是读取文件或者从标准输入流中读取数据的常用方法之一,在读取中文字符时有可能出现乱码的问题,下面讲解如何使用Java来解决readLine()乱码的问题。 问题描述 在Java中使用readLine()方法读取文件或者从标准输入流中读取数据时,如果输入的数据中含有中文字符,使用String类型读取的时候常常出现乱码的问题。 …

    Java 2023年5月20日
    00
  • Java找不到或无法加载主类及编码错误问题的解决方案

    以下是关于“Java找不到或无法加载主类及编码错误问题的解决方案”的完整攻略: 什么是“Java找不到或无法加载主类及编码错误问题”? 在Java程序中可能会出现“找不到或无法加载主类”错误和“编码错误”的问题。这类问题一般出现在程序运行时,这个错误会导致程序无法正常运行,需要进行相应的修复。 造成问题的原因 主类文件位置不正确或文件名拼写错误 classp…

    Java 2023年5月20日
    00
  • Spring Security权限控制的实现接口

    Spring Security 是一个强大的安全框架,提供了多种方式来保证应用程序的安全性。其中最重要的就是权限控制,这也是 Spring Security 最常用的功能。 Spring Security 权限控制基于接口进行实现,主要有以下几个接口: UserDetailsService 接口:该接口用于查询用户信息,包括用户名、密码、权限等。实现该接口一…

    Java 2023年5月20日
    00
  • java易懂易用的MD5加密(可直接运行) (1)第2/2页

    下面是本文的完整攻略,包括概述、使用方法、代码解析和示例等: 概述 本文是介绍如何使用Java实现MD5加密的文章,所实现的MD5算法具有以下特点: 易懂易用:算法基于JDK自带的MessageDigest类,并使用了一些最新的Java 8语法来简化代码,保证了代码的易懂易用性。 可直接运行:作者提供了一份完整可运行的代码,用户只需复制该代码到Java项目中…

    Java 2023年5月20日
    00
  • Java复制文件常用的三种方法

    当需要将一个文件复制到另一个地方时,Java中有许多方法可以复制文件。接下来我将讲解Java中复制文件的常用三种方法。 方法一: 使用Java IO的流来复制文件 最传统的方法是使用Java IO的流来复制文件。此方法使用基本的文件输入/输出流,将源文件作为输入流,将目标文件作为输出流进行复制。 public static boolean copyFileU…

    Java 2023年5月20日
    00
  • 出现java.lang.NoSuchMethodException异常的解决(靠谱)

    针对这个问题,以下是针对java.lang.NoSuchMethodException异常出现的完整攻略: 1. 异常原因分析 在程序运行过程中,如果出现java.lang.NoSuchMethodException异常,通常是因为程序调用了不存在的方法而导致的。具体分析原因可以按照以下步骤进行: 确认方法是否存在 确认方法的参数类型和顺序是否正确 确认调用…

    Java 2023年5月27日
    00
  • Java实现Json字符串与Object对象相互转换的方式总结

    下面是 “Java实现Json字符串与Object对象相互转换的方式总结”的完整攻略。 简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人们阅读和编写。在Java语言中,我们有多种方式去实现Json字符串与Object对象相互转换。下面我们介绍其中几种常用方式。 方案 方案一:使用Jackson库实现J…

    Java 2023年5月26日
    00
  • 详解Java的Hibernate框架中的List映射表与Bag映射

    详解Java的Hibernate框架中的List映射表与Bag映射 Hibernate是一个流行的ORM(对象关系映射)框架,它为Java开发人员提供了一个方便的方式来与关系型数据库交互。Hibernate框架支持多种映射方式,本文将详细讲解Hibernate框架中的List映射表与Bag映射。 List映射表 List映射表允许我们在Java对象中关联多个…

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