目录
方法1 int update(String sql,@Nullable Object... args):
1.Spring JDBC介绍
Spring JDBCSpring的 JDBC 模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从烦琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑中Spring JDBCTemplate针对数据库的操作, Spring 框架提供了 JdbcTemplate 类,该类是 Spring 框架数据抽象层的基础,其他更高层次的抽象类却是构建于 JdbcTemplate 类之上。JdbcTemplate 类是 Spring JDBC 的核心类2.JDBCTemplate 快速入门
测试数据
工具类
/** * Druid工具类 */ public class JDBCUtils { // 加载配置文件 static DataSource ds; static { Properties pro = new Properties(); try { pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); ds = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接池的方法 */ public static DataSource getDataSource() { return ds; } /** * 获取连接的方法 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 关闭资源的方法 */ public static void close(ResultSet rs, Statement st, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
配置文件
第一步:导入jar包(版本可不同)
导入必要jar 包到工程目录,导入 Spring 核心开发包到创建工程spring-beans-3.2.0.RELEASE.jarspring-context-3.2.0.RELEASE.jarspring-core-3.2.0.RELEASE.jarspring-expression-3.2.0.RELEASE.jar还需要下载commons-logging 日志包commons-logging-1.1.1.jar导入JDBC 模板开发包spring-jdbc-3.2.0.RELEASE.jarspring-tx-3.2.0.RELEASE.jar完整jar包截图如下:
第二步:创建JdbcTemplate
创建JdbcTemplate ,并通过构造方法传入数据源 DataSourceJdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource());第三步:执行SQL语句
String sql = "update user set username = ? where id = ?"; int count = jt.update(sql, "lisi", 2);第四步:处理结果
因为是更新,这里取到执行后的 count ,直接输出即可完整代码
public static void main(String[] args) { // 2.创建JdbcTemplate JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource()); // 3.执行SQL语句 String sql = "update user set username = ? where id = ?"; int count = jt.update(sql, "lisi", 2); // 4.处理结果 System.out.println(count); }
运行结果(红色部分为日志)
3.JdbcTemplate常用方法
3.1 构造方法
public JdbcTemplate(DataSource datasojurce)
构造方法传入数据源,可以使用C3PO或者Druid数据源3.2 普通方法
方法1 int update(String sql,@Nullable Object... args):
update方法用于执行新增( insert)、修改(update)、删除(delete)等语句
sql:执行的sql语句
args:执行sql需要的参数代码示例:
JdbcTemplate jt = new JdbcTemplate(JDBCUtils.getDataSource()); /** * 添加数据的方法 */ @Test public void insert() { String sql = "insert into user values(?,?,?,?)"; int count = jt.update(sql, 1, "zhangsan", "321", "321@qq.com"); System.out.println(count); } /** * 更新数据的方法 */ @Test public void update() { String sql = "update user set username = ? where id = ?"; int count = jt.update(sql, "lisi2", 2); System.out.println(count); } /** * 删除数据的方法 */ @Test public void delete() { String sql = "delete from user where id = ?"; int count = jt.update(sql, 10); System.out.println(count); }
运行结果:
方法2: Map<String, Object> queryForMap()
将查询(单行)结果封装为Map集合,其中列名作为key,将值作为value
代码示例:
/** * 查询id为2 的数据,并将数据封装到map集合中 * 其中key为列名,value为值 */ @Test public void selectId(){ String sql= "select * from user where id = ?"; Map<String, Object> map = jt.queryForMap(sql, 2); System.out.println(map); }
运行结果:
方法3:List queryForList()
查询(多行数据)结果将结果集封装为list集合
代码示例:
/** * 查询多行数据 * 将每一行数据都封装成map集合 * 然后将每一行的map集合添加到list集合中 */ @Test public void selectAll() { String sql = "select * from user "; List<Map<String, Object>> list = jt.queryForList(sql); for (Map<String, Object> l : list) { System.out.println(l); } }
运行结果:
方法4:query(String sql, RowMapper rowMapper)
将结查询果封装为JavaBean 对象参数:rowMapper或BeanPropertyRowMapper:可以将查询到的值自动映射到JavaBean中RowMapper接口RowMapper可以将数据中的每一行数据封装成用户定义的类 ,通过query() 方法进行查询时,可以传递 RowMapper 对象给 query() 方法,查询到数据后,会自动调用RowMapper 对象的 mapRow 方法(每行数据都会调用一次),通过mapRow方法的参数 ResultSet 即可获取查询到的某行数据,再将数据封装成指定的对象返回即可:![]()
代码示例:
public class User { private Integer id; private String username; private String password; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}'; } }
/** * 查询多行数据,将查询到的每行数据封装成User对象,并添加到List集合中 */ @Test public void selectUser1() { String sql = "select * from user "; List<User> users = jt.query(sql, (rt, i) -> { User user = new User(); user.setId(rt.getInt("id")); user.setUsername(rt.getString("username")); user.setPassword(rt.getString("password")); user.setEmail(rt.getString("email")); return user; }); for (User user : users) { System.out.println(user); } }
运行结果:
BeanPropertyRowMapper该类实现了RowMapper 接口,通过构造方法传入 Class 对象,会自动将数据库表字段值映射到实体类属性上(列名和属性名必须一致)用法: new BeanPropertyRowMapper(User.class)代码示例:/** * 查询多行数据,将查询到的每行数据封装成User对象,并添加到List集合中 */ @Test public void selectUser2() { String sql = "select * from user "; List<User> users = jt.query(sql, new BeanPropertyRowMapper<>(User.class)); for (User user : users) { System.out.println(user); } }
运行结果:
方法5:T queryForObject()
可以将查询结果封装为对象,一般用于聚合函数的查询代码示例:/** * 查询总行数 */ @Test public void selectCount() { String sql = "select count(*) from user "; Long l = jt.queryForObject(sql, Long.class); System.out.println(l); }
运行结果: