zoukankan      html  css  js  c++  java
  • Spring4基础 学习笔记(5) Spring与Dao

    Spring与DAO:
     
    Spring与JDBC模板:为了避免直接使用JDBC而带来的复杂且冗长的代码,Spring提供了一个强有力的模板类:JdbcTemplate 来简化JDBC操作。并且,数据源DataSource对象与模板JdbcTemplate对象均可通过Bean的形式定义在配置文件中,充分发挥了依赖注入的特性。
     
    依赖jar:使用c3p0数据库连接池,Spring的JDBC.jar,Spring的事务jar,数据库驱动  
     
    一般的Service层访问Dao层:
     
    StudentServiceImpl实现-------->IStudentService接口
     
    StudentServiceImpl 持有 Dao的引用 ,由容器注入,Impl的实现依赖于Dao(调用Dao接口的方法)
     
    Dao接口定义了访问DB的方法
     
    定义Dao的实现类,将来注入StudentServiceImpl的类
     
    使用JdbTemplate,Dao实现类 继承 JdbcDaoSupport,JdbcTemplate为该类的成员变量
     
    增删改统一使用update方法:
          @Override
          public void insertStudent(Student student) {
                String sql = "insert into student(name,age) values(?,?)";
                // TODO Auto-generated method stub
                this.getJdbcTemplate().update(sql, student.getName(),student.getAge());               //可变参重载方法
          }
     
     
    三种数据源的注册:
          <!-- c3p0数据源 -->
         <bean id="c3p0Source" class="com.mchange.v2.c3p0.ComboPooledDataSource">
          <property name="driverClass" value="com.mysql.jdbc.Driver"/>
          <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
          <property name="user" value="root"/>
          <property name="password" value="1234"/>
        </bean>
     
     
     
          <!-- dbcp数据源 -->
    <!--      <bean id="dbcpSource" class="org.apache.commons.dbcp.BasicDataSource.class">
          <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
          <property name="url" value="jdbc:mysql://localhost:3306/test"/>
          <property name="username" value="root"/>
          <property name="password" value="1234"/>
        </bean>  -->
     
     
          <!-- Spring内置数据源 -->
         <!-- <bean id="springSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
          <property name="url" value="jdbc:mysql://localhost:3306/test"/>
          <property name="username" value="root"/>
          <property name="password" value="1234"/>
        </bean>    -->
     
     
    使用properties文件:
          <!-- c3p0数据源 -->
         <bean id="c3p0Source" class="com.mchange.v2.c3p0.ComboPooledDataSource">
          <property name="driverClass" value="${jdbc.driver}"/>
          <property name="jdbcUrl" value="${jdbc.url}"/>
          <property name="user" value="${jdbc.username}"/>
          <property name="password" value="${jdbc.password}"/>
        </bean>
     
     需要注册properties文件:
    方式1)bean:
          <!-- 注册jdbcproperties -->
          <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
                <property name="location" value="classpath:jdbc.properties"/>
          </bean>
    使用locations注册多个
     
    方式2):需要添加context约束
    <context:property-placeholder location="classpath:jdbc.properties"/>
     
     
    给DaoImpl对象注册模板,再给模板注册DataSource的步骤可以简化为:直接给DaoImpl对象(JdbcDaoSupport)注册DataSource,因为JdbcDaoSupport的setDataSource方法会以DataSource对象为参数创建模板
          <!-- Dao和DataSource -->
        <bean id="StudentDao" class="StudentDaoImpl">
          <property name="dataSource" ref="c3p0Source"/>
        </bean>
     
    关系:
    service调用Dao,向serviceImpl注入DaoImpl
    DaoImpl继承自JdbcDaoSupport
    向DaoImpl注入模板对象
    向模板对象注入DataSource对象
     
     
    模板实现增删改都使用update方法:
          @Override
          public void insertStudent(Student student) {
                String sql = "insert into student(name,age) values(?,?)";
                // TODO Auto-generated method stub
                this.getJdbcTemplate().update(sql, student.getName(),student.getAge());
          }
          @Override
          public void deleteStudent(Student student) {
                // TODO Auto-generated method stub
                String sql = "delete from student where id=?";
                this.getJdbcTemplate().update(sql,student.getId());
          }
          
          @Override
          public void updateStudent(Student student) {
                // TODO Auto-generated method stub
                String sql = "update student set name=?,age=? where id=?";
                this.getJdbcTemplate().update(sql, student.getName(),student.getAge(),student.getId());
          }
     
    查询使用query方法
          @Override
          public List<String> selectAllStudentsNames() {
                // TODO Auto-generated method stub
                String sql = "select name from student";
                return this.getJdbcTemplate().queryForList(sql , String.class);
          }
     
     
          @Override
          public String selectStudentNameById(int id) {
                String sql = "select name from student where id=?";
                // TODO Auto-generated method stub
                return this.getJdbcTemplate().queryForObject(sql,String.class,id);          //可变参重载方法
          }
     
     
    对于对象集合的查询queryForList不会将查询结果封装为对象,需要自己封装:
              this.getTemplate().query(sql,rowMapper);
     
     
              return this.getJdbcTemplate().query(sql,new RowMapper<Student>() {
                      @Override
                      public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
                            // TODO Auto-generated method stub
                            return null;
                      }
                      
                });
    在RowMapper接口实现类中将结果集封装。
     
    注意:
    //这个rs不是select查询的所有结果集,而是这个结果集遍历出来的一行
          @Override
          public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
                // TODO Auto-generated method stub
                
                return null;
          }
     
    JdbcTemPlate对象是多例的,的生命周期很短,就在一个方法内有效:
    系统会为每一个使用模板对象的线程,创建一个JdbcTemplate实例,并且在该线程结束时,自动释放实例。
  • 相关阅读:
    Smart Client Architecture and Design Guide
    Duwamish密码分析篇, Part 3
    庆贺发文100篇
    .Net Distributed Application Design Guide
    New Introduction to ASP.NET 2.0 Web Parts Framework
    SPS toplevel Site Collection Administrators and Owners
    来自Ingo Rammer先生的Email关于《Advanced .Net Remoting》
    The newsletter published by Ingo Rammer
    深度探索.Net Remoting基础架构
    信道、接收器、接收链和信道接受提供程序
  • 原文地址:https://www.cnblogs.com/coderlynn/p/8947944.html
Copyright © 2011-2022 走看看