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的方式,我觉着吭…