Spring之路(31)–使用NamedParameterJdbcTemplate完成数据库操作(JavaConfig配置)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 本文目录1. 背景2. 在配置类中配置数据源和namedParameterJdbcTemplate3. 实现数据库操作组件BlogDao4. 将BlogDao注册为bean5. 测试6. 总结

1. 背景

上一篇我们完成了JdbcTemplate下数据库增删改查操作的实例,其中相关bean的配置是通过xml和注解实现的。


JdbcTemplate是按占位符的位置传递参数,本篇我们演示下NamedParameterJdbcTemplate的使用,该类时使用名称传递参数的,比JdbcTemplate更加优雅。然后本篇我们使用JavaConfig来配置相关的bean,可以体会JavaConfig简洁且强大的特质。


2. 在配置类中配置数据源和namedParameterJdbcTemplate

我们在BeanConfig中通过JavaConfig方式配置数据源和namedParameterJdbcTemplate组件,代码如下:

package org.maoge.nameddemo;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration // 配置类
public class BeanConfig {
  // 配置数据源
  @Bean
  public DataSource dataSource() {
  DruidDataSource dataSource = new DruidDataSource();
  dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&characterEncoding=utf-8");
  dataSource.setUsername("root");
  dataSource.setPassword("XXX");
  return dataSource;
  }
  // 配置namedParameterJdbcTemplate组件
  @Bean
  public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
  NamedParameterJdbcTemplate template=new NamedParameterJdbcTemplate(dataSource());//注入dataSource
  return template;
  }
}




3. 实现数据库操作组件BlogDao

数据对象不用改变:

package org.maoge.nameddemo;
/**
 * @theme 数据对象--博客
 * @author maoge
 * @date 2020-01-27
 */
public class BlogDo {
  private Long id;
  private String title;
  private String author;
  private String content;
  // 省略get get
}



数据操作组件相比于JdbcTemplate有所变化,主要就是传参上从按位置传参改为按名称传参,具体如下,可以看出除了传参基本没有变化。另外注意我们并未在该类中使用注解,因为后续我们直接通过JavaConfig将其配置为bean。

package org.maoge.nameddemo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
/**
 * @theme DAO--博客
 * @author maoge
 * @date 2020-01-29
 */
public class BlogDao {
  public NamedParameterJdbcTemplate getNamedTemplate() {
  return namedTemplate;
  }
  public void setNamedTemplate(NamedParameterJdbcTemplate namedTemplate) {
  this.namedTemplate = namedTemplate;
  }
  private NamedParameterJdbcTemplate namedTemplate;
  /**
  * 新增
  */
  public void insert(BlogDo blog) {
  Map map = new HashMap<>();
  map.put("author", blog.getAuthor());
  map.put("content", blog.getContent());
  map.put("title", blog.getTitle());
  // 注意使用:xxx占位
  namedTemplate.update("insert into blog(author,content,title)values(:author,:content,:title)", map);
  }
  /**
  * 删除
  */
  public void delete(Long id) {
  Map map = new HashMap<>();
  map.put("id", id);
  namedTemplate.update("delete from blog where id =:id", map);
  }
  /**
  * 更新
  */
  public void update(BlogDo blog) {
  Map map = new HashMap<>();
  map.put("author", blog.getAuthor());
  map.put("content", blog.getContent());
  map.put("title", blog.getTitle());
  map.put("id", blog.getId());
  namedTemplate.update("update blog set author=:author,content=:content,title=:title where id=:id", map);
  }
  /**
  * 按id查询
  */
  public BlogDo getById(Long id) {
  Map map = new HashMap<>();
  map.put("id", id);
  return namedTemplate.queryForObject("select * from blog where id=:id", map, new RowMapper() {
    @Override
    public BlogDo mapRow(ResultSet rs, int rowNum) throws SQLException {
    BlogDo blog = new BlogDo();
    blog.setAuthor(rs.getString("author"));
    blog.setContent(rs.getString("content"));
    blog.setId(rs.getLong("id"));
    blog.setTitle(rs.getString("title"));
    return blog;
    }
  });
  }
  /**
  * 查询列表
  */
  public List getList() {
  return namedTemplate.query("select * from blog", new RowMapper() {
    @Override
    public BlogDo mapRow(ResultSet rs, int rowNum) throws SQLException {
    BlogDo blog = new BlogDo();
    blog.setAuthor(rs.getString("author"));
    blog.setContent(rs.getString("content"));
    blog.setId(rs.getLong("id"));
    blog.setTitle(rs.getString("title"));
    return blog;
    }
  });
  }
}



//


4. 将BlogDao注册为bean

此处通过JavaConfig将BlogDao注册为bean,同时将namedParameterJdbcTemplate注入,修改后代码如下:

package org.maoge.nameddemo;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration // 配置类
public class BeanConfig {
  // 配置数据源
  @Bean
  public DataSource dataSource() {
  DruidDataSource dataSource = new DruidDataSource();
  dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&characterEncoding=utf-8");
  dataSource.setUsername("root");
  dataSource.setPassword("Easy@0122");
  return dataSource;
  }
  // 配置namedParameterJdbcTemplate组件
  @Bean
  public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
  NamedParameterJdbcTemplate template=new NamedParameterJdbcTemplate(dataSource());//注入dataSource
  return template;
  }
  //为BlogDao注册bean
  @Bean
  public BlogDao blogDao() {
  BlogDao blogDao=new BlogDao();
  blogDao.setNamedTemplate(namedParameterJdbcTemplate());//注入namedParameterJdbcTemplate
  return blogDao;
  }
}



5. 测试

除了构建容器的类不一样,其他部分都一样:

package org.maoge.nameddemo;
import java.sql.SQLException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
  public static void main(String[] args) throws SQLException {
  // 获取容器
  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class);
  // 获取blogDao组件
  BlogDao blogDao = context.getBean("blogDao", BlogDao.class);
  BlogDo blog = new BlogDo();
  blog.setAuthor("猫哥");
  blog.setTitle("测试博客");
  blog.setContent("非常完美吭");
  // 测试插入
  blogDao.insert(blog);
  // 测试获取1个
  System.out.println(blogDao.getById(2L));
  // 测试获取列表
  System.out.println(blogDao.getList().size());
  blog.setId(3L);
  blog.setContent("非常完美吭XX");
  // 修改
  blogDao.update(blog);
  // 删除
  blogDao.delete(4L);
  }
}



6. 总结

NamedParameterJdbcTemplate是比JdbcTemplate更好的操作数据库的方式。


JavaConfig应该是比xml和注解更好的配置bean的方式,我觉着吭…

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
22天前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
208 93
|
1月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
28天前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
29天前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
3月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
621 0
|
22天前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
225 7
|
22天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
232 4
|
1月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
2月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
732 10
|
3月前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。