jdbc:
Java DataBase Connection 通过Java语言来连接数据库的一门技术。
sun公司提供的一套接口规范
如果想要通过jdbc连接mysql,我们需要获得mysql的实现类,称为驱动,其他数据库同理。

一、jdbc编程六个步骤:

1、注册驱动
Class.forName(“全类名”)

例如:
Class.forName(com.mysql.jdbc.Driver)
此时会抛异常,使用try-catch处理

注册驱动有个旧版的方式:

  1. DriverManager.registerDriver(new Driver())

新版的方式优势在于会在类加载器加载时注册,此后驱动一直存在,而旧版如果需要多次注册驱动,就需要创建多个Driver实例,而新版不用,即新版的优势

2、获取数据库连接

使用接口Connection:用于特定数据库的连接

Connection connection = DriverManager.getConnection();

在使用getConnection方法之前,需要指定三个参数:url,user,password

例如:

url :连接数据库的地址

jdbc:mysql 协议

localhost 本地ip地址

3306 mysql默认端口号

String url = “jdbc:mysql://localhost:3306/数据库名”;

user 用户名

String user = “root”;

password

String password = “root”;

此时会抛异常,再次使用try-catch或者第一个try-catch中用父类Exception 来接收异常。

3、获取数据库操作对象

根据连接对象来获取
(connection是上面的连接对象)

Statement statement = connection.createStatement();

获得这个数据库对象后才能对数据库增删改查

4、写一个sql语句

String sql = “insert into tb_stu(name,age,address)values(‘张三’,20,’xxx’)”;

5、执行sql语句

executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()

executeQuery()是用于查询语句的方法,即DQL

num 影响记录条数

int num = statement.executeUpdate(sql);

resultSet是一个结果集

ResultSet resultSet = statement.executeQuery(“select * from xxx”);

6、关闭数据库资源

顺序由下往上

statement.close();

connection.close();

注意:如果程序中间出现问题,则数据库资源无法正常关闭,所以关闭数据库资源的代码需要放到finally语句块中。finally要求该资源在公共区域,所以将两个对象提出来:
Connection connection = null;
Statement statement = null;

此时close会报错,try-catch。

执行增删改的代码

  1. public class Demo01 {
  2. public static void main(String[] args) {
  3. Statement statement = null;
  4. Connection connection = null;
  5. try {
  6. //1、注册驱动
  7. Class.forName("com.mysql.cj.jdbc.Driver");
  8. //url 连接数据库的地址(com.mysql.jdbc.Driver已弃用)
  9. //jdbc:mysql 协议
  10. //localhost 本地ip地址
  11. //3306 mysql默认端口号
  12. //serverTimezone=GMT 时区
  13. //characterEncoding=utf-8 防止中文乱码
  14. String url =
  15. "jdbc:mysql://localhost:3306/test_stu?serverTimezone=GMT&characterEncoding=utf-8";
  16. String user = "root";
  17. String password = "root";
  18. //2、获取数据库连接
  19. connection = DriverManager.getConnection(url,user,password);
  20. //3、获取数据库操作对象
  21. statement = connection.createStatement();
  22. //4、写一个sql语句
  23. String sql = "insert into tb_stu(name,age,address)values('张三',20,'xxx')";
  24. //5、执行sql语句
  25. //num 影响记录条数
  26. //executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()
  27. int num = statement.executeUpdate(sql);
  28. if(num == 1){
  29. System.out.println("添加成功");
  30. }else{
  31. System.out.println("失败");
  32. }
  33. } catch (Exception e) {
  34. e.printStackTrace();
  35. }finally {//6、关闭数据库资源
  36. try {
  37. statement.close();
  38. } catch (SQLException throwables) {
  39. throwables.printStackTrace();
  40. }
  41. try {
  42. connection.close();
  43. } catch (SQLException throwables) {
  44. throwables.printStackTrace();
  45. }
  46. }
  47. }
  48. }

执行查询的代码

  1. String sql = "select * from tb_stu";
  2. //executeQuery()是用于查询语句的方法,即DQL
  3. //resultSet是一个结果集
  4. ResultSet resultSet = statement.executeQuery(sql)
  5. while(resultSet.next()){
  6. String name = resultSet.getString("name");
  7. int age = resultSet.getInt("age");
  8. String address = resultSet.getString("address");
  9. System.out.println(name+ " "+age+" "+address);
  10. }

二、把数据库配置信息写到配置文件中

我们一般不会直接写入配置文件,而是将如url,user,password这样的配置信息放到配置文件中,然后读取的。
后缀是.properties
用类 ResoucesBundle进行读取,方法是getBundle();

  1. public class JDBCDemo {
  2. public static void main(String[] args) throws Exception {
  3. ResourceBundle jdbc = ResourceBundle.getBundle("com/jy/demo/jdbc");
  4. String driver = jdbc.getString("driver");
  5. String url = jdbc.getString("url");
  6. String user = jdbc.getString("user");
  7. String password = jdbc.getString("password");
  8. System.out.println(driver);
  9. Class.forName(driver);
  10. Connection connection = DriverManager.getConnection(url,user,password);
  11. Statement statement = connection.createStatement();
  12. int num = statement.executeUpdate("insert into test01(name,age,address)values('张三',20,'xxx')");
  13. statement.close();
  14. connection.close();
  15. }
  16. }

三、另一个数据库操作对象

statement会造成sql注入,为防止SQL注入,使用另一个数据库操作对象先做预编译,在做执行。
user和password先不传具体的值,进行预编译,?作为占位符。

代码如下

  1. //获取数据库操作对象 并且预编译sql
  2. PreparedStatement preparedStatement =
  3. connection.prepareStatement
  4. ("select * from tb_user where user = ? and password = ? ");
  5. //给占位符赋值
  6. preparedStatement.setString(1,"jack");
  7. //password=123
  8. //1234' or '1'='1' 是SQL注入
  9. preparedStatement.setString(2,"1234' or '1'='1'");
  10. ResultSet resultSet = preparedStatement.executeQuery();
  11. if(resultSet.next()){
  12. System.out.println("登录成功");
  13. }else{
  14. System.out.println("失败");
  15. }

前面与上面代码块一样,从获取数据库对象开始不同,password设置的值为123,可当我输入的不是123且使用statement时,却登录成功,这是一个漏洞,所以使用preparStatemnet,不会出现这个漏洞。