JDBC与MYSQL数据库

加载MYSQL数据库驱动

本作者使用的开发工具是IntelliJ IDEA,其他集成环境也是类似的原理。

下载MYSQL数据库驱动

JDBC即(Java Data Base Connectivity),应用程序为了能访问MYSQL数据库服务器上的数据库,必须保证应用程序所驻留的计算机上安装有相应的JDBC-MYSQL驱动。可以到官网:www.mysql.com下载,也可以使用我下载好的mysql驱动。
1.登录官网www.mysql.com之后,在页面的导航条上选择Products
在这里插入图片描述
2.在页面右侧区中的MySQL Features下选择MYSQL Connectors
在这里插入图片描述
3.在页面右侧区域中的Developed by MySQL下选择JDBC Driver for MySQL(Connector/J)
在这里插入图片描述
4.或者也可以使用我下载好的驱动 mysql-connector-java-5.1.40-bin.jar
链接:https://pan.baidu.com/s/1XEwVXKilL9Hc7Tjhl5xXGA
提取码:5zrb
在这里插入图片描述

导入MYSQL数据库驱动

1.点击File->Project Structure
在这里插入图片描述
2.点击Modulus、点击 Dependencies 、点击 +号 、点击JARs or directories,然后选择刚才下载好的数据库驱动
在这里插入图片描述
3.导入成功后,External Libraries 中看到这个驱动了
在这里插入图片描述

加载MYSQL数据库驱动

应用程序负责加载JDBC-MYSQL数据库驱动的代码如下,使用try-catch语句是因为有可能会出现异常加载不成功

try{
    Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){  
}

连接MYSQL数据库

连接MYSQL数据库有两种方式,其中getConnction()是重载方法。

第一种连接方式

数据库连接对象只使能用Connection 来声明,不能使用new来获取。要想获取数据库连接对象,必须使用JDBC提供的API:驱动管理者DriverManager调用其方法getConnection(url)来获取。如下:

Connection con = DriverManager.getConnection(String url);

其中url的格式为

String url = "jdbc:mysql://localhost:3306/xsxk?user=root&password=root&useSSL=true&characterEncoding=utf-8";

1、localhost:这个是你所要连接的数据库所在主机的IP地址,如果是在本机则使用localhost
2、3306:这个是mysql数据库所使用的端口号,由于3306是MYSQL数据库服务器的默认端口号,连接数据库时允许应用程序省略默认的端口号
3、xsxk:这个是你所要连接的数据库的名称,我这里所连接的是本机上一个名为xsxk的数据库。
4、user=root:这个是有权访问该数据库的用户名,我使用的用户名是root
5、password=root:这个是与用户名对应的密码,我使用的密码是root
6、useSSL=true:MYSQL5.6版本以上可写可不写,5.6之后的版本必须要写;useSSL即:use Secure Socket Link,使用安全套接字连接
7、characterEncoding=utf-8:如果数据库的表的记录有汉字,那么在建立连接时必须额外多传一个参数characterEncoding,并取值gb2312或utf-8

第二种连接方式

第二种连接方式更为简介,那就是把账号和密码从URL中剥离出来,作为两个参数传递给getConnection(String url,String user,String passeord)函数,如下:

Connextion con;
String url = "jdbc:mysql://localhost:3306/xsxk?userSSL=true";
String user = "root";
String password = "root";
try{
    con = DriverManager.getConnection(url,user,password);
}catch(SQLException e){}

查询操作

发送SQL语句

1.获得SQL语句对象
SQL语句对象只能用Statement来声明,不可以使用new来生成,需要使用上面获得的数据库连接对象调用其方法createStatement()来获得,如下:

try{
    Statement sql = con.createStatement();
}catch(SQLException e){}

2.发送sql语句
sql语句对象调用方法executeQuery(“String sql”),发送SQL查询语句。
并返回一个结果集Resultset,以下是向一个名叫students的表发送查询请求:

ResultSet rs = sql.executeQuery("SELECT * FROM students");

处理查询结果

ResultSet对象一次只能看到一个数据行,使用next()方法移动到下一行,获得一行数据后,ResultSet对象可以使用getXxx()方法获得字段值,函数参数既可以是字段名也可以是阿拉伯数字表示的第几列,如getInt(“name”)或getInt(1)。值得注意的是,ResultSet对象的初始位置是在结果集第一行的前面
ResultSet的若干方法

返回类型                      方法名称
boolean                       next()
byte                          getByte(int columnIndex)//列号表示法
Date                          getDate(int columnIndex)
double                        getDouble(int columnIndex)
float                         getFloat(int columnIndex)
int                           getInt(int columnIndex)
long                          getLong(int columnIndex)
String                        getString(int columnIndex)
byte                          getByte(String columnName)//字段名
Date                          getDate(String columnName)
double                        getDouble(String columnName)
float                         getFloat(String columnName)
int                           getInt(String columnName)
long                          getLong(String columnName)
String                        getString(String columnName)

关闭连接

JDBC使用的映射技术而不是复制,对于查询得到的结果,映射到ResultSet中,就像是照镜子一样,而不是复制。这就意味着Resuluset对象和数据库连接对象实现了紧密的绑定,一旦连接对象被关闭,ResultSet中的数据立刻消失。所以我们在使用ResultSet中的数据时,必须始终保持和数据库的连接,直至使用完毕ResultSet中的数据为止,所以在使用完数据之后再调用con.close()。

顺序查询例子

所谓顺序查询,是指resultSet对象一次只能看到一个数据行,使用next方法移动到下一个数据行,下面的例子是查询xsxk(学生选课)数据库中xsb(学生表)的name字段的值

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Example {
    public static void main(String[] args) {
        Connection con = null;//数据库连接对象
        Statement sql;//SQL语句对象
        ResultSet re;//结果集对象
        try{
            Class.forName("com.mysql.jdbc.Driver");//加载JDBC-MYSQL驱动
        }
        catch (Exception e){
            System.out.println("加载失败");//异常处理
        }
        String uri = "jdbc:mysql://localhost:3306/xsxk?useSSL=true";//将要访问的数据库的URL
        String user = "root";//被授权可访问数据库的用户名
        String password = "root";//与用户名对应的密码
        try{
            con = DriverManager.getConnection(uri,user,password);//获得连接
        }
        catch (Exception e){
            System.out.println("连接获取失败");//异常处理
        }
        try{
            sql = con.createStatement();//获得SQL语句对象
            re = sql.executeQuery("SELECT  * FROM xsb");//执行查询操作
            while(re.next()){
                String xuehao = re.getString(1);//查看第一列的值(学号)
                String number = re.getString("xm");//查看xm字段的值(姓名
                System.out.print(xuehao);//输出查询到的学号
                System.out.println("     "+number);//输出查询到的姓名
            }
            con.close();//数据使用完毕后,关闭连接
        }
        catch (Exception e){
            System.out.println(e);
        }
    }
}

查询后的结果和数据库中的数据一致,如下图:
在这里插入图片描述
在这里插入图片描述

游标查询例子

结果集的游标位置在第一行的上面,使用next()方法查看数据成为顺序查询。如果想直接获得结果集中某一行的数据,就需要得到一个可滚动的结果集,为此在使用con.createStatement()方法时,我们需要做相应的变动,如下所示:

Statement sql = con.createStatement(int type,int concurrency);

1.type的取值决定滚动方式,取值如下:
1)ResultSet.TYPE.FORWORD_ONLY:结果集的游标只能向下移动
2)ResultSet.TYPE.SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变
3)ResultSet.TYPE.SCROLL_SENSITIVE:结果集的游标可以上下移动,当数据变化时,当前结果集同步变化

2.concurrent的取值决定是否可以用结果集更新数据库,取值如下:
ResultSet.CONCUR.READ_ONLY:不能用结果集更新数据库中的表
ResultSet.CONCUR.UPDATEBLE:可以用结果集更新数据库中的表

3.使用游标查询时,经常使用到ResultSet的以下方法:

public boolean previous();           //将游标向上移动,当移动到第一行之前时返回false
public void beforeFirst();           //将游标移动到结果集的初始位置,即在第一行之前
public void afterLast();             //将游标移动到结果集的最后一行的后面
public void first();                 //将游标移动到结果集的第一行
public void last();                  //将游标移动到结果集的最后一行
public boolean isAfterLast();        //判断游标是否在最后一行之后
public boolead isBeforeFirst();     //判断游标是否在第一行之前
public boolean isFirst();           //判断游标是否在第一行
public boolean isLast();            //判断游标是否在最后一行
public int getRow();                //获得当前游标所指向的行号,行号从1开始编码,如果结果集没有行,返回0
public boolean absolute(int row);   
//将游标移动到参数row指定的行,如果row是负数就是代表倒数的行,absolute表示移动到最后一行,absolute(-2)表示移动到倒数第二行,当移动到第一行前面或最后一行后面是,该方法返回false。

以下这个例子先是将游标移动到最后一行,得到学生表一共有多少条记录,然后再将游标移动到第15行,得出第15行的那个学生的姓名

package Example11;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Example {
    public static void main(String[] args) {
        Connection con = null;
        Statement sql;
        ResultSet re;
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch (Exception e){
            System.out.println("加载JDBC失败");
        }
        String uri = "jdbc:mysql://localhost:3306/xsxk?useSSL=true";
        String user = "root";
        String password = "root";
        try{
            con = DriverManager.getConnection(uri,user,password);
        }
        catch (Exception e){
            System.out.println("连接失败");
        }
        try{
            sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
            re = sql.executeQuery("SELECT  * FROM xsb");
            re.last();//将游标移动到最后一行
            int max = re.getRow();
            System.out.println("学生表一共有"+max+"记录");
            re.absolute(15);
            String name = re.getString("xm");
            System.out.println("第15行的那个学生的姓名是:"+name);
            con.close();
        }
        catch (Exception e){
            System.out.println(e);
        }
    }
}

运行结果和数据库中的表的数据对应
在这里插入图片描述

更新、添加和删除操作

Statement 对象调用以下方法,通过参数sql实现对数据库的更新、添加和删除操作:

public int executeUpdate(String sql);

以下例子,实现了
插入一个名为“张三”的记录
更新一个名为“张张张”的记录为“陈陈陈”
删除了一个名为“李四”的记录

package Example11;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Example11_4 {
    public static void main(String[] args) {
        Connection con = null;
        Statement sql;
        String url="jdbc:mysql://localhost:3306/xsxk?useSSL=true&characterEncoding=utf-8";
        String user="root";
        String password = "root";
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch (Exception E){
            System.out.println("加载JDBC失败");
        }
        try{
            con = DriverManager.getConnection(url,user,password);
        }catch (Exception e){
            System.out.println("连接失败");
        }
        try{
            sql = con.createStatement();
            sql.executeUpdate("insert into try values (3,'张三')");
            sql.executeUpdate("update try set name = '陈陈陈' where id = 1 ");
            sql.executeUpdate("delete from try where name='李四'");
            con.close();
        }catch(Exception e){
            System.out.println("操作失败");
        }
    }
}

运行前的表内记录为:
在这里插入图片描述
运行后的表内记录为:
在这里插入图片描述

使用预处理语句

Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象
1.预处理语句的优点
向数据库发送一个SQL语句,例如 select * from try,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令,完成相关的操作。如果不断地向数据库提交SQL语句,势必增加数据库中SQL解释器的负担,影响执行的速度。如果应用程序能够针对连接的数据库,实现就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。

对于JDBC而言,如果使用了Connection和某个数据库建立了连接对象con,那么con就可以调用preparedStatement(String sql)方法对参数sql指定的语句进行预编译处理,得到一个预处理语句对象。
2.使用通配符
在对SQL语句进行预处理时,可以使用通配符?(英文问号)来代替字段的值,但是必须要在预处理对象执行之前设置好通配符所代表的具体的值。
以下例子表示第一个通配符?代表的值是“张三”,第二个通配符?代表的值是“李四”:

sql.setString(1,"张三");
sql.setString(2,"李四");

在使用预处理语句对象设置通配符?的值时,常用的方法有

void setDate(int preparedIndex,Date x);
void setDouble(int preparedIndex,Double x);
void setFloat(int preparedIndex,Float x);
void setInt(int preparedIndex,Int x);
void setLong(int preparedIndex,Long x);
void setString(int preparedIndex,String x);

以下例子是使用通配符向表内插入了一条序号为100,名为“使用通配符”的记录

package Example11;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Example11_5 {
    public static void main(String[] args) {
        Connection con = null;
        String url = "jdbc:mysql://localhost:3306/xsxk?useSSL=true&characterEncoding=utf-8";
        String user = "root";
        String password = "root";
        PreparedStatement sql;
        try{
            Class.forName("com.mysql.jdbc.Driver");
        }catch(Exception e){
            System.out.println("加载失败");
        }
        try{
            con = DriverManager.getConnection(url,user,password);
        }catch(Exception e){
            System.out.println("连接失败");
        }
        try{
            sql = con.prepareStatement("insert into try values(?,?)");
            sql.setInt(1,100);
            sql.setString(2,"使用通配符");
            sql.executeUpdate();
            con.close();
        }catch(Exception e){
            System.out.println("操作失败");
        }
    }
}

结果如下图所示:

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值