JDBC基本使用

JDBC

1.jdbc 的概率

2.掌握jdbcc操作数据库的步骤

3.Connection接口(连接接口)和Statement接口( 语句接口)

4.了解注入jdbc

JDBC(Java Database Connectivity),是java连接数据的一套API,是java连接数据库的技术

现在是Java定制了一套标准API,都是接口。然后把所有的实现丢给数据库厂商。数据库厂商书写好各自的实现类

驱动包

1.程序需要使用哪一个数据库,就把该数据厂商提供的jdbc实现导入程序中

2.我们的程序中,只需要写接口类型及调用接口的方法,不需要关心底层数据库的实现

3.下载驱动包:https://mvnrepository.com/,数据库厂商针对数据库的实现,实现类比较多,统一打成一个jar包。

导入工程

1.先建立一个工程文件

2.在项目的跟目录下建立一个lib包,将jar包拷贝进lib包

3.在ldea中的文件(File)-->项目结构-(Project Structure)->库(Librarires)

4.点击左上角 + ,在点击java ,在选择需要导入的jar包即可,最后点击应用

5.成功后,lib包中就不仅仅只是一个文件,变成了一个jar包

JDBC工作过程

应用程序<------->jdbcapi<------>jdbc驱动程序管理器<-------->jdbc驱动程序<------>网络协议api<--------->数据库服务器(数据库)

JDBC常用API

Driver类----数据库厂商书写的各种各样的实现类自动于程序中书写的接口进行绑定(只需要在jdbc之前,将其加载一次即可)

 Class.forName("com.mysql.cj.jdbc.Driver");

DriverManger -------驱动管理器,是jdbc的体系结构的支柱,主要是把java应用程序连接到jdbc驱动程序上

DriverManger.getConnection(url,user,password);

Connection接口(连接)--------定义数据库和java程序进行通讯的通道,SQL语句就是通过它从程序传输到数据库,SQL执行后的结果又有他来返回。也可以用于创建Statement对象

ps:用完以后必须关闭,否则会浪费资源

Statement--------用于SQL语句的接口,通过相关方法执行静态的SQL语句

excuteUpdate(); 执行DML(增、删、改)
excuteQuery(); 执行DQL(查)

PreparedStatement--------执行存储过程, 提供了预编译SQL语句功能,SQL语句的执行方法,可以避免SQL注入

excuteUpdate();// DML语句,得到影响的行数 int
excuteQuery();// DQL语句,得到查询的结果集 ResultSet

ps:PreparedStatement类(驱动管理器)是在其对象时以SQL语句为参数,在通过PreparedStatement执行SQL语句,其方法不需要再传入SQL语句

CallableStatement--------接受某查询SQL查询语句所返回的结果及对象

ResultSet(结果集) -- 表示查询结果,可以通过循环行,从行的每一列中取出对应的数据

JDBC开发流程

jdbc的主要完成数据库的磁盘数据和内存中对象数据的交换,本质上是流的操作

1.加载驱动(目前是自动完成加载的,可以不用书写代码,建议写上)

// 根据驱动包及数据库版本的不同,需要加载的驱动类不同
// mysql5 com.mysql.jdbc.Driver
// mysql8 com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.cj.jdbc.Driver");

eg:java8以上可以不用谢加载驱动,但是建议写。

2.根据驱动管理器建立连接

​
// url 数据库的位置 
// 协议://IP地址:端口/数据库名称?配置1&配置2&配置3
//user:连接数据库的用户名
//password:密码。
Connection con = DriverManger.getConnection(url,user,password);

3.借助连接创建语句对象或预编译语句对象

//第一种
Statement statement = con.createStatement();
statement.excuteUpdate(SQL);// DML语句,得到影响的行数 int
statement.excuteQuery(SQL);// DQL语句,得到查询的结果集 ResultSet
//第二种(防止SQL注入)
PreparedStatement st = con.prepareStatement(预编译sql语句);
st.excuteUpdate();// DML语句,得到影响的行数 int
st.excuteQuery();// DQL语句,得到查询的结果集 

4.关闭连接,先开的后关。

使用JDBC完成添加

try {
      //1.加载驱动
      //mysql8 ----"com.mysql.cj.jdbc.Driver"
      //mysql5-----"com.mysql.jdbc.Driver"
      //在加载类时,有可能没有该类,所以该方法可能会抛出异常
      //ClassNotFoundException 类未找到异常
       Class.forName("com.mysql.cj.jdbc.Driver");//可写可不写,建议写
​
      //2.通过驱动器管理器建立数据库与java程序连接
       //url:jdbc:数据库://ip地址:数据端口//数据库名?配置名
        Connection con = DriverManager.getConnection(
             "jdbc:mysql://localhost/j194?" +
               "userSSL=true&useUnicode=true&" +
                 "characterEncoding=UTF8&serverTimezone=GMT",
             "root",
             "root");
​
       //3.通过连接对象创建statement
       // (SQL语句执行对象)
        Statement st = con.createStatement();
        //Statement(SQL语句执行对象)需要掌握
        // executeUpdate(SQL执行语句),执行DML(增、删、改)
         //executeQuery(SQL执行语句),执行DQL(查)
​
       String str= "insert into t_student(t_StudentID,f_name,t_age)"+
               "values(12,'zhangsan',18)";
         st.executeUpdate(str);
         String str = "select * from t_Student";
       //ResultSet 结果集 查询结果的集合
            ResultSet set = st.executeQuery(str);
     //next()方法:在数据库里一行一行的获取,没有则返回false
            while (set.next()){    
             //第一种索引获得  get()方法是一个重载方法
              int studentId= set.getInt(1);
              String name = set.getString(2);
              int  age = set.getInt(3);
                //根据列名
              int studentId= set.getInt("t_StudentID");
              String name = set.getString("f_name");
              int  age = set.getInt("t_age");
​
                System.out.println(studentId+" "+name+" "+age+" ");
             }         
​
            //4.关闭数据库
             set.close();
             st.close();
             con.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

   这里的关闭数据库最好放在finally块里,做个非空判断就好

执行SQL语句的种类

静态SQL:

String str = "select * from t_Student where t_id=1"

只会执行一次,效率不高

动态SQL

String str = "select * from t_Student where t_id="+stuId

使用Statement对象的缺点

当变量值发生变化时,会导致SQL语句的变化,在执行时会发生多次编译。 使用Statement对象时,效率较低。 另外,使用Statement对象时,容易引起SQL注入

SQL注入

以拼接字符串方式插入动态SQL语句值的时候,如果值中有非法字符,或 SQL语句关键字时,会导致SQL语句语法错误,或执行结果不正确的情况

PreparedStatement

javaAPI中,提供了Statement的子接口:PreparedStatement,可以解决 以上问题。 使用PreparedStatement对象执行预编译语句,能提高JAVA程序执行SQL 语句的效率

Statement与PreparedStatement的区别

1.statement是PreparedStatement的父接口,都执行SQL语句

2.Statement在执行动态SQL时,只能以拼接字符串的方式插入,效率低,容易引起SQL注入

3.PreparedStatement提供占位符方式注入值,执行SQL语句时,只编译一次,只当字符串处理,效率高,可以防止SQL注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sharding-JDBC是一款基于JDBC的分库分表中间件,可以将数据按照规则分散到多个数据库中,从而解决单个数据库的容量和性能瓶颈问题。使用Sharding-JDBC需要遵循以下步骤: 1. 引入Sharding-JDBC依赖,可以通过Maven或Gradle进行引入。 2. 编写Sharding-JDBC的配置文件,可以使用YAML或Properties格式。配置文件需要含以下内容: - 数据源配置:括数据源的类型、连接地址、用户名、密码等信息。 - 分片规则配置:括分片键、分片算法、表名等信息。 - 数据库路由配置:括数据源名称、表名称、SQL语句等信息。 3. 在Java代码中通过JDBC API访问数据,Sharding-JDBC会自动将数据分散到多个数据库中。 例如,以下是一个简单的Sharding-JDBC配置文件示例: ```yaml # 数据源配置 spring: sharding: datasource: names: ds0, ds1 ds0: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db0 username: root password: root ds1: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db1 username: root password: root # 分片规则配置 sharding: tables: user: actualDataNodes: ds$->{0..1}.user$->{0..1} tableStrategy: standard: shardingColumn: id shardingAlgorithmName: preciseModulo # 数据库路由配置 props: sql.show: true ``` 在Java代码中使用Sharding-JDBC访问数据的示例: ```java // 获取数据源 DataSource dataSource = ShardingDataSourceFactory.createDataSource(yamlFile); // 创建连接 try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { // 执行查询 ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // 处理结果集 } } ``` 以上是Sharding-JDBC基本使用方法,具体的配置和使用方式可以参考Sharding-JDBC的官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值