zoukankan      html  css  js  c++  java
  • Spring提供JdbcTemplate&NamedParameterJdbcTemplate

    JdbcTemplate主要提供以下五类方法:

    execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

    update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;

    query方法及queryForXXX方法:用于执行查询相关语句;

    call方法:用于执行存储过程、函数相关语句。

    JdbcTemplate类支持的回调类:

    预编译语句及存储过程创建回调:用于根据JdbcTemplate提供的连接创建相应的语句;

             PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatement;

             CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement;

    预编译语句设值回调:用于给预编译语句相应参数设值;

             PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值;

             BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小;

    自定义功能回调:提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作;

             ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作;

             StatementCallback:通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作;

             PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作;

             CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作;

    结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;

             RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。

             RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。

             ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;

    1: JdbcTemplate

    1.1 query

       单个对象

    /**
         * 处理单个对象
         */
        @Test
        public void test_1() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select * from student where id=1";
    
            Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() {
                @Override
                public Student extractData(ResultSet res) throws SQLException, DataAccessException {
                    Student student = null;
                    while (res.next()) {
                        int id = res.getInt("id");
                        String name = res.getString("name");
                        boolean gender = res.getBoolean("gender");
                        Date birthday = res.getDate("birthday");
                        student = new Student(id, name, gender, birthday);
                    }
                    return student;
                }
            });
            System.out.println(student);
        }
        @Test
        public void test_2() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select * from student where id=1";
            // 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回
            jdbcTemplate.query(sql, (res)-> {
                String name = res.getString("name");
                System.out.println(name);
            });
        }
        @Test
        public void test_3() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select * from student where id=1";
            Student stu = jdbcTemplate.query(sql, (res)->{
                Student student = null;
                while (res.next()) {
                    int id = res.getInt("id");
                    String name = res.getString("name");
                    boolean gender = res.getBoolean("gender");
                    Date birthday = res.getDate("birthday");
                    student = new Student(id, name, gender, birthday);
                }
                return student;
            });
            System.out.println(stu);
        }
        //聚集函数
        @Test
        public void test_4() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select count(*) from student";
            Integer inx = jdbcTemplate.queryForObject(sql, Integer.class);
            System.out.println(inx);
        }
        
        @Test
        public void test_5() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select id from student";
            List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
        }

     List Map

        /**
         * 处理单个对象
         */
        @Test
        public void test_1() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select * from student where id=1";
    
            Student student = jdbcTemplate.query(sql, new ResultSetExtractor<Student>() {
                @Override
                public Student extractData(ResultSet res) throws SQLException, DataAccessException {
                    Student student = null;
                    while (res.next()) {
                        int id = res.getInt("id");
                        String name = res.getString("name");
                        boolean gender = res.getBoolean("gender");
                        Date birthday = res.getDate("birthday");
                        student = new Student(id, name, gender, birthday);
                    }
                    return student;
                }
            });
            System.out.println(student);
        }
        @Test
        public void test_2() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select * from student where id=1";
            // 这里演示RowCallbackHandler 上面也可以使用函数式写法 不能返回
            jdbcTemplate.query(sql, (res)-> {
                String name = res.getString("name");
                System.out.println(name);
            });
        }
        @Test
        public void test_3() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select * from student where id=1";
            Student stu = jdbcTemplate.query(sql, (res)->{
                Student student = null;
                while (res.next()) {
                    int id = res.getInt("id");
                    String name = res.getString("name");
                    boolean gender = res.getBoolean("gender");
                    Date birthday = res.getDate("birthday");
                    student = new Student(id, name, gender, birthday);
                }
                return student;
            });
            System.out.println(stu);
        }
        //聚集函数
        @Test
        public void test_4() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select count(*) from student";
            Integer inx = jdbcTemplate.queryForObject(sql, Integer.class);
            System.out.println(inx);
        }
        
        @Test
        public void test_5() {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "select id from student";
            List<Integer> list = jdbcTemplate.queryForList(sql, Integer.class);
        }

     

    1.2 upadte  

    @Test
        public int insertUser(Student stu) {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "insert into student values(null,?,?,?)";
            return jdbcTemplate.update(sql, new Object[] { stu.getName(), stu.isGender(), stu.getBirthday() });
        }
    
        @Test
        public int delete(int id) {
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "delete from student  where id=?";
            return jdbcTemplate.update(sql, 1);
        }

    2:NamedParameterJdbcTemplate

      使用与JdbcTemplate 最大的区别就是 使用命名符号来代表占位符? 使SQl 容易理解  但是 代码量增加了,取舍在于个人

        
        @Test
        public void findById() {
            NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource());
            String sql="select * FROM student where name like (:regxp)";
            /*
             * jdbctemplate 用?站位
             * NamedParameterJdbcTemplate : 使用:xxx 站位 通过hashmap 写入参数
             * map:
             * String:参数名称
             * Object:参数值
             */
            HashMap<String, Object> paMap = new HashMap<>();
            paMap.put("regxp", "%");
            BeanPropertyRowMapper<Student> rowMapper = new BeanPropertyRowMapper<>(Student.class);
            List<Student> list = template.query(sql,paMap, rowMapper);
            System.out.println(list);
        }
        
        @Test
        public void insert_Stu() {
            NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(JDBCUtils.getDataSource());
            String sql="insert into student(name,gender,birthday) values(:name,:gender,:birthday)";
            HashMap<String, Object> paramMap = new HashMap<>();
            paramMap.put("name", "如来佛祖");
            paramMap.put("gender", "1");
            paramMap.put("birthday", "2019-2-2");
            if(template.update(sql, paramMap)>0) {
                System.out.println("true");
            }
        }

  • 相关阅读:
    Python:在一个moudle如何引入另一个moudle下面的包
    RobotFramework做自动化中,能定位到iFrame里面,怎么在iFrame里面输入文字?
    RobotFramework框架做自动化的过程中,遇到不能选择下拉框问题
    雕刻机虚拟仿真及上位机设计(Labview上位机+Proteus仿真)
    医学成像原理——NMR/MRI成像基础
    数字图像处理(二) 灰度变换与空域滤波
    数字图像处理(一) 数字图像基础
    Python爬虫笔记
    python数据分析-第一周
    pyhton-web开发
  • 原文地址:https://www.cnblogs.com/dgwblog/p/11801691.html
Copyright © 2011-2022 走看看