zoukankan      html  css  js  c++  java
  • Spring 之jdbc模板(JdbcTemplate与NamedParameterJdbcTemplate)

    传统的jdbc访问数据库显得太繁琐,开发者开发了许多的框架与模板,让对数据库的增删改查变得尤为简单与标准化,在这里介绍的是spring出品的jdbc模板,

    亮点在:开发者不需要去书写建立连接和关闭资源等核心业务(驱动选择和sql语句)耦合的代码块了,让开发者的注意点重新回到sql语句的设计和执行上。

    这便是封装的目的,让代码复用,让程序看起来很简洁

    1.何为JdbcTemplate

    JdbcTemplate是jdbc模板中我们用到的一个类,所有关于数据库的操作都可以由这个类中的方法完成,当然,你得给它正确的参数。

    2.如何创建一个JdbcTemplate

    直接new,或者交给spring管理,不管是二者中的哪一种,如果实际能用,需要注入一个正确的成员变量DataSource。

    2.1何为DataSource

    DataSource又叫数据源,实例对象包括连接的数据库的url、驱动的权限命名、用户名和密码。如在xml配置如下:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
    </bean>

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

    使用实例

    1、update(sql,Object[]{})方法

    此方法可以执行insert、delete、update等方法,sql指本次发送到数据库的sql语句,Object[]{}表示参数的对象数组,或者也可以按顺序直接排列参数的值。

    以按编号删除图书为例:

    String sql = "delete from bookta where isbn=?";
    return jdbc.update(sql, isbn);

    2、

    1不带参数的sql语句查询

    query(String sql,RowMapper<T> rowMapper)

    2带参数的sql语句查询

    query(String sql,RowMapper<T> rowMapper,Object[] args)

    RowMapper<T> rowMapper 是一个接口,此处的参数值应该为该字段的实现类的一个实例,且该实例满足数据库记录到对象的映射关系

    public class BookMapper implements RowMapper<Book> {

    @Override
    public Book mapRow(ResultSet resultSet, int i) throws SQLException {
    Book book = new Book();
    book.setIsbn(resultSet.getString("isbn"));
    book.setTitle(resultSet.getString("title"));
    book.setType(resultSet.getString("type"));
    book.setPrice(resultSet.getDouble("price"));
    return book;
    }
    }

    此处以book对象为例,该代码展示了从数据库取来的结果集与对象的映射关系,即数据库记录和对象的映射关系,ORM框架Hibernate和Mybatis用的就是这种映射关系,后面的博客会有介绍。

    3只返回某一个字段值或者某一条记录

    queryForObject(String sql,Class<T> requiredType,Object[] args)

    Class<T> requiredType为想得到的值的类,比如Integer.class指取一个int类型的记录数,在统计记录条数可能会用到。

    4.其他用法,可用于执行各种sql语句

    jdbcTemplate.execute(sql);

    缺点:一般用于执行DDL语句(常见的有创建数据库或表,或者修改表结构);没有返回值;执行不带参数的SQL语句.

    所以一般不常见,了解一下即可。

    5.另一大对象NamedParameterJdbcTemplate

    1、 与JdbcTemplate唯一不同的地方是,在给问号赋值的时候,是按照名字对应的。

    2、sql语句中不使用?来作为参数替代符。而是使用:加变量名的方式作为参数替代符。 然后在通过Map将变量名与实际值绑定起来,传递给update方法。

    增加xml配置:

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

    如何在配置文件中不加上面的语句的话,也可以用下面的方式来设置

     注意:这里一定要注意@postconstruct的作用

    使用举例:

    此对象不要求设置参数值按顺序,可以乱序,只要保证名字对应即可。较前者,使用较为灵活,但代码变多。

  • 相关阅读:
    ElasticSearch 之 Client
    Ubuntu 更新源
    ThinkPad 禁用 触摸板
    编译OpenGL代码时发生 Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed! 错误的解决方案
    python 自动认证登录
    RIDE的使用
    robotframework的分支和循环
    webdriver入门
    python字符串中的中文处理
    带认证的页面的自动认证登录
  • 原文地址:https://www.cnblogs.com/jiazhutao/p/12676648.html
Copyright © 2011-2022 走看看