一. BookDao
在BookDao中,我们需要实现的方法如下:
package io.zhangjia.dao; import io.zhangjia.entity.Book; import java.sql.SQLException; import java.util.List; public interface BookDao { int doInsert(Book book) throws SQLException; int doDelete(Integer bookId); int doUpdate(Book book); List<Book> queryAll(); Book queryById(Integer bookId); }
二. BookDaoImpl
编写BookDaoImpl,在以往的项目中,DaoImpl都需要在实现Dao接口的基础上,再继承我们自己编写的CommonDao,然后通过CommonDao中定义的各种增删改查的方法进行数据库的相关操作。
现在我们有了JdbcTemplate,CommonDao中的所有操作都可以使用JdbcTemplate来代替。
package io.zhangjia.dao.impl; import io.zhangjia.dao.BookDao; import io.zhangjia.entity.Book; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; public class BookDaoImpl implements BookDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public int doInsert(Book book) { String sql = "INSERT INTO book ( NAME, AUTHOR, PRICE) VALUE (?,?,?)"; return jdbcTemplate.update(sql, book.getName(), book.getAuthor(), book.getPrice()); } @Override public int doDelete(Integer bookId) { String sql = "DELETE FROM book WHERE BOOK_ID = ?"; return jdbcTemplate.update(sql, bookId); } @Override public int doUpdate(Book book) { String sql = "UPDATE book SET PRICE = ?,AUTHOR =?,NAME = ? WHERE BOOK_ID = ?"; return jdbcTemplate.update(sql, book.getPrice(), book.getAuthor(), book.getName(), book.getBookId()); } @Override public List<Book> queryAll() { String sql = "SELECT * FROM book"; List<Book> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Book.class)); return query; } @Override public Book queryById(Integer bookId) { String sql = "SELECT * FROM book WHERE BOOK_ID = ?"; Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Book.class), bookId); return book; } }
将JdbcTemplate作为BookDao的私有属性,并提供setter方法,通过Spring将其注入BookDaoImpl。
<?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:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 读取properties文件--> <content:property-placeholder location="jdbc.properties"/> <bean id="dataSource" scope="prototype" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 配置JdbcTemplate--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 注意这里不要使用BookDao接口,因为接口无法实例化--> <bean class="io.zhangjia.dao.impl.BookDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> </beans>
除了上面的配置方式外,我们还可以使用Spring的自动注入功能,Spring可以使用autowire属性完成自动注入,首先看一下根据类型自动完成注入:
<?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:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 读取properties文件--> <content:property-placeholder location="jdbc.properties"/> <bean id="dataSource" scope="prototype" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean class="org.springframework.jdbc.core.JdbcTemplate" autowire="byType" /> <bean class="io.zhangjia.dao.impl.BookDaoImpl" autowire="byType" /> </beans>
根据类型完成自动注入非常简单,甚至都不需要给bean设置ID,而且bean也变成了单标签。但是它也有自己的局限性,即该类型的bean必须唯一,假如上述例子中有两个类型为DruidDataSource或者JdbcTemplate的bean,则不能再根据类型完成自动注入。
除了根据类型完成自动注入外,我们还可以根据name完成自动注入:
<?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:content="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 读取properties文件--> <content:property-placeholder location="jdbc.properties"/> <bean id="dataSource" scope="prototype" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" autowire="byName" /> <bean class="io.zhangjia.dao.impl.BookDaoImpl" autowire="byName" /> </beans>
byName是根据bean的id完成的自动注入,如果上面的代码中我们将 <bean id=”jdbcTemplate” …> 和 <bean id=”dataSource”…>中的id去掉,则都无法完成自动注入,且会引发空指针异常。
三. 测试类
测试类也和之前的有所区别,BookDaoImpl不需要我们手动实例化,因为如果在测试类中直接实例化BookDaoImpl,jdbcTemplate根本没有经过Spring的IOC容器,其值便一直是初始值null,调用任何方法都会引发空指针异常。所以我们的BookDaoImpl需要通过getBean来获取
public class Test { public static void main(String[] args) throws SQLException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); BookDao bookDao = context.getBean(BookDao.class); Book book = new Book(2,"1","2",1.23); bookDao.doUpdate(book); // bookDao.doInsert(new Book("z","1",8.3)); // bookDao.doDelete(3); List<Book> books = bookDao.queryAll(); System.out.println("books = " + books); context.close(); } }
四. 自动注入
请登录之后再进行评论