黑马程序员技术交流社区

标题: 【石家庄校区】spring-jdbc-Template [打印本页]

作者: 丶笑笑    时间: 2018-7-6 10:12
标题: 【石家庄校区】spring-jdbc-Template
本帖最后由 小石姐姐 于 2018-7-31 10:50 编辑

spring-jdbc-Template





快速入门:
准备:
建表+实体类
导包:

   
[Java] 纯文本查看 复制代码
spring-beans-4.2.4.RELEASE.jar
    spring-context-4.2.4.RELEASE.jar
    spring-core-4.2.4.RELEASE.jar
    spring-expression-4.2.4.RELEASE.jar
    spring-web-4.2.4.RELEASE.jar
    spring-test-4.2.4.RELEASE.jar
   
    //日志相关jar
    commons-logging-1.2.jar
    log4j-1.2.16.jar
   
    //AOP相关jar包
    com.springsource.org.aopalliance-1.0.0.jar
    spring-aop-4.2.4.RELEASE.jar
    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
   
    //DB相关jar包
    spring-tx-4.2.4.RELEASE.jar
    spring-jdbc-4.2.4.RELEASE.jar
   
    //数据库驱动jar包
    mysql-connector-java-5.1.7-bin.jar
    //C3P0jar包
    c3p0-0.9.2.1.jar
    mchange-commons-java-0.2.3.4.jar
在src目录下创建db.properoties配置文件,提供数据库连接信息
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///springtest
jdbc.username=root
jdbc.password=123
创建applicationContext.xml文件
需要创建的对象:
连接池——单例
    注入到JdbcTemplate对象
JdbcTemplate
    注入到dao层对象(注解形式)
dao层
    注入到service层对象(注解形式)
service层
    注入到单元测试对象(注解形式)
<!-- 引入外部的properties文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!--
  创建内置连接池
  等价于 DriverManagerDataSource dmDs = new DriverManagerDataSource();
-->
<bean id="dmDs" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClass}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}"/>
</bean>

<!--
  创建c3p0连接池
  等价于 ComboPooledDataSource c3p0Ds = new ComboPooledDataSource();
-->
<bean id="c3p0Ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClass}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<!--dao层未继承JdbcDaoSupport-->
    <!-- 创建JdbcTemplate对象 -->
    <bean id="jdbcTeplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="c3p0Ds"></property>
    </bean>

    <!--创建Dao层对象-->
    <bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl"></bean>


<!--dao层继承JdbcDaoSupport-->
    <bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl">
        <!-- 当注入dataSource后,底层会自动创建一个JdbcTemplate -->
        <property name="dataSource" ref="c3p0Ds" />
    </bean>

<!--service层对象-->
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl"/>
单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class JTemplateTest {

    @Autowired
    private AccountServiceaccountService;
   
    @Test
    public void test01(){
       accountService.account("tom", "fox", 100);
    }
}
--------------------------------我是分割线-------------------------------------
//获取对象(查询结果为一条记录)
    User user =jdbcTemplate.queryForObject("select * from t_user whereid =?",
                                            newBeanPropertyRowMapper<User>(User.class),1);
//获取对象集合(查询结果为多条记录)
    List<User> user =jTemplate.query("select * from t_user", newBeanPropertyRowMapper<User>(User.class));
声明式事务管理:事务管理的核心:同一个连接XML形式:
目的:使转账方法获得增强,实现事务管理
需要:
    连接池                  
    dao层继承JdbcDaoSupport  //需要连接池对象和数据库交互
    //以上为了操作数据库
    --------------------------------我是分割线--------------------------
    //以下为了实现事务管理(AOP)
    service                     //需要dao层对象操作数据库
    事务管理器
    事务通知
    切面
配置applicationContext.xml文件
<!-- 目标对象,也是测试需要的对象-->
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl2"/>
<!--
  创建c3p0连接池
  等价于 ComboPooledDataSource c3p0Ds = new ComboPooledDataSource();
-->
<bean id="c3p0Ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClass}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
<!--dao层对象-->
<bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl">
    <!-- 当注入dataSource后,底层会自动创建一个JdbcTemplate -->
    <property name="dataSource" ref="c3p0Ds" />
</bean>

<!-- 目标对象,也是测试需要的对象service -->
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl"></bean>

<!--配置事务管理器  -->
<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--事务的管理需要连接-->
    <property name="dataSource" ref="c3p0Ds"></property>
</bean>

<!-- 配置事务通知-->
<tx:advice id="txAdvice"transaction-manager="transactionManager">
    <tx:attributes>
    <!--
     name:必需的,对哪些方法进行事务控制
     isolation 可选 设置事务隔离级别 默认是DEFAULT
     propagation:可选 设置事务传播 默认值 REQUIRED
     timeout 可选 超时时间 默认值-1
     read-only 可选 默认值是false如果不是只读,它可以对insert update delete操作,如果是只读不可以。
     rollback-for 可选 可以设置一个异常,如果产生这个异常,触发事务回滚
    no-rolback-for 可选 可以设置一个异常,如果产生这个异常,不会触发事务回滚
    -->
        <tx:method name="account" read-only="false"/>
    </tx:attributes>
</tx:advice>

<!-- 配置切面-->
<aop:config>
    <aop:pointcut expression="execution(*com.itnannan.service.AccountServiceImpl.account(..))" id="XPoint"/>   
    <aop:advisor advice-ref="txAdvice" pointcut-ref="XPoint"/>
</aop:config>
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public Test{
    //测试service对象的方法,需要service对象
    @Autowired
    private AccountServiceaccountService;
   
    @Test
    public void test(){
       accountService.account("tom","fox",500);
    }
   
}
Annotation形式:
目的:使转账方法获得增强,实现事务管理
需要:
    连接池                  
    dao层继承JdbcDaoSupport  //需要连接池对象和数据库交互
    //以上为了操作数据库
    --------------------------------我是分割线--------------------------
    //以下为了实现事务管理(AOP)
    service                     //需要dao层对象操作数据库
    事务管理器
    配置注解需要的参数
配置applicationContext.xml文件:
<!-- 引入外部的properties文件 -->
<context:property-placeholder location="classpath:db.properties" />

<!-- 目标对象,也是测试需要的对象 -->
在service层添加注解注入dao
<bean id ="accountService" class="com.itnannan.service.AccountServiceImpl2"/>

<!--
  创建c3p0连接池
  等价于 ComboPooledDataSource c3p0Ds = new ComboPooledDataSource();
-->
<bean id="c3p0Ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClass}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
<!--dao层-->
<bean id="accountDao" class="com.itnannan.dao.AccountDaoImpl">
    <!-- 当注入dataSource后,底层会自动创建一个JdbcTemplate -->
    <property name="dataSource" ref="c3p0Ds" />
</bean>

<!--配置事务管理器  -->
<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="c3p0Ds"></property>
</bean>
<!-- 配置注解需要的参数-->
<tx:annotation-driventransaction-manager="transactionManager"/>
service层注解:
在类或要增强方法上添加@Transactional即可
单元测试:
相同


作者: 张荫    时间: 2018-7-9 18:37
沙发沙发沙发




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2