背景
上一篇我们完成了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的方式,我觉着吭…