注:在本篇博客中,使用的数据库是mysql!!!
这步就是在告诉Java程序,即将要连接的为哪个品牌的数据库, 这里有两种方法
//就是使用一个了多态,
try {
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
注意:第一种方法不如第二种方法使用,且第二种如果要提高代码复用率的话,可以将其放入static的静态代码块
这一步是在表示JVM的进程和数据库进程之间的通道打开了,且在这一步中还要在java代码中定义关于一些数据库的信息,但是尽量不要直接写在java代码中,如下图:
所以,可以在src文件夹下,创建一个properties包,在里面放入关于数据库的信息:
url = com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost(本地地址):3306/d1(数据库名)
user=root
password=root
但是要调用的话,还是用使用以下代码:
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Connection conn = DriverManager.getConnection(url,user,password);//获取链接
Demo:
Statement st = conn.createStatement();
这里就是要和数据库相关联了,这里我使用的是mysql数据库
//这里有两种情况,使用DQL(select)语句和DML(update、insert、delete)语句是不一样的
//①DML语句
String sql = "update user set name = 'jack' where id = 1";
int count = st.executeUpdate(sql);//这个返回值影响数据库的记条数
//②DQL语句
String sql = "select * from user";
ResultSet resultset = new ResultSet();
resultset = st.executeQuery(sql);
对于这一步,只针对DQL语句才有查询结果集。
对于处理结果集,取数据采用getString()方法,这个方法不管你数据库中存入的数据的数据类型。
//比如这里有一个数据表user
/*
user
------------------------
id name password
------------------------
1 小明 123456
------------------------
2 小王 123564
*/
//再结合以上的步骤,假设我们只取出第一行的数据
//第一种方法(1表示第一列,以此类推):
String id = resultset.getString(1);//取出第一行
String name = resultset.getString(2);//取出第二行
String password = resultset.getString(3);//取出第三行
//第二种方法(使用列的名称):
String id = resultset.getString("id");//取出第一行
String name = resultset.getString("name");//取出第二行
String password = resultset.getString("password");//取出第三行
//如果想取出第二例,使用一个循环就可以去实现,接下来使用代码展示取出
while(resultset.next()){
String id = resultset.getString("id");
String name = resultset.getString("name");
String password = resultset.getString("password");
System.out.println(id+","+name+","+"password");
}
这一步看似对全局不起作用,其实关闭资源是很重要的一步。关闭顺序:按先关闭ResultSet,然后关闭PreparedStatement,最后关闭Connection。注意:第三方的数据库连接池,使用的时候,获取到Connection之后,使用完成,调用的关闭方法(close()) ,并没有将Connection关闭,只是放回到连接池中,如果调用的这个方法,而没有手动关闭PreparedStatement、或者Statement等,则这个PreparedStatement并没有关闭,这样会使得开发的程序内存急速增长,java的内存回收机制可能跟不上速度,最终造成Out of memory Error。
而关闭资源的位置,最好是在finally语句中,这是最好的位置。
finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
最后,这里写一个所有步骤都结合在一起的代码
Demo:
public class Test {
//第一步
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
//第二步
String url = "jdbc:mysql://127.0.0.1:3306/qf";
String root = "root";
String password = "root";
//获取链接对象
Connection connection = null;
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
try {
connection = DriverManager.getConnection(url, root, password);
//第三步
//获取sql预编译器
preparedStatement = connection.prepareStatement("select * from user);
//第四步
//结果集
resultSet = preparedStatement.executeQuery();
//第五步, 这里就不展示处理查询结果集了,在上面也涉及到了
} catch (SQLException e) {
throw new RuntimeException(e);
//第六步
}finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
最后在这里祝愿大家,学业有成!!!