jdbcTemplate

定义:jdbcTemplate就是spring框架对jdbc的封装,但是还是依赖连接池,目的就是使jdbc更加容易使用,

  jdbcTemplate是spring的一部分jdbcTemplate处理了资源的释放和建立,帮助了我们避免常见的错误,
  比如忘了关闭流,他运行核心的jdbc工作流,如:PreparedStatement的建立和执行,而我们只需要提供sql语句即可提取结果!!
 

环境:
如果使用的是c3p0 jdbcTemplate相关的jar包5个 +c3p0 2个+mysql一个 =8个jar包
如果使用的是druid jdbcTemplate相关的jar包5个+druid1个+MySQl一个 =7个jar包

步骤:
1.准备c3p0连接池
2.导入依赖jar包
3.创建jdbcTemplate对象,传入c3p0连接池 构造函数为:public jdbcTemplate (DataSource datasource)
4.调用execute(),updata(),queryxxx() 方法,所以有了这个从头到尾进行jdbc操作就只需要准备sql就可以了!

封装工具类jdbcUtils
将jdbctemplate的操作封装一个工具类中,这样使用起来更加的方便

 public class jdbcTemplateUitls{
    //私有静态化数据源,这样程序启动以后,内存中始终就维护一个数据连接池,不需要再去重复创建
    private static final DataSource ds =new CombopooledDataSource();
    //提供jdbcTemplateUilts方法
    public static jdbcTemplate getjdbcTemplate(){
       JdbcTemplate jdbcTemplate =new JdbcTemplate(ds);
       return jdbcTemplate;
    }
 }
 

对jdbcTemplate中方法的演示:重点

execute()方法:这个方法主要是用来执行数据库的DDL操作!!!

/*对这个jdbcTemplate模板工具类的测试,对数据库的DDL操作!*/
public class jdbcTemplateDemo1 {

  public static void main(String[] args) {
    DDL();

  }

  //对数据库的ddl操作,通过jdbc模板工具类
  public static void DDL(){
      //1.首先创建一个jdbcTemplate对象,通过调用工具类的方法
      JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
      //准备sql语句,执行sql语句
     
      String sql="create table User(" +
              "uid int primary key auto_increment," +
              "username varchar(20)," +
              "password varchar(20))";
              
      //执行sql语句
      jdbcTemplate.execute(sql);

  }

}

update()方法 :这个方法主要是执行DML操作!!!

/*利用jdbc模板工具类对数据库表的dml操作,对表中数据的增加 删除 修改*/
public class jdbcTemplateDemo2 {

 public static void main(String[] args) {
     //add();
     //modify();
     //delete();
 }

 //定义方法增加一条数据
 public static void add(){

     //获取jdbcTemplate对象
     JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
     //准备sql语句
     String sql="insert into User values(null,'大海','123456')";
     //执行sql语句
     int num = jdbcTemplate.update(sql);
     //判断
     if(num>0){
         System.out.println("插入一条数据成功!");
     }
 }

 //定义方法修改一条数据
 public static void modify(){
     //获取jdbcTemplate对象
     JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
     /*
     //准备sql语句
     String sql="update User set username='长江',password='123' where uid=1";
     //执行sql语句
     int num = jdbcTemplate.update(sql);
     */

     //或者用这种写法也是可以的(推荐使用这种写法)
     int num = jdbcTemplate.update("update User set username=? where uid=?", "dahai", "1");

     //判断
     if(num>0){
         System.out.println("修改一条数据成功!!");
     }

 }

 //定义方法删除一条数据
 public  static void delete(){

     //获取jdbcTemplate对象
     JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
     //准备sql语句
     String sql="delete from User where uid=?";
     //执行sql语句、
     int num = jdbcTemplate.update(sql, "1");
     //判断
     if(num>0){
         System.out.println("删除一条数据成功!");
     }
 }
}

queryxxx()方法 查询的方法很多,但是有几个是比较重要的也比较常见,这些方法主要用来查询表中的数据

public class jdbcTemplateDemo3 {
  public static void main(String[] args) {
      // queryformap();
      // queryforlist();
      // queryforobject();
      // queryforobject2();
      // queryforobject3();
  }
  //queryForMap查询一条结果封装成map集合,字段作为map集合的key,每个字段对应的数据记录作为map集合的value
  public static void queryformap(){
      //调用工具类,获取jdbcTemplate对象
      JdbcTemplate jdbcTemplate =jdbcTemplateUtils.getJdbcTemplate();
      //准备sql语句
      String sql="select * from student where id =?";
      //执行sql语句
      Map<String, Object> map = jdbcTemplate.queryForMap(sql, 1);
      //处理结果集,将map集合打印出来
      for (String s : map.keySet()) {                        //遍历所有的key,然后通过key拿到value的方式遍历集合
          System.out.println(s+"==="+map.get(s));
      }
      
     //遍历map集合的方式二
      Set<Map.Entry<String, Object>> entries = map.entrySet();//遍历所以的键值对的方式遍历集合
      for (Map.Entry<String, Object> entry : entries) { //遍历所有的set集合,这个set集合中装的是键值对

          System.out.println(entry.getKey()+"==="+entry.getValue());
      }

  }
  
//queryForlist 还可以查询所有的数据

public static void queryforlist(){
    //调用工具类,获取jdbcTemplate方法,获取jdbcTemplate对象
    JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
    //准备sql语句
    String sql="select * from student";
    //执行sql语句
    List<Map<String, Object>> maps =jdbcTemplate.queryForList(sql);
    //遍历list集合拿到map集合中的每一条数据  嵌套循环遍历
    for (Map<String, Object> map : maps) {
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        for (Map.Entry<String, Object> entry : entries) {
            System.out.println(entry.getKey()+"------"+entry.getValue());
        }
    }

    //遍历方式二,使用keyset遍历map集合
    for (Map<String, Object> map : maps) {
        Set<String> key = map.keySet();
        for (String string : key) {
            System.out.println(key+"------"+map.get(key));
        }
    }

}
    //queryForObject()  方法查询结果,方法中传入一个接口的匿名内部类(比较繁琐,用的比较少)
    //使用这个方法的前提:已经很封装好了javaBean类
    public static void queryforobject(){
        //调用工具类,获取到这个jdbcTemplate对象
        JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
        //准备sql语句
        String sql="select * from student where id =?";
        //执行sql语句
        student stu = jdbcTemplate.queryForObject(sql, new RowMapper<student>() {
            @Override
            public student mapRow(ResultSet resultSet, int i) throws SQLException {
                //这个方法是实现了这个RowMap接口必须要实现的方法
                //这个方法就是resultset这结果集封装到javaBean对象中
                  //1.首先创建javaBean类的对象
                      student stu=new student();
                  //2.通过get/set方法封装数据到javabean中
                       stu.setId(resultSet.getInt("id"));
                       stu.setName(resultSet.getString("name"));
                       stu.setCity(resultSet.getString("city"));
                       stu.setAge(resultSet.getInt("age"));
                return stu;
            }
            //RowMap 是一个接口的对象,但是接口没有对象,只可能是一个接口实现类的对象,所有就直接使用匿名对象

        }, 1);

        //打印结果,直接打印对象
        System.out.println(stu);
    }
//queryforobject 方法将查询的某一个记录封装成一个对象,效果和上面方法一样,但是方法使用更加简单

public static void queryforobject2(){

    //通过工具类拿到jdbcTemplate对象
    JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
    //准备sql语句
    String sql="select * from student where id=?";
    //执行sql语句
    student stu = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<student>(student.class), 1);
    //打印输入封装好的对象
    System.out.println(stu);
}
//queryforobject 方法,查询所有的记录封装成一个对象的集合,然后返回
public static void queryforobject3(){
    //通过工具类拿到jdbcTemplate对象
    JdbcTemplate jdbcTemplate = jdbcTemplateUtils.getJdbcTemplate();
    //准备sql语句,查询所有
    String sql="select * from student";
    //执行sql语句
    List<student> stuList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(student.class));
    //遍历这stuList即可
    for (student student : stuList) {
        System.out.println(student);
    }
}

}