1. 9IM首页
  2. 热点

Spring大神之路(28)–使用JdbcTemplate完成数据库操作(xml+注解配置)

背景

上一篇讲述了数据源DataSource,本篇使用的JdbcTemplate完成对数据库增删改查操作,话不多少,开整…

创建spring.xml

创建spring.xml,这个没啥好说的,注意开启对包的扫描,以便于后续自动注册包内定义的bean:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-4.0.xsd
         http://www.springframework.org/schema/mvc
         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
	<context:component-scan
		base-package="org.maoge.jdbctemplatedemo" />
</beans>

配置数据源

在xml配置数据源,上一篇我们使用JavaConfig配置了数据源,使用xml就是形式不一样,直接翻译过来就行。

    <!-- 数据源 -->
	<bean id="dataSource"
		class="com.alibaba.druid.pool.DruidDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver"></property>
		<!-- 注意xml中使用&替代& -->
		<property name="url"
			value="jdbc:mysql://127.0.0.1:3306/myblog?useUnicode=true&characterEncoding=utf-8"></property>
		<property name="username" value="root"></property>
		<property name="password" value="XXX"></property>
	</bean>

配置jdbcTemplate组件,并注入dataSource

同样使用xml配置jdbcTemplate,显示指定注入dataSource。

	<!--注册jdbcTemplate组件 -->
	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

定义数据对象

此处我们还是对博客blog表进行操作,所以定义BlogDo数据对象。

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

实现数据库操作组件

此处常规操作是先定义一个接口,然后将实现接口的类注册为bean,我个人是感觉没啥意义,咱们直接实现数据库操作组件。

一般对数据库进行操作对象称为DAO,此处我们也按这个命名来实现:

package org.maoge.jdbctemplatedemo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

/**
 * @theme DAO--博客
 * @author maoge
 * @date 2020-01-29
 */
@Repository // 注册为组件(此处也可以使用@Component)
public class BlogDao {
	@Autowired // 自动注入xml中定义的jdbcTemplate
	private JdbcTemplate jdbcTemplate;

	/**
	 * 新增
	 */
	public void insert(BlogDo blog) {
		jdbcTemplate.update("insert into blog(author,content,title)values(?,?,?)", blog.getAuthor(), blog.getContent(),
				blog.getTitle());
	}

	/**
	 * 删除
	 */
	public void delete(Long id) {
		jdbcTemplate.update("delete from blog where id =?", id);
	}

	/**
	 * 更新
	 */
	public void update(BlogDo blog) {
		jdbcTemplate.update("update blog set author=?,content=?,title=? where id=?", blog.getAuthor(),
				blog.getContent(), blog.getTitle(), blog.getId());
	}

	/**
	 * 按id查询
	 */
	public BlogDo getById(Long id) {
		return jdbcTemplate.queryForObject("select * from blog where id=?", 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;
			}

		}, id);
	}

	/**
	 * 查询列表
	 */
	public List<BlogDo> getList() {
		return jdbcTemplate.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;
			}
		});
	}
}

可以看到,除了最后两个查询方法稍微有点不好理解,其他的都简单了。最后两个用到了匿名类相关知识,可以去了解下,当然就算不了解直接写类似的代码也是可以的,已经足够简单了。

bean分析

注意本文其实我们使用xml定义了dataSource、jdbcTemplate两个bean,而BlogDao是使用注解定义的。为何不都使用注解或都使用注解呢?

因为dataSource和jdbcTemplate是Spring定义好的类,我们没法在上面添加注解了。所以可以使用xml注册它或者使用JavaConfig。

而BlogDao我们既可以使用注解,也可以使用xml注册它,由于直接代码量更少,所以此处为了简单就使用了注解。

测试

我们获取容器中的BlogDao组件,然后调用其方法进行测试即可,测试代码如下:

package org.maoge.jdbctemplatedemo;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
	public static void main(String[] args) {
		// 获取容器
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				"/org/maoge/jdbctemplatedemo/spring.xml");
		// 获取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);
	}
}

总结

使用JdbcTemplate之后,确实将重复的模板代码基本都消灭了,我们可以关心真正的业务逻辑。

原创文章,作者:9IM,如若转载,请注明出处:https://www.9im.cn/1157.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注