JDBC
JDBC( Java Database Connection)由一组java类和接口组成。是java程序和数据库系统通信的标准API。JDBC API使得开发人员可以使用纯java的方式来连接数据库,并执行操作。
访问数据库流程
步骤
完整代码
public static void main(String[] args) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
//加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//建立连接,包含了一个socket对象,耗时,真正开发时用连接池管理连接对象
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?serverTimezone=UTC","root","root");
String sql = "select * from student where id = ?";
ps = con.prepareStatement(sql);
ps.setInt(1,2969);
rs = ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1) + "---" + rs.getString(2) + "---" + rs.getString(3));
}
}catch (Exception e){
e.printStackTrace();
}finally {
//先开后闭,分开关闭
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
导入jar包
不同数据库会提供不同jar包,也就是jdbc驱动程序,从官网即可下载。然后在自己的编译器上导入外部库。
加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
建立连接
建立的连接里包含一个socket对象,很耗时,所以真正的开发中通常用连接池来管理连接对象。
//mysql的jdbc6.0+在连接字符串中要加入时区
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名称?serverTimezone=UTC","数据库用户名","密码");
执行sql语句
执行sql有多种方式,这里只介绍两种。
通过连接的createStatement方法获得sql语句对象,statement或者prepareStatement。前者很少使用,因为只能用字符串拼接的方式来传值,并且会发生sql注入(例:“5 or 1= 1”,传入这样的值会更改sql语句逻辑);后者通过预编译,提高了效率,也一定程度上防止了sql注入。调用execute方法执行sql语句.
Statement stmt = con.createStatement();
String sql = "insert into student values (3366,'张大炮','123')";
stmt.execute(sql);
//等价于
String sql = "insert into student values (?,?,?)";//?是占位符
PreparedStatement ps = con.prepareStatement(sql);
//根据传入值的类型使用不同方法,以此来防止sql注入
//如果不在乎类型的话可以使用setobject方法
ps.setString(1,"1234");
ps.setString(2,"zdp");
ps.setString(3,"123");
ps.execute();
返回结果集
执行查询语句使用executeQuery()返回结果集。
执行更新语句使用executeUpdate()返回更新行数。
executeQuery()返回ResultSet对象储存结果集,next()方法是光标在结果集向下移一行,返回是否还有下一行,使用get方法返回不同列的值。
String sql = "select * from student where id = ?";
ps = con.prepareStatement(sql);
ps.setInt(1,2969);
ResultSet rs = ps.executeQuery();//执行sql语句并返回结果集
while(rs.next()){//当还有下一行
System.out.println(rs.getInt(1) + "---" + rs.getString(2) + "---" + rs.getString(3));
}
关闭连接
遵循先开后关,独立关闭的原则。
//先开后闭,分开关闭
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}