JdbcTemplate实现CRUD操作

简介

DBUtils工具类实现CRUD操作

使用DBUtils工具类实现CRUD操作,释放资源关闭连接等操作还是要自己手写实现。而使用JdbcTemplate,它不仅处理了资源的建立和释放,帮我们避免一些常见的错误,比如忘了要关闭连接。

JdbcTemplate是Spring的一部分,JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。

使用步骤

1.准备一个连接池工具类(JDBCUtils.java)

数据库连接池
注:这里使用Druid数据库连接池

2.导入依赖的jar包

在这里插入图片描述

3.创建JdbcTemplate对象,传入Druid数据库连接池(数据源)

4. 调用execute、update、queryXxx等方法执行相应操作

扩展:在JdbcTemplate中执行SQL语句的方法大致分为3类:

  1. execute:可以执行所有SQL语句,一般用于执行建库建表等DDL语句。
  2. update:用于执行INSERT、UPDATE、DELETE等DML语句。
  3. queryXxx:用于数据查询的DQL语句。

代码示例

JdbcTemplate实现增删改

  /*
    JdbcTemplate实现增删改
     */
    //使用JdbcTemplate对象的update方法进行增删改
    @Test
    public void testUpdate(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            //增
            jdbcTemplate.update("insert into test_person values(null,?,?,?)","百里",123,"200102");
            //改
            jdbcTemplate.update("update test_person set password=? where id=?","000000",1);
            //删
            jdbcTemplate.update("delete from test_person where username=?","百里");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

JdbcTemplate实现查询

使用JdbcTemplate对象的queryForObject方法查询返回int或long类型数据

  //使用JdbcTemplate对象的queryForObject方法查询返回int或long类型数据
    /*
    spring 3.2.2之后,JdbcTemplate对象的queryForInt方法返回一个整数与queryForLong方法返回一个long类型的数据,已过时。
    可用queryForObject方法代替
    代替的方法为queryForObject(String sql, Object[] args, Class<T> requiredType),
    需要返回的是什么类型,第三个参数则写什么类型,
    如:int类型写Integer.class,  long类型写Long.class
    */
    @Test//以返回int类型的数据为例:
    public void testqueryForObjectReturnInt(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT COUNT(*) FROM test_person";
            Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
            System.out.println(integer);

            //SQL语句中使用?占位,在queryForObject方法的Object数组中传入对应的参数。
//            String sql1 = "SELECT COUNT(*) FROM test_person where id >?";
//            Integer integer1 = jdbcTemplate.queryForObject(sql1, new Object[]{7}, Integer.class);
//            System.out.println(integer1);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

使用JdbcTemplate对象的queryForObject(String sql, Object[] args, Class requiredType) 方法查询返回String类型数据

 //使用JdbcTemplate对象的queryForObject(String sql, Object[] args, Class<T> requiredType) 方法查询返回String类型数据
    @Test
    public void testqueryForObjectReturnString(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT username FROM test_person where id =?";
            String s = jdbcTemplate.queryForObject(sql, new Object[]{7}, String.class);
            System.out.println(s);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

queryForObject(String sql, RowMapper rowMapper, @Nullable Object… args) 方法查询返回一个对象

    //queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) 方法查询返回一个对象
    @Test
    public void testqueryForObjectReturnObj(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT * FROM test_person where id =?";

//            Person person = jdbcTemplate.queryForObject(sql, new RowMapper<Person>() {
//                @Override
//                public Person mapRow(ResultSet resultSet, int i) throws SQLException {
//                    Person person = new Person();
//                    person.setId(resultSet.getInt("id"));
//                    person.setUsername(resultSet.getString("username"));
//                    person.setPassword(resultSet.getString("password"));
//                    person.setBirthday(resultSet.getDate("birthday"));
//                    return person;
//                }
//            }, 7);

            //BeanPropertyRowMapper类实现了RowMapper接口,简化了对数据封装的操作
            Person person = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Person.class), 7);
            System.out.println(person);
            
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

使用JdbcTemplate对象的queryForMap(String sql, Object… args)方法查询返回一个Map集合对象

  @Test
    public void testqueryForMap(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT * FROM test_person where id =?";
            Map<String, Object> stringObjectMap = jdbcTemplate.queryForMap(sql,6);
            System.out.println(stringObjectMap);
            //map的key是数据库中该条记录各字段名,map的value是数据库中该条记录各字段名对应的值
            //{id=6, username=张三, password=123456, birthday=2020-02-25}
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

使用JdbcTemplate对象的queryForList(String sql, Object… args)方法返回一个List集合对象,集合对象存放的是Map类型的数据

 //使用JdbcTemplate对象的queryForList(String sql,  Object... args)方法返回一个List集合对象,集合对象存放的是Map类型的数据
    @Test
    public void testqueryForList(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT * FROM test_person where id >=?";
            List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql, 7);
            System.out.println(mapList);
            //将查询到的一记录放到一个Map中,查询到的多条记录对应多个Map,再把这多个Map放到一个List集合中
            //[{id=7, username=李四, password=000000, birthday=2020-02-24}, {id=8, username=王五, password=888888, birthday=2020-02-23}]

            //遍历集合
            for (Map<String, Object> map:mapList) {
                System.out.println(map);
                //{id=7, username=李四, password=000000, birthday=2020-02-24}
                //{id=8, username=王五, password=888888, birthday=2020-02-23}
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

使用JdbcTemplate对象的query方法,执行查询语句,以RowMapper/BeanPropertyRowMapper做映射返回对象,构成一个集合并返回。

 /*使用JdbcTemplate对象的query方法,以RowMapper做映射返回对象
    public <T> List<T> query(String sql, RowMapper<T> rowMapper):执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。
     */
    @Test
    public void testqueryForRowMapper(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT * FROM test_person ";

            List<Person> personList = jdbcTemplate.query(sql, new RowMapper<Person>() {
                //在匿名内部类中将结果集中的一行记录转成一个Person对象
                @Override
                public Person mapRow(ResultSet resultSet, int i) throws SQLException {
                    Person person = new Person();
                    person.setId(resultSet.getInt("id"));
                    person.setUsername(resultSet.getString("username"));
                    person.setPassword(resultSet.getString("password"));
                    person.setBirthday(resultSet.getDate("birthday"));
                    return person;
                }
            });
            //遍历personList
            for (Person p :personList) {
                System.out.println(p);
                // Person{id=6, username='张三', password='123456', birthday=2020-02-25}
                // Person{id=7, username='李四', password='000000', birthday=2020-02-24}
                // Person{id=8, username='王五', password='888888', birthday=2020-02-23}
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }



    /*使用JdbcTemplate对象的query方法,以BeanPropertyRowMapper做映射返回对象,简化前面的操作
       public class BeanPropertyRowMapper<T> implements RowMapper<T>: BeanPropertyRowMapper类实现了RowMapper接口。
     */
    @Test
    public void testqueryForBeanPropertyRowMapper(){
        try {
            //创建JdbcTemplate对象
            JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
            String sql = "SELECT * FROM test_person ";

            List<Person> personList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Person.class));

            //遍历personList
            for (Person p :personList) {
                System.out.println(p);
                //Person{id=6, username='张三', password='123456', birthday=2020-02-25 00:00:00.0}
                //Person{id=7, username='李四', password='000000', birthday=2020-02-24 00:00:00.0}
                //Person{id=8, username='王五', password='888888', birthday=2020-02-23 00:00:00.0}
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

发布了48 篇原创文章 · 获赞 18 · 访问量 2941

猜你喜欢

转载自blog.csdn.net/qq_45615417/article/details/104261555
今日推荐