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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 本文目录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的方式,我觉着吭…

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
存储 Java 数据安全/隐私保护
|
3天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
10 1
|
2天前
|
消息中间件 开发框架 Java
什么是Spring Boot 自动配置?
Spring Boot 是一个流行的 Java 开发框架,它提供了许多便利的功能和工具,帮助开发者快速构建应用程序。其中一个最引人注目的特性是其强大的自动配置功能。
6 0
|
3天前
|
负载均衡 关系型数据库 MySQL
关系型数据库的安装和配置数据库节点
关系型数据库的安装和配置数据库节点
12 3
|
4天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
|
4天前
|
Java Spring
Spring文件配置以及获取
Spring文件配置以及获取
11 0
|
11天前
|
Java 微服务 Spring
Spring Boot中获取配置参数的几种方法
Spring Boot中获取配置参数的几种方法
21 2
|
13天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
20 1
|
14天前
|
运维 安全 数据管理
数据管理DMS产品使用合集之要在DMS中实现数据库工单发布时必须经过人工审核才能进入下一步,我该怎么配置
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
14天前
|
Java 开发者 Spring
Spring Boot中的资源文件属性配置
【4月更文挑战第28天】在Spring Boot应用程序中,配置文件是管理应用程序行为的重要组成部分。资源文件属性配置允许开发者在不重新编译代码的情况下,对应用程序进行灵活地配置和调整。本篇博客将介绍Spring Boot中资源文件属性配置的基本概念,并通过实际示例展示如何利用这一功能。
23 1