spring——Spring JdbcTemplate(转载)

迷南。 2023-09-29 11:41 77阅读 0赞

我们知道,JDBC 是 Java 提供的一种用于执行 SQL 语句的 API,可以对多种关系型数据库(例如 MySQL、Oracle 等)进行访问。
但在实际的企业级应用开发中,却很少有人直接使用原生的 JDBC API 进行开发,这是因为使用 JDBC API 对数据库进行操作十分繁琐,需要我们对每一步都做到“步步把控,处处关心”,例如我们需要手动控制数据库连接的开启,异常处理、事务处理、最后还要手动关闭连接释放资源等等。
Spring 提供了一个 Spring JDBC 模块,它对 JDBC API 进行了封装,其的主要目的降低 JDBC API 的使用难度,以一种更直接、更简洁的方式使用 JDBC API。
使用 Spring JDBC,开发人员只需要定义必要的参数、指定需要执行的 SQL 语句,即可轻松的进行 JDBC 编程,对数据库进行访问。
至于驱动的加载、数据库连接的开启与关闭、SQL 语句的创建与执行、异常处理以及事务处理等繁杂乏味的工作,则都是由 Spring JDBC 完成的。这样就可以使开发人员从繁琐的 JDBC API 中解脱出来,有更多的精力专注于业务的开发。
Spring JDBC 提供了多个实用的数据库访问工具,以简化 JDBC 的开发,其中使用最多就是 JdbcTemplate。

JdbcTemplate

JdbcTemplate 是 Spring JDBC 核心包(core)中的核心类,它可以通过配置文件、注解、Java 配置类等形式获取数据库的相关信息,实现了对 JDBC 开发过程中的驱动加载、连接的开启和关闭、SQL 语句的创建与执行、异常处理、事务处理、数据类型转换等操作的封装。我们只要对其传入SQL 语句和必要的参数即可轻松进行 JDBC 编程。
JdbcTemplate 的全限定命名为 org.springframework.jdbc.core.JdbcTemplate,它提供了大量的查询和更新数据库的方法,如下表所示。



































方法 说明
public int update(String sql) 用于执行新增、更新、删除等语句;

  • sql:需要执行的 SQL 语句;

  • args 表示需要传入到 SQL 语句中的参数。

public int update(String sql,Object… args)
public void execute(String sql) 可以执行任意 SQL,一般用于执行 DDL 语句;

  • sql:需要执行的 SQL 语句;

  • action 表示执行完 SQL 语句后,要调用的函数。

public T execute(String sql, PreparedStatementCallback action)
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object… args) 
用于执行查询语句;

  • sql:需要执行的 SQL 语句;

  • rowMapper:用于确定返回的集合(List)的类型;

  • args:表示需要传入到 SQL 语句的参数。

public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object… args)
public int[] batchUpdate(String sql, List<Object[]> batchArgs, final int[] argTypes)  用于批量执行新增、更新、删除等语句;

  • sql:需要执行的 SQL 语句;

  • argTypes:需要注入的 SQL 参数的 JDBC 类型;

  • batchArgs:表示需要传入到 SQL 语句的参数。

#

#

示例 1

e7e68381a0a5ffa75c820a89a60dfc6a.png

1c4db184c761942c88ec8d8f32c540dd.png

  1. 在 src 目录下创建一个 XML 配置文件 Beans.xml,配置内容如下。

0f9e5b7b2e6b2b95325bde437be2c1b9.png

在以上配置中,我们共定义了两个 Bean,

  • dataSource 为数据库连接池对象的 Bean。
  • jdbcTemplate 则为 JdbcTemplate 的 Bean,它由一个名为 datasSource 的属性。

Spring 默认使用 DriverManagerDataSource 对数据库连接池进行管理,我们可以在 Spring 的 XML 配置文件中定义 DriverManagerDataSource 的 Bean,并注入到 JdbcTempate 的 Bean 中。
在 dataSource 中,定义了 4 个连接数据库的属性,如下表所示。


























属性名 说明
driverClassName 所使用的驱动名称,对应驱动 JAR 包中的 Driver 类
url 数据源所在地址
username 访问数据库的用户名
password 访问数据库的密码

上表中的属性值需要根据数据库类型或者机器配置的不同进行相应设置。如果数据库类型不同,则需要更改驱动名称;如果数据库不在本地,则需要将 localhost 替换成相应的主机 IP。

  1. 在 net.biancheng.c.entity 包下,创建名为 User 的实体类,代码如下。

    package net.biancheng.c.entity;

    public class User {

    1. private Integer userId;
    2. private String userName;
    3. private String status;
    4. public Integer getUserId() {
    5. return userId;
    6. }
    7. public void setUserId(Integer userId) {
    8. this.userId = userId;
    9. }
    10. public String getUserName() {
    11. return userName;
    12. }
    13. public void setUserName(String userName) {
    14. this.userName = userName;
    15. }
    16. public String getStatus() {
    17. return status;
    18. }
    19. public void setStatus(String status) {
    20. this.status = status;
    21. }
    22. @Override
    23. public String toString() {
    24. return "User{" +
    25. "userId=" + userId +
    26. ", userName='" + userName + '\'' +
    27. ", status='" + status + '\'' +
    28. '}';
    29. }

    }

  2. 在 net.biancheng.c.dao 包下,创建一个名为 UserDao 的 Dao 接口,代码如下。

    package net.biancheng.c.dao;

    import net.biancheng.c.entity.User;

    import java.util.List;

    public interface UserDao {

    1. /**
    2. * 新增一条用户
    3. *
    4. * @param user
    5. * @return
    6. */
    7. int addUer(User user);
    8. /**
    9. * 更新指定的用户信息
    10. *
    11. * @param user
    12. * @return
    13. */
    14. int update(User user);
    15. /**
    16. * 删除指定的用户信息
    17. *
    18. * @param user
    19. * @return
    20. */
    21. int delete(User user);
    22. /**
    23. * 统计用户个数
    24. *
    25. * @param user
    26. * @return
    27. */
    28. int count(User user);
    29. /**
    30. * 查询用户列表
    31. *
    32. * @param user
    33. * @return
    34. */
    35. List<User> getList(User user);
    36. /**
    37. * 查询单个用户信息
    38. *
    39. * @param user
    40. * @return
    41. */
    42. User getUser(User user);
    43. /**
    44. * 批量增加用户
    45. *
    46. * @param batchArgs
    47. */
    48. void batchAddUser(List<Object[]> batchArgs);

    }

  3. 在 net.biancheng.c.dao.impl 包下,创建 UserDao 的实现类 UserDaoImpl,代码如下。

    package net.biancheng.c.dao.impl;

    import net.biancheng.c.dao.UserDao;
    import net.biancheng.c.entity.User;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
    import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
    import org.springframework.jdbc.core.namedparam.SqlParameterSource;
    import org.springframework.stereotype.Repository;

    import javax.annotation.Resource;
    import java.util.List;

    @Repository
    public class UserDaoImpl implements UserDao {

    1. @Resource
    2. private JdbcTemplate jdbcTemplate;
    3. @Resource
    4. private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
    5. @Override
    6. public int addUer(User user) {
    7. String sql = "INSERT into `user` (`user`.user_name,`user`.`status`) VALUES(?,?);";
    8. int update = jdbcTemplate.update(sql, user.getUserName(), user.getStatus());
    9. return update;
    10. }
    11. @Override
    12. public int update(User user) {
    13. String sql = "UPDATE `user` SET status=? WHERE user_name=?;";
    14. return jdbcTemplate.update(sql, user.getStatus(), user.getUserName());
    15. }
    16. @Override
    17. public int delete(User user) {
    18. String sql = "DELETE FROM `user` where user_name=?;";
    19. return jdbcTemplate.update(sql, user.getUserName());
    20. }
    21. @Override
    22. public int count(User user) {
    23. String sql = "SELECT COUNT(*) FROM `user` where `status`=?;";
    24. return jdbcTemplate.queryForObject(sql, Integer.class, user.getStatus());
    25. }
  1. @Override
  2. public List<User> getList(User user) {
  3. String sql = "SELECT * FROM `user` where `status`=?;";
  4. return jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class), user.getStatus());
  5. }
  6. @Override
  7. public User getUser(User user) {
  8. String sql = "SELECT * FROM `user` where `user_id`=?;";
  9. return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), user.getUserId());
  10. }
  11. @Override
  12. public void batchAddUser(List<Object[]> batchArgs) {
  13. String sql = "INSERT into `user` (`user`.user_name,`user`.`status`) VALUES(?,?);";
  14. jdbcTemplate.batchUpdate(sql, batchArgs);
  15. }
  16. }
  1. 在 net.biancheng.c.service 包下,创建一个名为 UserService 的 Service 接口,代码如下。

    package net.biancheng.c.service;

    import net.biancheng.c.entity.User;

    import java.util.List;

    public interface UserService {

    1. /**
    2. * 新增用户数据
    3. *
    4. * @param user
    5. * @return
    6. */
    7. public int addUser(User user);
    8. /**
    9. * 更新用户数据
    10. *
    11. * @param user
    12. * @return
    13. */
    14. public int updateUser(User user);
    15. /**
    16. * 删除用户数据
    17. *
    18. * @param user
    19. * @return
    20. */
    21. public int deleteUser(User user);
    22. /**
    23. * 统计用户数量
    24. *
    25. * @param user
    26. * @return
    27. */
    28. public int countUser(User user);
    29. /**
    30. * 查询用户数据
    31. *
    32. * @param user
    33. * @return
    34. */
    35. public List<User> getUserList(User user);
    36. /**
    37. * 查询单个用户信息
    38. *
    39. * @param user
    40. * @return
    41. */
    42. public User getUser(User user);
    43. /**
    44. * 批量添加用户
    45. *
    46. * @param batchArgs
    47. */
    48. public void batchAddUser(List<Object[]> batchArgs);

    }

  2. 在 net.biancheng.c.service.impl 包下,创建 UserService 的实现类 UserServiceImpl,代码如下。

    package net.biancheng.c.service.impl;

    import net.biancheng.c.dao.UserDao;
    import net.biancheng.c.entity.User;
    import net.biancheng.c.service.UserService;
    import org.springframework.stereotype.Service;

    import javax.annotation.Resource;
    import java.util.List;

    @Service(“userService”)
    public class UserServiceImpl implements UserService {

    1. @Resource
    2. private UserDao userDao;
    3. @Override
    4. public int addUser(User user) {
    5. return userDao.addUer(user);
    6. }
    7. @Override
    8. public int updateUser(User user) {
    9. return userDao.update(user);
    10. }
    11. @Override
    12. public int deleteUser(User user) {
    13. return userDao.delete(user);
    14. }
    15. @Override
    16. public int countUser(User user) {
    17. return userDao.count(user);
    18. }
    19. @Override
    20. public List<User> getUserList(User user) {
    21. return userDao.getList(user);
    22. }
    23. @Override
    24. public User getUser(User user) {
    25. return userDao.getUser(user);
    26. }
    27. @Override
    28. public void batchAddUser(List<Object[]> batchArgs) {
    29. userDao.batchAddUser(batchArgs);
    30. }
    31. @Override
    32. public int countOfUserByName(User user) {
    33. return userDao.countOfUserByName(user);
    34. }
    35. @Override
    36. public User getUserByUserId(User user) {
    37. return userDao.getUserByUserId(user);
    38. }

    }

  3. 在 net.biancheng.c 包下,创建一个名为 MainApp 的类,代码如下。

    package net.biancheng.c;

    import net.biancheng.c.entity.User;
    import net.biancheng.c.service.UserService;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import java.util.ArrayList;
    import java.util.List;

  1. public class MainApp {
  2. public static void main(String[] args) {
  3. ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml");
  4. UserService userService = context2.getBean("userService", UserService.class);
  5. User user = new User();
  6. user.setUserName("小张");
  7. user.setStatus("离线线");
  8. //新增一个用户
  9. int i = userService.addUser(user);
  10. System.out.println("新增用户成功!");
  11. User user1 = new User();
  12. user1.setUserName("小张");
  13. user1.setStatus("在线");
  14. int u = userService.updateUser(user1);
  15. System.out.println("修改用户成功");
  16. List<Object[]> batchArgs = new ArrayList<>();
  17. Object[] o1 = {"小明", "在线"};
  18. Object[] o2 = {"小龙", "离线"};
  19. Object[] o3 = {"小林", "在线"};
  20. Object[] o4 = {"小李", "在线"};
  21. batchArgs.add(o1);
  22. batchArgs.add(o2);
  23. batchArgs.add(o3);
  24. batchArgs.add(o4);
  25. userService.batchAddUser(batchArgs);
  26. System.out.println("批量增加完毕");
  27. User user2 = new User();
  28. user2.setStatus("在线");
  29. int i1 = userService.countUser(user2);
  30. System.out.println("在线用户的个数为:" + i1);
  31. List<User> userList = userService.getUserList(user2);
  32. System.out.println("在线用户列表查询成功!");
  33. for (User user4 : userList) {
  34. System.out.println("用户 ID:" + user4.getUserId() + ",用户名:" + user4.getUserName() + ",状态:" + user4.getStatus());
  35. }
  36. }
  37. }

cadb4f3f30707586c87d1f5788f58486.png

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JdbcTemplate

    目录 1、简介 2、开发步骤 2.1、导入坐标 2.2、创建表和类 2.3、创建JdbcTemplate对象 2.4、执行数据库操作 3、解耦 4、增删改查

    相关 Jdbctemplate

    一、介绍 Jdbc是一个Java的一个接口(API),主要作用是连接Java语言和数据库。 常规的使用jdbc连接数据库的流程为:加载驱动-建立数据库连接-查询或操作

    相关 JdbcTemplate

    JdbcTemplate: 概述 ​ 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。 作为Spring

    相关 JdbcTemplate

    JdbcTemplate > Spring为传统的jdbc API进行封装,简化持久层操作,虽然jdbcTemplate很灵活,但和ORM框架相比jdbcTemplate