Spring中有一个类JdbcTemplate,它封装了JDBC的操作方法。我们只需要传入一个连接池就可以用它来操作数据库。
优点:
1,不用频繁的创建或关闭连接。
2,设置参数更方便。不用写大量的setXXX方法
3,能快速的返回需要的类型。
4,对比mybatis,JdbcTemplate操作一些简单的查询更加快速,比如查询某一行一列,即一个单元格的值。这时候用mybatis操作可能还更麻烦。
5,JdbcTemplate对一些复杂的查询语句操作更加灵活。因为sql语句和JAVA代码在同一个类上。拼接操作更加快速。
缺点:
1,复杂sql及其拼接过程还有结果集操作都写在java类上,耦合性强,这样会导致维护性下降。
–>由于这个缺点。JdbcTemplate使用的就不多了。但操作简单语句,查询少量列的时候它还是很给力的。
1,JdbcTemplate是SpringJDBC模块的东西。所以我们要先导入必要的Springjar包还有数据库驱动包
2,xml配上bean
想要让JdbcTemplate能够操作数据库那我们就需要给它一个连接池。Spring自带有一个连接池DriverManagerDataSource,所以进行以下配置
市面上还有很多其他连接池,比如阿里巴巴的druid.
首先要从Spring容器中获取一个JdbcTemplate
//就这样getBean获取一个jdbcTemplate
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
(1)简单查询,即单行单列查询,或者结果集就是一个单元格比如查询select count(*)…
方法 | 返回值 | 描述 |
---|---|---|
queryForObject(String sql, Class requiredType,Object…args) | T | 传入一个查询语句。返回一个值。值的类型由requiredType决定,传入String.class则返回String,args表示参数 |
test:
public void springFun(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
//第二个参数,类型根据实际情况来给。Integer.class,String.class等
String pwd = jdbcTemplate.queryForObject("SELECT pwd FROM user where username=?", String.class,"zhangsan");
System.out.println("pwd="+pwd);
}
效果如下:
(2)复杂查询,查询一行多列
查询一行多列时需要对其结果集进行处理。将结果集的值注入到一个实体里面.
方法 | 返回值 | 描述 |
---|---|---|
queryForObject(String sql, RowMapper rowMapper, Object… args) | T | 传入一个查询语句。实现rowMapper对结果集进行处理并返回一个实体T,args表示参数 |
test:
//User类
public class User {
private Integer id;
private String userName;
private String pwd;
//setter和Getter
}
//Test
@Test
public void springFun(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
String sql = "SELECT id,username,pwd FROM user where username=? and pwd = ?";
User user = jdbcTemplate.queryForObject(sql, new RowMapper() {
@Override
//实现RowMapper接口并传入一个目标泛型来获取包含着结果集的实体对象
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.setPwd(resultSet.getString("pwd"));
user.setUserName(resultSet.getString("username"));
user.setId(resultSet.getInt("id"));
return user;
}
}, "zhangsan", "456789");
System.out.println(user.getId()+"="+user.getUserName()+"="+user.getPwd());
}
效果如下:
(3)复杂查询,查询多行多列。
和一行多列对比,多行多列就是把每一行对应的实体对象给添加到集合中就好。
方法 | 返回值 | 描述 |
---|---|---|
query(String sql, RowMapper rowMapper, Object… args) | List | 传入一个查询语句。实现rowMapper对结果集进行处理并返回一个泛型是实体T的List,args表示参数 |
@Test
public void springFun(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
String sql = "SELECT id,username,pwd FROM user where pwd = ?";
//使用query返回一个List结果集,查询多行多列
List query = jdbcTemplate.query(sql, new RowMapper() {
@Override
//实现RowMapper时泛型传入你指定的目标对象.然后使用setXXX来设置值
//其实也就是JDBC中的结果集处理
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.setPwd(resultSet.getString("pwd"));
user.setUserName(resultSet.getString("username"));
user.setId(resultSet.getInt("id"));
return user;
}
}, "123456");
for(User user:query){
System.out.println(user.getId()+"="+user.getUserName()+"="+user.getPwd());
}
}
方法 | 返回值 | 描述 |
---|---|---|
update(String sql, Object… args) | int | 传入一个增删改语句。执行数据库的增删改语句来修改数据库数据,args表示参数 |
@Test
public void springFun(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
String updateSql = "update user set pwd=? where username=?";
String deleteSql = "delete from user where username=?";
String insertSql = "insert into user values(null,?,?) ";
/**
* 新增,删除,更新都用update方法,
* 传入新增(insert)sql就执行新增方法
* 传入删除(delete)sql就执行删除方法
* 传入更新(update)sql就执行更新方法
*/
jdbcTemplate.update(updateSql,"abcdef","zhangsan");
jdbcTemplate.update(deleteSql,"qjq");
jdbcTemplate.update(insertSql,"wangba","123456");
}
方法 | 返回值 | 描述 |
---|---|---|
excute(String sql) | void | 使用Statement平台,执行一个sql语句,如果要执行某个ddl语句可以用这个方法 |
excute还有几个其他的重载方法。比如调用一个存储过程。指定预编译平台。不过不常用。真要用JdbcTemplate来执行ddl的话就用excute(String sql)