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实例,并且在该线程结束时,自动释放实例。

猜你喜欢

转载自www.cnblogs.com/coderlynn/p/8947944.html