捡框架的小男孩--Spring(四)

Spring中的JDBC

主要通过JdbcTemplate 实现功能
当然下面将用到 c3p0的连接池, 所用数据库的驱动这里使用的是免费的MySQL.
将使用的包导入c3p0-0.9.5-pre10.jar mysql-connector-java-5.1.7-bin.jar(根据实际情况决定)

为了程序的修改方便把连接数据库的 dataSouce放在了一个properties 文件中并在spring 的配置文件中使用。
db.property

user=root
password=123456
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3307/stuapp
initialPoolSize=5
maxPoolSize=10

配置c3p0的dataSouce(作用连接数据库)

    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" 
    class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${user}"></property>  
        <property name="password" value="${password}"></property>
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
        <property name="driverClass" value="${driverClass}"></property>
        <property name="initialPoolSize" value="${initialPoolSize}"></property>
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
    </bean>

主角登场 在spring 的配置文件中加入如下代码

<bean id="jdbcTemlplate"
        class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
        </bean>

其实就是一个JdbcTemplate类,让spring帮忙自动加载了。当让我们也可以在代码中自己去创建对象并吧他的属性 dataSource赋值.(这里就不多说了)

这些配置好了以后就可以获取JdbcTemplate 实例了。

ApplicationContext ioc=new ClassPathXmlApplicationContext("jdbcContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) ioc.getBean("jdbcTemlplate");

接下来就可以进行CRUD操作了

下面列举一下他的一些常用方法
1.batchUpdate(sql,ba); 对多条数据修改 传入一个集合

//id是主键
String sql="insert into appuser(id,nickname,profession,role,password,phone) values(?,?,?,?,?,?)";
        List<Object[]> ba=new ArrayList<>();
        ba.add(new Object[]{null,"Arik","Teacher","vip","123","1232123"});

        ba.add(new Object[]{null,"Mark","Student","123456","public","456789"});

        jdbcTemplate.batchUpdate(sql,ba);

2.update() 普通的操作方法
3.把查询的结果封装到对象中

        String sql="select id,nickname,profession,role,password,phone from appuser where id=?";
        RowMapper<appuser> rowmaper=new BeanPropertyRowMapper<appuser>(appuser.class);
        appuser user=jdbcTemplate.queryForObject(sql, rowmaper,2);

4.把查询的结果封装到集合中

String sql="select id,nickname,profession,role,password,phone from appuser where id>?";
        RowMapper<appuser> rowmaper=new BeanPropertyRowMapper<appuser>(appuser.class);
        List<appuser> userList=jdbcTemplate.query(sql, rowmaper,1);

5.使用数据库函数查询

String sql="select count(id) from appuser";
        long count=jdbcTemplate.queryForObject(sql, Long.class);
        System.out.println(count);
具名参数的使用

通过使用NamedParameterJdbcTemplate 类来实现次功能
在spring的配置中加入

<bean id="nameJdbcTemlplate"
        class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"></constructor-arg>
        </bean>

当让在要使用的时候首先获取实例
普通的操作做通过键值对来实现 。(相当于把原来的?边上号了,更加方便一一对应)

String sql="insert into appuser(id,nickname) values(:id,:nickname)";
        Map<String, Object> paraMap=new HashMap<>();
        paraMap.put("nickname", "asdf");
        paraMap.put("id", 88);

        nameTemplate.update(sql, paraMap);

也可以通过关系映射来修改数据库。例如给一个实例从而添加数据库。
其他的都是默认值这里主键 使用Integer 类型这样默认就是null 数据库就可以自增长。如果是int 如果不写默认就是0;这样就可能与主键唯一性相矛盾。

String sql="insert into appuser(id,nickname,profession,role,password,phone) values(:id,:nickname,:profession,:role,:password,:phone)";
        appuser user=new appuser();
        user.setNickname("Alice");
        SqlParameterSource parameterSource=new BeanPropertySqlParameterSource(user);
        nameTemplate.update(sql, parameterSource);
实际开发中如何使用JDBC
@Repository("jdbcDao")
public class jdbcFor {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Test
    public void testcount(){
        String sql="select count(id) from appuser";
        long count=jdbcTemplate.queryForObject(sql, Long.class);
        System.out.println(count);

    }
}

实际开发中的使用

当要用到持久层时 先通过注解获取实例让后就可以直接调用方法了。(应为前面连接数据库,jdbcTemplate对象的创建都由Spring帮我们完成了)

事物

概念

一系列的动作,要么都完成要么都不完成。(原子性)
属性:原子性,一致性,隔离性,持久性
使用事物可以使用代码,也可以使用声明。这里讲解声明式事物。
要导入tx 命名空间
<bean id="transanctionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
        <property name="dataSource" ref="dataSource"></property>
   </bean>  
   <tx:annotation-driven transaction-manager="transactionManager"/>

接下只要加在方法上加上注解就行了。就是这么简单。
@Transactional

当然事物是通过异常来捕捉的。所以在你的事物上要有业务逻辑处理,并抛出异常。

事物的传播行为

一个事物 调用另一个事物方法。是整体算一个事物 还是,每一个事物只要成功就行,不成功的只回归自己的事物?
required 最外层的事物 为准,只要有不成功的就回归到最初始状态。
required-new 只要自己的事物成功,其他事物失败不会被回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值