JDBC的引入
我们需要使用驱动来操控数据库,而不同数据库可能对应不同驱动,因此可能给我们带来麻烦,因此引入了JDBC技术,我们只需学习JDBC技术就可以操控各种类型数据库
一个简单JDBC程序示例
-
首先通过可视化工具(SQLyog)创建一个数据库,如:
-
在根目录导入jar包(mysql-connector-java-5.1.14),并添加到库中
-
编写JDBC程序
import java.sql.*;
public class FirstJdbc {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载JDBC
//用户信息和url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String usename = "root"; //用户信息
String password = "123456";
//连接数据库,返回数据库对象
Connection connection = DriverManager.getConnection(url, usename, password);
//执行SQL对象Statement
Statement statement = connection.createStatement();
//执行SQL的对象去执行查询操作,并返回结果集
String sql = "SELECT * FROM users;";//执行的sql语句
ResultSet resultSet = statement.executeQuery(sql);//返回的结果集
while (resultSet.next()){
System.out.println("id:"+resultSet.getObject("id"));
System.out.println("name:"+resultSet.getObject("name"));
System.out.println("password:"+resultSet.getObject("password"));
System.out.println("============");
}
}
}
resultSet.close(); //释放资源
statement.close();
connection.close();
结果:
SQL注入问题
使用statement执行对象可能出现注入问题,导致数据库不安全,因此我们常用preparedStatement执行对象,不会出现注入问题。
改进后的JDBC程序
自定义封装类JdbcUtils
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
static {
try {
//在src目录下创建db.properties文件,用来保存url,username,password基本信息,并用流获取文件信息
InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(in);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
Class.forName(driver); //驱动只需加载一次,可以放在静态代码块
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//释放资源
public static void release(Connection c, Statement s, ResultSet r) throws SQLException {
if (c!=null){
c.close();
}
if (s!=null){
c.close();
}
if (r!=null){
c.close();
}
}
}
使用preparedStatemen执行对象插入一条数据
import com.khp.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
public class MyPreparedStatement {
public static void main(String[] args) throws SQLException {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JdbcUtils.getConnection(); //利用自定义封装类加载驱动器并连接数据库
String sql = "insert into `users`(`id`,`name`,`password`,`email`,`birthday`) values(?,?,?,?,?)"; //?代表参数
preparedStatement = connection.prepareStatement(sql); //预编译sql语句
preparedStatement.setInt(1,5); //第一个问号的具体赋值
preparedStatement.setString(2,"khp2");
preparedStatement.setString(3,"123456");
preparedStatement.setString(4,"115467@qq.com");
preparedStatement.setDate(5,new java.sql.Date(new Date().getTime())); //until包下的date是java使用的,sql下date是sql下的
int i = preparedStatement.executeUpdate();
if (i>0){
System.out.println("插入成功");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JdbcUtils.release(connection,preparedStatement,null); //释放资源
}
}
}