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 =?";
				/* 自定义类型转换器,查询单个。   查询多个使用jdbcTemplate.query()
              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();
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinking in Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值