• 中文
    • English
  • 注册
  • 查看作者
  • Spring:使用JdbcTemplate开发DAO

    一.  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();
        }
    }

    四.  自动注入

  • 0
  • 0
  • 0
  • 4.3k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: