手记

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

背景

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

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

在配置类中配置数据源和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;
	}
}

实现数据库操作组件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<String, Object> 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<String, Object> map = new HashMap<>();
		map.put("id", id);
		namedTemplate.update("delete from blog where id =:id", map);
	}

	/**
	 * 更新
	 */
	public void update(BlogDo blog) {
		Map<String, Object> 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<String, Object> map = new HashMap<>();
		map.put("id", id);
		return namedTemplate.queryForObject("select * from blog where id=:id", map, new RowMapper<BlogDo>() {
			@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<BlogDo> getList() {
		return namedTemplate.query("select * from blog", new RowMapper<BlogDo>() {
			@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;
			}
		});
	}

}

将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;
	}
}

测试

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

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);
	}
}

总结

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

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

0人推荐
随时随地看视频
慕课网APP