JDBC规范与实现

JDBC

一、JDBC的概述

二、获取数据库连接

//1.JDBC: sun公司提供的一套api(java.sqL ,javax.sql ) ,
//    使用这套api可以实现对数据的连接和操作(DML、DDL )

// 2.如下代码来测试:
//    获取mysql数据库连接要想获取连接,准备工作:
//        1.mysqL服务开启
//        2.连接的基本条件:指名数据库的ip地址、端口号、用户名、密码
//        3.导入mysql的驱动(即为jdbc中相关接口的实现类的集合)
// 3.网络编程中的URL:代表着互联网当中的某一资源的地址
//http://192.168.21.34:8080/gmall/index.jsp?user=tom
//协议      ip地址    端口号  目标资源      参数列表

1.连接方式一

import org.junit.Test;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionText {

//    获取数据库的连接方式一
  @Test
    public void test1() throws SQLException{

      //提供mysql 中 Driver 接口的实现类
      Driver driver= new com.mysql.jdbc.Driver ();
      //注册驱动
  DriverManager.registerDriver (driver);

     String url ="jdbc:mysql://localhost:3306/test";//test 表示具体的数据库
      String user ="root";
      String password ="fan1116.";

      //获取连接
     Connection connection = DriverManager.getConnection (url,user,password);
      System.out.println (connection);
    }
    
}

2.连接方式二(反射)

  //获取数据库的连接方式二:使用反射实现Driver的实例化
  //面向接口编程
  @Test
  public void test2() throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {

      //提供mysql 中 Driver 接口的实现类的对象
String className ="com.mysql.jdbc.Driver";
Class  classzz=Class.forName (className);
      Driver driver= (Driver) classzz.newInstance ();
      //注册驱动
      DriverManager.registerDriver (driver);

      String url ="jdbc:mysql://localhost:3306/bjpowernode";//`bjpowernode 表示具体的数据库
      String user ="root";
      String password ="fan1116.";

      //获取连接
      Connection connection = DriverManager.getConnection (url,user,password);
      System.out.println (connection);
  }

3.连接方式三

    //    获取数据库的连接方式三
    @Test
    public void test3() throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {

        //1.获取四个基本信息
        String className ="com.mysql.jdbc.Driver";
        String url ="jdbc:mysql://localhost:3306/bjpowernode";//`bjpowernode 表示具体的数据库
        String user ="root";
        String password ="fan1116.";

        //2.加载驱动
        Class.forName (className);

        //3.获取连接
        Connection connection = DriverManager.getConnection (url,user,password);
        System.out.println (connection);
    }

***4.连接方式四(配置文件)

className=com.mysql.jdbc.Driver
url =jdbc:mysql://localhost:3306/bjpowernode
user =root
password =fan1116.
    //使用配置文件的好处?
    //1.实现数据和代码的分离
    //2.编写的java程序在部署到服务器上时,需要打包。I如果java代码修改过就需要重新打包。使用配置文件的方式,如果配置信息修改,并没有导致代码的修改。所以不需要重写打包。
  //   获取数据库的连接方式四——将数据库连接的基本信息声明在配置文件中
   @Test
   public void test4() throws IOException, ClassNotFoundException, SQLException {
//读取配置文件中的四个信息
       Properties properties=new Properties ();
     //加载资源的路径默认为: src下
  InputStream is= ClassLoader.getSystemClassLoader ().getResourceAsStream ("jdbc.properties");

       properties.load(is);
     String className=  properties.getProperty ("className");
       String url=  properties.getProperty ("url");
       String user=  properties.getProperty("user");
       String password=  properties.getProperty ("password");
       //2.加载驱动
       Class.forName (className);

       //3.获取连接
       Connection connection = DriverManager.getConnection (url,user,password);
       System.out.println (connection);

   }

三、数据库连接池

1.使用数据库连接池的好处?

1.更方便的获取连接对象,效率高
2.资源可以更好的重复利用
3.便于进行必要的管理

2.有哪些数据库连接池技术呢?

DBCP :速度快,不稳定
C3Pe:稳定、速度慢
Druid:兼具二者兼备

Datasource通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把Datasource称为连接池

3.使用Druid获取连接的方式1

import com.alibaba.druid.pool.DruidDataSource;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;

public class DruidTest {

@Test
    public  void test1() throws SQLException {
    DruidDataSource source = new DruidDataSource ();

    //设置四个基本信息
    source.setUsername ("root");
    source.setPassword ("fan1116.");
    source.setUrl ("jdbc:mysql://localhost:3306/bjpowernode");
    source.setDriverClassName ("com.mysql.jdbc.Driver");

    Connection connection=source.getConnection ();
    System.out.println (connection);

    //设置最大可以连接的连接池数量为6
    source.setMaxActive (6);
}

}

4.使用Druid获取连接的方式2(将数据库连接的基本信息声明在配置文件中)

DriverClassName=com.mysql.jdbc.Driver
url =jdbc:mysql://localhost:3306/bjpowernode
username =root
password =fan1116.
@Test
    public  void test2() throws Exception {
    //提供Properties,并加载指令
    Properties pros=new Properties ();
    //加载资源的路径默认为: src下
    InputStream is= ClassLoader.getSystemClassLoader ().getResourceAsStream ("Druid.properties");
    pros.load (is);
    //通过DruidDataSourceFactory创建一个数据源
    DataSource dataSource = DruidDataSourceFactory.createDataSource (pros);
  //通过数据源获取连接
    System.out.println (dataSource.getConnection ());

}

***5.生成JDBCUtils

package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/*

提供JDBC的工具类,用于获取数据库的连接等操作

*/
public class JDBCUtils {
//获取数据库连接的方式
    public  static Connection getconnection() throws Exception {
        //提供Properties,并加载指令
        Properties pros = new Properties ();
        //加载资源的路径默认为: src下
        InputStream is = ClassLoader.getSystemClassLoader ().getResourceAsStream ("Druid.properties");
        pros.load (is);
        //通过DruidDataSourceFactory创建一个数据源
        DataSource dataSource = DruidDataSourceFactory.createDataSource (pros);
        //通过数据源获取连接
        Connection connection = dataSource.getConnection ();
        return connection;

    }

    //资源的关闭
    public  static void close(Connection connection)  {
        if(connection!=null){
            try {
                connection.close ();
            } catch (SQLException e) {
                e.printStackTrace ();
            }
        }
    }

}

package test;

import org.junit.Test;
import util.JDBCUtils;

import java.sql.Connection;

public class JDBCUtilsTest {

    @Test
    public  void test1() throws  Exception{
        Connection connection= JDBCUtils.getconnection ();

        System.out.println (connection);

    }
}

三、数据表的增添查改

1.使用QueryRunner向数据表中插入数据

连接  JDBCUtilspackage crud;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import util.JDBCUtils;

import java.sql.Connection;

//测试向表中增加、删除、修改
public class UpdateTest {

    //向数据表中增加一条记录
    @Test
    public  void test1()  {
        Connection getconnection = null;
        try {
//1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();
//2.提供一个添加的SQL
            String sql="insert into copy(ename,sal)values('霸王花',9999)";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
            QueryRunner runner=new QueryRunner ();
            int count = runner.update (getconnection,sql);
            System.out.println ("添加了"+count+"记录");
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //4.资源的关闭
            JDBCUtils.close(getconnection);
        }
    }


}

2.使用带占位符的sql添加记录

package crud;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import util.JDBCUtils;

import java.sql.Connection;

//测试向表中增加、删除、修改
public class UpdateTest {

 

    //向数据表中增加一条记录
    @Test
    public  void test2()  {
        Connection getconnection = null;
        try {
//1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();
//2.提供一个占位符的SQL
            String sql="insert into copy(ename,sal)values(?,?)";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
            QueryRunner runner=new QueryRunner ();
            int count = runner.update (getconnection,sql,"fan",990);
            System.out.println ("添加了"+count+"记录");
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //4.资源的关闭
            JDBCUtils.close(getconnection);
        }
    }

}
package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/*

提供JDBC的工具类,用于获取数据库的连接等操作

*/
public class JDBCUtils {
//获取数据库连接的方式
    public  static Connection getconnection() throws Exception {
        //提供Properties,并加载指令
        Properties pros = new Properties ();
        //加载资源的路径默认为: src下
        InputStream is = ClassLoader.getSystemClassLoader ().getResourceAsStream ("Druid.properties");
        pros.load (is);
        //通过DruidDataSourceFactory创建一个数据源
        DataSource dataSource = DruidDataSourceFactory.createDataSource (pros);
        //通过数据源获取连接
        Connection connection = dataSource.getConnection ();
        return connection;

    }

    //资源的关闭
    public  static void close(Connection connection)  {
        if(connection!=null){
            try {
                connection.close ();
            } catch (SQLException e) {
                e.printStackTrace ();
            }
        }
    }

}

3.删除记录的操作

   //向数据表中删除一条记录
    @Test
    public  void test3()  {
        Connection getconnection = null;
        try {
//1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();
//2.提供一个占位符的SQL
            String sql="delete from  copy where sal > ?";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
            QueryRunner runner=new QueryRunner ();
            int count = runner.update (getconnection,sql,1000);
            System.out.println ("删除了"+count+"记录");
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //4.资源的关闭
            JDBCUtils.close(getconnection);
        }
    }

4.修改记录的操作

  //向数据表中修改一条记录
    @Test
    public  void test4()  {
        Connection getconnection = null;
        try {
//1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();
//2.提供一个占位符的SQL
            String sql="update  copy set ename=? where sal=?";
//3.提供使用好的QueryRunner,调用update()方法,实现数据的插入
            QueryRunner runner=new QueryRunner ();
            int count = runner.update (getconnection,sql,"fan",666);
            System.out.println ("删除了"+count+"记录");
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //4.资源的关闭
            JDBCUtils.close(getconnection);
        }
    }

5.BeanHandle和BeanListHandle查询表中的记录

package crud;

import bean.Customer;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;
import util.JDBCUtils;

import java.sql.Connection;
import java.util.List;

public class QueryTest {
//BeanHandler对应查询表中的一条记录,以对象的身份
    @Test
    public  void test1()  {
        Connection getconnection = null;
        try {
            //1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();

            //2.获取一条带占位符的查询语句
            String sql="select ename from copy where ename=?";
            //3.创建QueryRunner的实例
            QueryRunner runner=new QueryRunner ();

            //4.通过QueryRunner的实例,调用其query()
            BeanHandler<Customer> handler=new BeanHandler (Customer.class);
            Customer customer = runner.query (getconnection, sql, handler, "fan");
            System.out.println (customer);
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //5.关闭资源
            JDBCUtils.close (getconnection);
        }
    }

    
    //BeanListHandler :对应查询表中的多条记录,以对象构成的集合的方式返回
    @Test
    public  void test2()  {
        Connection getconnection = null;
        try {
            //1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();

            //2.获取一条带占位符的查询语句
            String sql="select sal from copy where sal>?";
            //3.创建QueryRunner的实例
            QueryRunner runner=new QueryRunner ();

            //4.通过QueryRunner的实例,调用其query()
            BeanListHandler<Customer> handler=new BeanListHandler (Customer.class);
            List<Customer> customerList = runner.query (getconnection, sql, handler, 100);

            customerList.forEach (System.out::println);
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //5.关闭资源
            JDBCUtils.close (getconnection);
        }
    }
}
package bean;

public class Customer<varchar> {
/*    ORM编程思想:
    数据库中的一个表          与        Java中的一个类对应
    表中的一条记录            与        类中一个对象对应
    表中的一个列(或字段)      与        类中的一个属性对应


*/

private  varchar ename;
private  double sal;

    public varchar getEname() {
        return ename;
    }

    public void setEname(varchar ename) {
        this.ename = ename;
    }

    public double getSal() {
        return sal;
    }

    public void setSal(double sal) {
        this.sal = sal;
    }


    public Customer() {
    }

    public Customer(varchar ename, double sal) {
        this.ename = ename;
        this.sal = sal;
    }

    @Override
    public String toString() {
        return "Customer{" + "ename=" + ename + ", sal=" + sal + '}';
    }
}

6.MapHandler_MapListHandler_ScalarHandler的使用

import bean.Customer;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;
import util.JDBCUtils;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

public class QueryTest {
    //MapHandler :对应查询表中一条记录,以map对象的方式返回
    //map中的key为表中的字段名,map中的value为表中一条数据的数据值
    @Test
    public  void test3()  {
        Connection getconnection = null;
        try {
            //1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();

            //2.获取一条带占位符的查询语句
            String sql="select ename,sal from copy where sal>?";
            //3.创建QueryRunner的实例
            QueryRunner runner=new QueryRunner ();

            //4.通过QueryRunner的实例,调用其query()
         ResultSetHandler<Map<String,Object>> mapHandler = new MapHandler ();
            Map<String, Object> map= runner.query (getconnection, sql, mapHandler, 100);

        System.out.println (map);
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //5.关闭资源
            JDBCUtils.close (getconnection);
        }


    }


    //MapListHandler :对应查询表中的多条记录,以map对象构成maplist的方式返回
    //map中的key为表中的字段名,map中的value为表中一条数据的数据值
    @Test
    public  void test4()  {
        Connection getconnection = null;
        try {
            //1.获取数据库的连接
            getconnection = JDBCUtils.getconnection ();

            //2.获取一条带占位符的查询语句
            String sql="select ename,sal from copy where sal>?";
            //3.创建QueryRunner的实例
            QueryRunner runner=new QueryRunner ();

            //4.通过QueryRunner的实例,调用其query()
           ResultSetHandler<  List<Map<String, Object>> > mapListHandler = new MapListHandler ();
            List<Map<String, Object>> mapList = runner.query (getconnection, sql, mapListHandler, 100);

           mapList.forEach (System.out::println);
        } catch (Exception e) {
            e.printStackTrace ();
        } finally {
            //5.关闭资源
            JDBCUtils.close (getconnection);
        }


    }


    /*
    * scalarHandler:用于查询表中的特殊值
    */
  @Test
  public  void  test5(){

      Connection getconnection = null;
      try {
          //1.获取数据库的连接
          getconnection = JDBCUtils.getconnection ();

          //2.获取一条带占位符的查询语句
          String sql="select count(*) from copy";
          //3.创建QueryRunner的实例
          QueryRunner runner=new QueryRunner ();

          //4.通过QueryRunner的实例,调用其query()
          ScalarHandler<Object> handler = new ScalarHandler<> ();
          long  count  = (long) runner.query (getconnection, sql, handler);
          System.out.println ("一共查询到"+count +"条数据");
      } catch (Exception e) {
          e.printStackTrace ();
      } finally {
          //5.关闭资源
          JDBCUtils.close (getconnection);
      }

  }
}
    }
}

7.属性名和字段名不一致的情况——使用别名

如果表中的字段名与类中的属性名不一致,为了查询操作结果的准确性,我们需要编写sqL时,使用类的属性名作为select后字段的别名出现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tSMINQB-1643371823229)(C:\Users\86173\AppData\Roaming\Typora\typora-user-images\image-20211115230548012.png)]

String sql="select count(*) from copy";
      //3.创建QueryRunner的实例
      QueryRunner runner=new QueryRunner ();

      //4.通过QueryRunner的实例,调用其query()
      ScalarHandler<Object> handler = new ScalarHandler<> ();
      long  count  = (long) runner.query (getconnection, sql, handler);
      System.out.println ("一共查询到"+count +"条数据");
  } catch (Exception e) {
      e.printStackTrace ();
  } finally {
      //5.关闭资源
      JDBCUtils.close (getconnection);
  }

}
}
}
}


## 7.属性名和字段名不一致的情况——使用别名

> 如果表中的字段名与类中的属性名不一致,为了查询操作结果的准确性,我们需要编写sqL时,使用类的属性名作为select后字段的别名出现。
![在这里插入图片描述](https://img-blog.csdnimg.cn/11229304275143d6911c7e204c181364.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aSn5Zmo5pma5oiQaQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值