实际开发中,手动的输入SQL语句是少之又少,大多数情况下是通过编译代码进行来控制自动执行.
具体操作如下:
上述展示有一个【自己写的Mysql客户端】,这种操作是非常容易的,因为各种数据库本身就提供一系列的API,可以让用户很方便的实现这个客户端。**显然MySQl提供的有API(Application Programming Interface )Java也提供了一些API 这些API 提供了一些类和方法,通过这些类和方法可以进行一系列操作,比如操作硬盘的文件,进行增删查改,操作数据库等 **。不同的数据库提供的API是不相同的,于是由于不同的数据库有不同的API,一旦使用不同的数据库就需要重新学习API。这时候就有Java大佬出了一个JDBC这一套API来适配不同的数据库,不同数据库就需要提供能适应JDBC相关的“驱动包”。这也就表示JDBC规范了所有数据库的编程操作。
JDBC: 约定了有哪些API,具体怎么用。
驱动包: API的具体实现。
//加载jdbc驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
Connection connection1 = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false")
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
statement对象主要将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象.
statement : 用于执行不带参数的简单sql语句
PrepareStatement:
a)用于执行带参或者不带参数的sql语句.
b)SQL语句会预编译在数据库系统.
c)执行速度快于Statement对象.
CallableStatement:用于执行数据库存储过程的调用.
强调PrepareStatement:
1.可以参数化SQL查询.
2.性能比Statement高.
3.预编译SQL.
4.阻止常见的SQL注入攻击.(黑客…)
5.占位符:?
(下标从1开始)
6.占位符不能使用多值.
7.主要掌握两种执行SQL方法:
a).executeQuery()方法执行后返回单个结果集,通常用于select语句.
b).executeUpdate()方法返回值是一个整数,表示受影响的行数,通常用于update,insert,delete,语句.
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX()方法提供了对这些行中数据的访问.
ResultSet里的数据一行一行的排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行,如果想要取得某一行记录,需要使用ResultSet的next()方法,获取当前数据行,要想得到具体列,就需要使用getXXX()方法;如果需要得到ResSet里的所有记录,就要使用while循环.
【idea导入MySQL驱动包教程】
咱先来看看JDBC是如何操作的:(抽象画家)
通过JDBC使用不同的数据库,JDBC会调用相对应的数据库的“驱动包”,来和数据库的服务器进行交互。
在使用之前,需要提前准备好数据库和数据表
打开Mysql客户端,创建一个Class数据库,创建一个student表,字段:id,姓名.
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
//1.创建数据源..javax.sql底下的DataSource
DataSource dataSource = new MysqlDataSource();//向上转型,这样避免后期换服务器需要到处修改代码
//2.说明数据库服务器在哪里,向下转型
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
//3.设置用户名和密码 我默认的是“root” 密码是“123456”
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
DataSource
内置了数据量连接池,可以重复利用.//建立连接
import java.sql.Connection;
Connection connection = dataSource.getConnection();
Connection :选择java.sql.Connection
包。
getConnection():需要处理受查异常。
a)受查异常:必须要显示处理;
b)非受查异常:可以忽略
//1.构造语句
//写法1
String sql = "insert into student values(1,‘张三’)";
//2.在JDBC中需要搭配一个特定的对象,来描述sql的情况
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//写法2:
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();//输入学号 -> 1
String name = scanner.nextLine();//输入姓名 ->"李四"
String sql = "insert into student values(?,?)";//注释1
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,id);//注释2
preparedStatement.setString(2,name);//注释3
int ret = preparedStatement.executeUpdate();
executeUpdate()
;返回结果是:操作在数据库表里影响了几行.增,删,改
,使用executeUpdate()
;针对查
使用executeQuery()
.这些操作跟插入操作的代码几乎相同,修改sql语句,再修改preparedStatement调用的方法就可以了executeQuery()
返回的是一个查询的结果集,用ResultSet
preparedStatement.close();
connection.close();
注意: 释放资源是从后往前释放.
最后创建的preparedStatement,就最先释放.
最先创建的connection,最后释放.
完整版insert代码
public static void main(String[] args) throws SQLException {
//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2.手动输入id name
Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();
String name = scanner.nextLine();
//3.连接
Connection connection = dataSource.getConnection();
//4.构造
String sql = " insert into student values (?,?)";
//5.执行
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,id);//id
preparedStatement.setString(2,name);//name
System.out.println("sql:"+preparedStatement);//返回一个修改执行后的sql语句
//执行
int ret = preparedStatement.executeUpdate();
//关闭资源
preparedStatement.close();
connection.close();;
}
public class Demo1 {
public static void main(String[] args) throws SQLException {
//1.先创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2.连接数据库
Connection connection = dataSource.getConnection();
//3.构造sql
String sql = "select * from student";
//可以其他加入限制条件
//String sql = "select * from student where id = 1";
//4.执行sql
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.注意 这里返回的是一个结果结合
//注意这次调用的是executeQuery()
ResultSet resultSet = preparedStatement.executeQuery();
//6.循环遍历每一行记录
//next(): 只要存在下一行就取出当前一行
while(resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = "+ " name");
}
resultSet.close();
preparedStatement.close();
connection.close();
}
}