mysql-06.JDBC
目录
什么是JDBC:
为啥存在JDBC:
JDBC工作原理:
JDBC的优势:
下载mysql驱动包:
用java程序操作数据库
1.创建dataSource:
2.与服务端建立连接
3.构造sql语句
4.执行sql
5.关闭连接,释放资源
参考代码:
插入操作:
删除操作:
修改操作:
查询操作:
什么是JDBC:
jdbc:java datasource connectivity : java数据库连接
jdbc 是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。
为啥存在JDBC:
当前的数据库有很多种,有mysql,Oracle,SQL server等.
客户端可能使用不同的数据库进行操作,不同的数据库对应不同的编译语言,提供了不同的数据库驱动包,如:MySQL提 供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的, 要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。
这就带来了很多不便,更换数据库时,还要学习新的数据库的api,增加了使用成本。
JDBC就统一了数据库的连接规范,它为java开发人员提供了一套标准的api,可以为多种关系数据库统一访问。
JDBC工作原理:
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包 含一些通用的接口类。
JDBC的优势:
1.java语言访问数据库操作完全是面向抽象接口编程。
2.开发数据库应用提供api不需要针对特定的api.
3.程序的可移植性大大增强。
下载mysql驱动包:
下载可以有多种方式,可以在中央仓库中下载:
https://mvnrepository.com/https://mvnrepository.com/
下载步骤:
1.搜索mysql:
2,选择下载版本
3.选择一个版本,点进去,点jar包下载
下载完成后,创建java项目,新建一个包(lib,名字随意),将下载好的驱动包粘贴到这个包中
将创建的包添加为库
准备工作完成,下面就可以通过java程序操作数据库了
用java程序操作数据库
1.创建dataSource:
创建数据源头,就是数据库所在的位置
DataSource是一个接口,MysqlDataSource是mysql驱动包中的,通过MysqlDataSource来实现。
设置数据库位置:
对dataSource使用,要向下转型: DataSource->MysqlDataSource,通过下载的驱动包来设置,
当然也可以直接使用MysqlDataSource来创建源头数据:
但这种方法会在代码中多次出现MysqlDataSource类,不利于提高代码的耦合性,还是建议使用第一种方法设置。
setUrl():URL:表示网络上资源的位置,也叫“网址”,mysql是一个客户端服务器结构的程序,需要通过网络进行交互。
JDBC:mysql : url是JDBC操作MySQL使用的;
127.0.0.1:IP地址,127.0.0.1是一个特殊的IP地址,“环回地址”,由于我们当前的数据库和java程序是在同一台机器上,因此就是将数据发送给自己,就要用环回地址。
3306:端口号,接收数据端的端口号;
java109:数据库名,在执行java代码时,提前创建好数据库和表;
:问号?后面的是一些访问资源时候用到的参数,设置字符集为utf8,useSSL表示是否要加密,在练习的时候设为false,(设为true很可能连不上数据库)。
setUser():mysql的默认用户 : root;
setPassword(): 在安装数据库的时候手动设置的数据库密码;
2.与服务端建立连接
Connection有很多包,注意要导入 java.sql包
这里有一个受查异常,要手动处理:
3.构造sql语句
执行插入数据操作
可以直接指定内容,也可以通过字符串拼接,通过控制台输入要插入的数据,
还可以通过? ,搭配setXXX,来手动输入要插入的数据,
第一个参数 是?的位置,第二个参数 是要传入的数据。
sql语句是字符串,通过prepareStatement()方法,先将sql语句进行解析检查,得到结构化数据,将结构化数据传送给数据库,数据库就无需再进行对sql语句进行处理了,这样操作能为数据库节省更多的时间,可以处理更多的客户端请求。
虽然sql语句能以字符串的形式传给数据库,但若sql存在语法问题等,传过去的sql就无法执行,影响执行效率;直接传sql语法也存在一定的风险,不安全,因为不确定sql中到底写的什么。
删除操作:
修改操作:
查询操作:
4.执行sql
增删改:
增删改都属于对数据库的写操作,使用的方法是executeUpdate(),返回值是操作影响到的行数,为int类型。
查询:
查询属于读操作,使用executeQuery()方法,返回的是一个结果集,
resultSet相当于在查询到的结果集中,有一个光标,最初指向第0行,当还有数据时,就依次向下遍历,ResultSet有getXXX方法,根据列的类型,可以获取到要查找的数据。
5.关闭连接,释放资源
关闭顺序是:先创建的后释放,后创建的先释放。
参考代码:
插入操作:
public class Deam01 {
//插入数据
public static void main(String[] args) throws SQLException {
Scanner scan=new Scanner(System.in);
System.out.println("请输入id:");
int id = scan.nextInt();
System.out.println("请输入姓名:");
String name = scan.next();
//
// MysqlDataSource mysqlDataSource=new MysqlDataSource();
// mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
// mysqlDataSource.setUser("root");
// mysqlDataSource.setPassword("root");
//1.创建dataSource
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和数据库服务器建立连接
Connection connection=dataSource.getConnection();
//3.构造sql
//插入操作
//法一
// String sql="insert into student values(1,'zhangsan')";
//法二
// String sql="insert into student values("+id+",'"+name+"')";
//法三
String sql="insert into student values(?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,id);
preparedStatement.setString(2,name);
//4.执行sql
int n = preparedStatement.executeUpdate();
System.out.println("n= "+n);
//5,关闭连接,释放资源
preparedStatement.close();
connection.close();
}
}
删除操作:
public class Deam02 {
public static void main(String[] args) throws SQLException {
Scanner scan=new Scanner(System.in);
System.out.println("请输入姓名:");
String name = scan.next();
//数据库删除数据
//1.创建dataSource
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和服务器建立连接
Connection connection=dataSource.getConnection();
//3.构造sql
String sql="delete from student where namr=? ";
PreparedStatement preparedStatement= connection.prepareStatement(sql);
preparedStatement.setString(1,name);
//4.执行sql
int n = preparedStatement.executeUpdate();
System.out.println("n= "+n);
//5.关闭连接,释放资源
preparedStatement.close();
connection.close();
}
}
修改操作:
public class Deam07 {
public static void main(String[] args) throws SQLException {
Scanner scan=new Scanner(System.in);
System.out.println("请输入修改的name:");
String name = scan.next();
System.out.println("请输入源id");
int oldid=scan.nextInt();
//1.
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.
Connection connection = dataSource.getConnection();
//3.修改sql
String sql="update student set name=? where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setInt(2,oldid);
//4
int n = preparedStatement.executeUpdate();
System.out.println("n= " +n);
preparedStatement.close();
connection.close();
}
}
查询操作:
public class Deam03 {
public static void main(String[] args) throws SQLException {
//数据库 查询操作
//1.创建源数据
DataSource dataSource=new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");
//2.和服务端建立连接
Connection connection = dataSource.getConnection();
//3.创建sql
String sql="select * from student";
PreparedStatement prepareStatement= connection.prepareStatement(sql);
//4.执行sql
ResultSet resultSet = prepareStatement.executeQuery();
while(resultSet.next()){
int id=resultSet.getInt("id");
String name=resultSet.getString("namr");
System.out.println("id= "+id+" name= "+name);
}
//关闭资源
resultSet.close();
connection.close();
prepareStatement.close();
}
}