简介
JDBC:全称是Java Database Connectivity,java数据库连接,从名字就可以看出来它的作用是用Java语言与数据库进行连接,从而执行一系列SQL语句,实现对数据库的操作。
步骤:
1. 加载数据库驱动:可以针对不同的数据库加载不同的驱动,从而为多种数据库提供访问。
2. 建立数据库连接:需要传递三个参数,即url、user和password,其中url中指定了数据库、host、端口号以及具体操作的那个数据库的名字,当在mysql workbench中新建一个数据库连接时可以看到这些信息,如下:
3. 执行SQL语句:推荐使用PreparedStatement接口(见下面PreparedStatement和Statement的区别)。
4. 处理返回结果:即获取返回结果中的某个字段值或者输出显示等等。
5. 关闭资源:一定不要漏掉哦,否则容易造内存泄漏。
例子(mysql版本)
在https://mvnrepository.com/获取mysql的配置代码粘贴到pom.xml文件中。
1. DBUtil类(这个类主要用于与数据建立连接,并返回一个Connection对象):
import java.sql.Connection;
import java.sql.DriverManager;
public class DBUtil {
private static final String driveName="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://127.0.0.1:3306/News";
private static final String USER="root";
private static final String PASSWORD="123456";
public DBUtil(){}
public static Connection connectToDb()throws Exception{
//加载驱动
Class.forName(driveName);
//获得数据库的连接
Connection con= DriverManager.getConnection(URL, USER, PASSWORD);
return con;
}
}
2.ExcuteSQL类(这个类主要用于执行一系列SQL语句,这里写了两个类方法用于servlet中调用):
import com.alibaba.fastjson.JSONObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class ExecuteSQL {
//返回查询结果
public static ArrayList<JSONObject> getNewsInfo(int pageNumber, int pageSize)throws Exception{
//获取数据库连接
Connection con = DBUtil.connectToDb();
//查询数据
PreparedStatement ps;
String sql = "SELECT * FROM News limit "+(pageNumber-1)*pageSize+","+pageSize;
ps = con.prepareStatement(sql);
ResultSet res = ps.executeQuery();
ArrayList<JSONObject> list = new ArrayList<JSONObject>();
//保存在list中
while(res.next()){
JSONObject job = new JSONObject();
job.put("id",res.getString("id"));
job.put("title",res.getString("title"));
job.put("key_word",res.getString("key_word"));
job.put("content",res.getString("content"));
job.put("url",res.getString("url"));
job.put("reply",res.getString("reply"));
job.put("source",res.getString("source"));
job.put("postdate",res.getString("postdate"));
list.add(job);
}
res.close();
con.close();
return list;
}
//返回数据条数
public static int getCount()throws Exception{
int count = 0;
//获取数据库连接
Connection con = DBUtil.connectToDb();
//查询数据条数
PreparedStatement ps;
ps = con.prepareStatement("select count(*) from News");
ResultSet res = ps.executeQuery();
while(res.next()){
count=res.getInt(1);
}
System.out.println("数据条数: "+count);
res.close();
con.close();
return count;
}
}
PrepareStatement和Statement的区别:
PrepareStatement接口继承了Statement接口,但是相比于Statement具有以下优点:
1. PreparedStatement是预编译的,效率高。
2. 代码可读性和可维护性高。
3. 安全性好,可有效防止SQL注入攻击。
SQL注入攻击:由于web应用程序对用户输入数据的合法性没有判断,攻击者通过在web程序中添加一些额外的SQL语句,欺骗服务器执行一些恶意操纵。