zoukankan      html  css  js  c++  java
  • 配数据源过程—JdbcTemplate, DataSource

    前提:配个数据源(mysql or oracle),设置到JdbcTemplate中,然后直接执行sql以及带绑定变量的sql

    对于普通sql:

    JdbcTemplate

    • 用于create/drop

    jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");

    • 用于insert/update/delete

    jdbcTemplate.update("INSERT INTO USER VALUES('123', 'bieber')");
    jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});

    • 用于select

    int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER"); // 条数
    String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class); // 返回单个name
    List rows = jdbcTemplate.queryForList("SELECT * FROM USER"); // 返回若干行
    Iterator it = rows.iterator();
    while(it.hasNext()) {
    Map userMap = (Map) it.next(); // 可以直接强转?
    System.out.print(userMap.get("user_id") + "\t");
    System.out.print(userMap.get("name") + "\t");
    }

    • 其他

    jdbcTemplate.update("INSERT INTO USER VALUES(?, ?)", new PreparedStatementSetter() {
      public void setValues(PreparedStatement ps) throws SQLException {
        ps.setString(1, "123");
        ps.setString(2, "bieber");
      }
    });

    jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?", new Object[] {id}, new RowCallbackHandler(){
      public void processRow(ResultSet rs) throws SQLException {
        User user = new User();
        user.setId(rs.getString("user_id"));
        user.setName(rs.getString("name"));
      }
    });

    List list = jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
    return (User)list.get(0);
    class UserRowMapper implements RowMapper {
      public Object mapRow(ResultSet rs, int index) throws SQLException {
        User user = new User();
        user.setId(rs.getString("user_id"));
        user.setName(rs.getString("name"));
        return user;
      }
    }
    JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现。
    除了大量使用Template Method来封装一些底层的操作细节,spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能,使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。
    更多方法:http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/jdbc/core/JdbcTemplate.html


    对于绑定变量的sql:

    • JdbcTemplate

    String insert = "insert into myTable (id, email, password) values (null, ?, ?)";

    jdbcTemplate.update(insert, new Object[] {"happybabyme@gmail.com", "lalalalala"});
    无论是按照Object[]或PreparedStatementSetter的方式,参数个数都必须预先知道,顺序也不可变换。如此一来,如果要调整一下sql语句,那么相应的参数顺序都必须进行相应调整。

    • NamedParameterJdbcTemplate 

    String insert = "insert into myTable (id, email, password) values (null, :email, :password)";

    Map<String, String> map = new HashMap<String, String>;

    map.put("email", "happybabyme@gmail.com");

    map.put("password", "lalalalala");

    jdbcTemplate.update(insert, map);

  • 相关阅读:
    有赞 MySQL 自动化运维之路 — ZanDB
    程序员你为什么这么累【续】:编码习惯之日志建议
    Optimizing web servers for high throughput and low latency
    难道他们说的都是真的?
    Netty 长连接服务
    python opencv 读取图片 返回图片某像素点的b,g,r值
    Python下的图像处理库,你选哪个?
    python中numpy.savetxt 参数
    Python如何安装OpenCV库
    Python图像处理库PIL的基本概念介绍
  • 原文地址:https://www.cnblogs.com/alipayhutu/p/2796102.html
Copyright © 2011-2022 走看看