Spring整合JDBC

2024/05/20

Spring整合JDBC模板

相关依赖

<!--Spring整合JDBC-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <!--Spring操作事务-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

连接池:不用在操作数据库的时候临时创建一个对象,用完之后销毁,而是有个池子,在未操作数据库之前就已经将连接放在了池子中,想用的时候从池子中取,不想用的时候就放回池子,避免了操作数据库的对象的频繁创建和销毁

获取连接池的主要目的是配置操作数据库的相关信息

jdbc模板技术封装了下述步骤,我们仅需完成编写sql(和遍历结果集)

/**
 * //获取连接
 * //编写sql
 * //预编译sql
 * //参数设置
 * //执行sql语句
 * //遍历结果集
 * //关闭资源
 */

new的方式

//可以用druid连接池,也可以用spring的内置连接池,此处用的是spring的

  • 测试类
public class JdbcTest {
    //可以用druid连接池,也可以用spring的内置连接池,此处用的是spring的
    @Test
    public void run() {
        //创建数据库连接池对象
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/spring_db");
        dataSource.setUsername("root");
        dataSource.setPassword("root");

        //操作
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        //添加(需要参数就加?,?有几个?后边就写几个参数)
        jdbcTemplate.update("insert into account values(null,?,?)","王五",2000.00);//支持参数赋值的方式(可防止sql注入)

    }
}

改进→配置文件方式

  • 配置文件
<!--    配置连接池对象-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring_db"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

<!--    配置jdbc模板对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
  • 测试
//声明该类为测试单元
@RunWith(SpringJUnit4ClassRunner.class)
//加载配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTest {
    //可以用druid连接池,也可以用spring的内置连接池,此处用的是spring的
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void run() {
        jdbcTemplate.update("insert into account values(null,?,?)","王五01",2000.00);//支持参数赋值的方式(可防止sql注入)
    }
}

再改进→配置属性文件

配置属性文件相当于将数据库的配置信息专门解耦出来了

//可以用druid连接池,也可以用spring的内置连接池,此处用的是druid的

属性文件使用key-value形式(注意没有引号""了)

  • 属性文件jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=root

加载属性文件的两种方式:

<!--    属性配置文件 第一种写法-->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties"/>
    </bean>
<!--    属性配置文件 第二种写法-->    
    <context:property-placeholder location="classpath:jdbc.propertiesxml
  • 加载了属性文件后,用**${}**从属性文件中取值
<!--    配置连接池对象-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

<!--    配置jdbc模板对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

使用JDBC模板进行增删改查

增删改都用update,查询时查一个用queryForObject,查多个用query

查询:需要自己编写一个类来接收查询到的数据

注意继承的是jdbc的RowMapper
在这里插入图片描述
jdbc模板技术封装了大部分步骤,但是由于每次查询的数据库不一样,因此需要单独继承一个RowMapper类来完成数据的封装

  • 封装数据的类
/**
 * 用来进行数据封装
 */
public class BeanMapper implements RowMapper<Account> {
    /**
     * RowMapper类中提供内置的循环(我们不用自己循环的将数据添加到Account类中)
     * mapRow()是一行一行进行数据封装的
     * **/
    @Override
    public Account mapRow(ResultSet resultSet, int i) throws SQLException {
        //将从数据库中取到的数据封装到account中
        Account account = new Account();
        account.setId(resultSet.getInt("id"));
        account.setName(resultSet.getString("name"));
        account.setMoney(resultSet.getDouble("money"));
        return account;
    }
}
  • 测试类
@Test
//查
 //通过id查询 查一个queryForObject
 //queryForObject(sql语句,查询到的结果封装到哪个对象中去,?中的内容的值)
public void run4() {
    try {
        Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new BeanMapper(), 10);//支持参数赋值的方式(可防止sql注入)
        System.out.println(account);
    } catch (EmptyResultDataAccessException e) {
        System.out.println(e); //保证即使未查询到数据也不报错
    }
}

@Test
//查
//查询所有 查多个query
public void run5() {
    try {
        List<Account> accountList = jdbcTemplate.query("select * from account", new BeanMapper());//支持参数赋值的方式(可防止sql注入)
        System.out.println(accountList);
    } catch (EmptyResultDataAccessException e) {
        System.out.println(e); //保证即使未查询到数据也不报错
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值