隐藏

JdbcTemplate实现CRUD操作

发布:2021/7/25 21:33:52作者:管理员 来源:本站 浏览次数:1180

文章目录

简介

使用步骤

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

2.导入依赖的jar包

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

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

代码示例

JdbcTemplate实现增删改

JdbcTemplate实现查询

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

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

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

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

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

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

简介

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类:


execute:可以执行所有SQL语句,一般用于执行建库建表等DDL语句。

update:用于执行INSERT、UPDATE、DELETE等DML语句。

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();

       }

   }