JAVA框架篇(二)Spring的JDBC模板使用,JdbcTemplate配置和操作数据库

Spring有一个DAO模块,里面封装了一个SpringJDBC,本篇就来记录如何用SpringJDBC操作数据库

  • 一,JdbcTemplate配置
  • 二,JdbcTemplate具体操作
    • 1,JdbcTemplate查询
    • 2,JdbcTemplate增删改

Spring中有一个类JdbcTemplate,它封装了JDBC的操作方法。我们只需要传入一个连接池就可以用它来操作数据库。
优点:
1,不用频繁的创建或关闭连接。
2,设置参数更方便。不用写大量的setXXX方法
3,能快速的返回需要的类型。
4,对比mybatis,JdbcTemplate操作一些简单的查询更加快速,比如查询某一行一列,即一个单元格的值。这时候用mybatis操作可能还更麻烦。
5,JdbcTemplate对一些复杂的查询语句操作更加灵活。因为sql语句和JAVA代码在同一个类上。拼接操作更加快速。
缺点:
1,复杂sql及其拼接过程还有结果集操作都写在java类上,耦合性强,这样会导致维护性下降。
–>由于这个缺点。JdbcTemplate使用的就不多了。但操作简单语句,查询少量列的时候它还是很给力的。

一,JdbcTemplate配置

1,JdbcTemplate是SpringJDBC模块的东西。所以我们要先导入必要的Springjar包还有数据库驱动包
在这里插入图片描述
2,xml配上bean
想要让JdbcTemplate能够操作数据库那我们就需要给它一个连接池。Spring自带有一个连接池DriverManagerDataSource,所以进行以下配置



    
    
    
    


  
      
  

市面上还有很多其他连接池,比如阿里巴巴的druid.

二,JdbcTemplate具体操作

首先要从Spring容器中获取一个JdbcTemplate

//就这样getBean获取一个jdbcTemplate
ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");

数据准备.有一个user表
JAVA框架篇(二)Spring的JDBC模板使用,JdbcTemplate配置和操作数据库_第1张图片

1,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());
        }
    }

效果如下:
JAVA框架篇(二)Spring的JDBC模板使用,JdbcTemplate配置和操作数据库_第2张图片

2,JdbcTemplate增删改

方法 返回值 描述
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");
    }

效果如下:
JAVA框架篇(二)Spring的JDBC模板使用,JdbcTemplate配置和操作数据库_第3张图片
3,JdbcTemplate的excute()

方法 返回值 描述
excute(String sql) void 使用Statement平台,执行一个sql语句,如果要执行某个ddl语句可以用这个方法

excute还有几个其他的重载方法。比如调用一个存储过程。指定预编译平台。不过不常用。真要用JdbcTemplate来执行ddl的话就用excute(String sql)

你可能感兴趣的:(JAVA框架篇)