这学期在学校学习了一门《Java Web程序设计》,其中就学了JDBC
这种组件技术,别的暂且不说,就JDBC
的使用,可是背了好久,最后没有考…
所谓JDBC
,也就是Java Database Connectivity
,就是来连接数据库的。对于使用编程语言来说,把不在IDE
里进行SQL
的操作转到IDE
中完成。
JDBC
,用Java程序来连接数据库,并进行相应的操作。
JDBC
步骤:
1)加载JDBC
驱动类
2)建立JDBC
连接
3)执行SQL
语句
4)返回执行结果
5)释放连接
这些步骤是在一些JDBC
提供的组件下完成的,
DriverManager
:加载JDBC
驱动类
Connection
:建立连接
Statement
:执行SQL
语句
Resultset
:存放操作结果
那,今天就来聊一聊JDBC
编程的具体细节过程
0、JDBC
编程之前
首先,要下载 mysql-connect-java
的 jar
包,并将其导入你的项目中,才可以使用JDBC
进行编程。
这里面要注意,这个jar
包的版本要跟你的mysql
的版本几乎持平,否则会有不可预知的差错。
1、加载JDBC
驱动类
使用
Class.forName("com.mysql.jdbc.Driver");
进行数据库的类加载,这个语句表明加载的是MySQL
的驱动类。
2、建立数据库连接
语句
Connection connection = DriverManager.getConnection(URL,root,password);
其中的三个参数都是String
类型的,
URL:格式,jbdc:mysql://localhost:3306/数据库名;
比如,jdbc:mysql://localhost:3306/test;
表明连接的是我的test库。对库进行连接,而不是连接表!
root:账户
password:密码
这三者无误后,就能能连接到数据库啦。
操作一下
public class App {
static String url = "jdbc:mysql://localhost:3306/test";
static String root = "root";
static String password = "123456";
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, root, password);
String sql = "select * from goods where num = 2";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
/*
使用预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet1 = preparedStatement.executeQuery();
*/
while (resultSet.next()) {
//我查找的是所有行
String name = resultSet.getString("name");//后面这个name是goods表中的字段名
String price = resultSet.getString("price");
String num = resultSet.getString("num");
String author = resultSet.getString("author");
System.out.println(name + " " +price + " " + num + " "+ author);
}
resultSet.close();
statement.close();
connection.close();
System.out.println("Hello World!");
}
}
执行结果
对于其它的一些操作,都是由Connection
这个类来完成的。
如
//设置事务的提交, true->自动提交,false->手动提交
connection.setAutoCommit(true);//设置成自动提交嘛,是的呢。
connection.setSavePoint();
SavePoint t1 = connection.setSavePoint("t1");//设置一个回滚点
connection.commit();//提交事务
connection.rollBack();
connection.rollBack("ti");//回滚
//设置隔离级别
connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
/*
几种隔离级别
Connection.TRANSACTION_READ_UNCOMMITTED,不可提交读
Connection.TRANSACTION_READ_COMMITTED,可提交读
Connection.TRANSACTION_REPEATABLE_READ,可重复读
Connection.TRANSACTION_SERIALIZABLE,可序列化
Connection.TRANSACTION_NONE,无
*/
3&4、执行SQL
语句并得到结果(详细)
在我test库下有一张goods表,里面有 int
字段 num。
记住这张表的字段顺序哦
对于执行SQL
语句,有三个类可以进行处理,分别是
①Statement
②PreparedStatement
③CallableStatement
①Statement
普通的执行SQL
语句,如
String sql = "select * from goods where num = 2";
Statement state = connection.createStatement();
//得到SQL结果
ResultSet resultSet = state.executeQuery(sql);
这个set
是一个集合,它会将我的goods表中符合num = 2
的项都返回,通过
while(resultSet.next()){
//我查找的是所有行
String name = resultSet.getString("name");//后面这个name是goods表中的字段名
String price = resultSet.getString("price");
String num = resultSet.getString("num");
String author = resultSet.getString("author");
/*
表明我现在查询了一行数据,当然了,你也可以查找你想知道的字段
*/
}
也可以
while(resultSet.next()){
String name = resultSet.getString(1);//name是goods表中第一个字段
String price = resultSet.getString(2);//第二个字段,price
String num = resultSet.getString(3);//第三个字段,num
String author = resultSet.getString(4);//第四个字段,author
/*
不清楚上面有表,从1开始而不是从0开始
*/
}
②PreparedStatement
,预编译处理,推荐使用
使用预编译的一个好处就是可以解决MySQL
的注入性问题,所谓SQL
注入问题,就是通过用户输入的参数拼接SQL
时,通过改变SQL
语义来访问数据库获取结果。
即非法攻击数据库,这样是不行的。
String sql = "select * from goods where num = ?";
PreparedStatement pre = connection.prepareStatement(sql);
pre.setString(1,String.valueOf(2));//int 转为 String
//然后再得到结果
ResultSet resultSet = pre.executeQuery();
pre.setString(1,String.valueOf(2))
,这个1表示是第一个参数,不是从0开始的,切记!
比如
String sql = "select * from goods where num = ? and author = ?";
PreparedStatement pre = connection.prepareStatement(sql);
pre.setString(1,String.valueOf(2));
pre.setString(2,"许嵩");
//然后再得到结果
ResultSet resultSet = pre.executeQuery();
PreparedStatement
较Statement
,有下面几个优势
a.防止SQL
注入
b.执行效率高
PreparedStatement
对象会分别将参数和SQL
交给MySQL
服务器检查,执行前会预编译,在编译期间SQL
正确才交给服务器执行,否则直接返回。
c.好康,更加滴优美~
③CallableStatement
,具有回调功能
大家都知道,一般程序是顺序执行的,但是对于具有回调功能的语句,只有被某个条件触发后才能执行。就比如支付时,你在某宝下单,在某某宝完成支付后,某宝才能成功支付。这就属于回调。由此可见回调功能在支付领域应用的比较多。
SQL
语句:
还有一些力所能及的知识:
executeQuery();//返回查询的集合
execute();//返回一个 boolean 类型的结果
executeUpdate();//返回该操作影响的行数
5、释放资源
没得说
按照顺序
resultSet.close();
statement.close();
connection.close();
JDBC
相关基础知识介绍完毕 -.-