• 中文
    • English
  • 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • 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
    • 3.1k
    • 请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 返回顶部
    • 单栏布局 侧栏位置: