JDBC的作用就是,用程序来执行SQL语句操作。
可以使用JDBC对程序进行增、删、改、查。
首先,我们尝试使用JDBC 往数据库中插入一个记录
需要执行5步
- 创建
DataSource
数据源。描述MySQL数据库在哪 - 和数据库建立连接
- 构造SQL语句
- 执行SQL,针对增、删、改操作 使用
executeUpdate()
来执行;针对查操作使用PreparedStatement()
来执行 - 断开连接,释放资源
1)创建DataSource数据源,描述MySQL数据库在哪
DataSource dataSource = new MysqlDataSource(); //向上转型
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false"); //向下转型
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("***");
在这里用到了向上转型和向下转型,在最开始new对象时,使用DataSource类型的实例,这样可以避免MysqlDataSource的扩散,如果未来需要更改数据库,我们只需要改变第一行代码一处即可。
也可以直接使用MysqlDataSource类型:
MysqlDataSource dataSource1 = new MysqlDataSource();
dataSource1.setUrl();
dataSource1.setUser();
dataSource.setPassword();
2) 和数据库建立连接
Connection connection = dataSource.getConnection();
//这里会报异常,我们需要处理,先把他扔到main函数处
3) 构造SQL语句
String sql = "insert into student values(1,'aaa')";
上述描述了要执行的SQL语句是啥样的,但是真正的执行,还是需要下面这行:
PreparedStatement statement = connection.preparedStatement(sql);
jdbc 中需要搭配一个特定的对象来描述这里的sql的情况
PreparedStatement : 经过预处理过的语句
statement对象给我们提供了替换,预编译等功能.
每次执行一次SQL语句都要重新构造一下PreparedStatement 。
PreparedStatement背后做了很多事,比如会对SQL语句进行一些预处理(对语法进行解析之类)
之前我们通过cmd输入的SQL,都把SQL直接发给服务器,让服务器来解析,服务器要做很多,通过PreparedStatement,减轻服务器的工作压力
4)执行SQL
int ret = statement.executeUpdate();
增、删、改 使用executeUpdate()
来执行;这里的返回值表示执行该语句所影响的行数量
查操作使用PreparedStatement()
来执行;这里的返回值是一个ResultSet结果集
5) 断开连接,释放资源
statement.close();
connection.close();
注意资源释放的顺序和创建的顺序是相反的,后创建的要先释放
总代码如下:
public class JDBCInsertDemo {
public static void main(String[] args) throws SQLException {
// 使用JDBC 往数据库中插入一个记录
//1.创建DataSource数据源,描述MySQL数据库在哪
DataSource dataSource = new MysqlDataSource(); //向上转型
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false"); //向下转型
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("111");
//2. 和数据库建立连接
Connection connection = dataSource.getConnection(); //有可能会报异常,要处理异常
//3. 构造SQL语句
String sql = "insert into student values(1,'aaa')";
PreparedStatement statement = connection.prepareStatement(sql);
//4. 执行SQL.
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
//5. 断开连接,释放资源
statement.close();;
connection.close();
}
}
在上文中。第三步构造SQL,更多的时候,我们都希望插入的数据是动态的,因此可以改成通过控制台。来输入用户的信息
//通过控制台。来输入用户的信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号");
int id = scanner.nextInt();
System.out.println("请输入姓名");
String name = scanner.next();
String sql = "insert into student values(" + id + ", '" + name + "');";
但是,这样的语句十分不易于阅读,且容易引发SQL注入,因此,使用preparedStatement,通过占位符替换方式来实现动态的SQL构造
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学号");
int id = scanner.nextInt();
System.out.println("请输入姓名");
String name = scanner.next();
String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.preparedStatement(sql);
statement.setInt(1, id); //表示给第一个占位符,传入id的值
statement.setString(2, name);
System.out.println("sql:" + statement); //可以看到最终构造的SQL语句
这样就可以动态,安全的插入数据。