jdbc:
Java DataBase Connection 通过Java语言来连接数据库的一门技术。
sun公司提供的一套接口规范
如果想要通过jdbc连接mysql,我们需要获得mysql的实现类,称为驱动,其他数据库同理。
一、jdbc编程六个步骤:
1、注册驱动
Class.forName(“全类名”)
例如:
Class.forName(com.mysql.jdbc.Driver)
此时会抛异常,使用try-catch处理
注册驱动有个旧版的方式:
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。
执行增删改的代码
public class Demo01 {
public static void main(String[] args) {
Statement statement = null;
Connection connection = null;
try {
//1、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//url 连接数据库的地址(com.mysql.jdbc.Driver已弃用)
//jdbc:mysql 协议
//localhost 本地ip地址
//3306 mysql默认端口号
//serverTimezone=GMT 时区
//characterEncoding=utf-8 防止中文乱码
String url =
"jdbc:mysql://localhost:3306/test_stu?serverTimezone=GMT&characterEncoding=utf-8";
String user = "root";
String password = "root";
//2、获取数据库连接
connection = DriverManager.getConnection(url,user,password);
//3、获取数据库操作对象
statement = connection.createStatement();
//4、写一个sql语句
String sql = "insert into tb_stu(name,age,address)values('张三',20,'xxx')";
//5、执行sql语句
//num 影响记录条数
//executeUpdate()是用于增删改的方法,即属于数据操纵语言(DML)的都用executeUpdate()
int num = statement.executeUpdate(sql);
if(num == 1){
System.out.println("添加成功");
}else{
System.out.println("失败");
}
} catch (Exception e) {
e.printStackTrace();
}finally {//6、关闭数据库资源
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
执行查询的代码
String sql = "select * from tb_stu";
//executeQuery()是用于查询语句的方法,即DQL
//resultSet是一个结果集
ResultSet resultSet = statement.executeQuery(sql)
while(resultSet.next()){
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String address = resultSet.getString("address");
System.out.println(name+ " "+age+" "+address);
}
二、把数据库配置信息写到配置文件中
我们一般不会直接写入配置文件,而是将如url,user,password这样的配置信息放到配置文件中,然后读取的。
后缀是.properties
用类 ResoucesBundle进行读取,方法是getBundle();
public class JDBCDemo {
public static void main(String[] args) throws Exception {
ResourceBundle jdbc = ResourceBundle.getBundle("com/jy/demo/jdbc");
String driver = jdbc.getString("driver");
String url = jdbc.getString("url");
String user = jdbc.getString("user");
String password = jdbc.getString("password");
System.out.println(driver);
Class.forName(driver);
Connection connection = DriverManager.getConnection(url,user,password);
Statement statement = connection.createStatement();
int num = statement.executeUpdate("insert into test01(name,age,address)values('张三',20,'xxx')");
statement.close();
connection.close();
}
}
三、另一个数据库操作对象
statement会造成sql注入,为防止SQL注入,使用另一个数据库操作对象先做预编译,在做执行。
user和password先不传具体的值,进行预编译,?作为占位符。
代码如下
//获取数据库操作对象 并且预编译sql
PreparedStatement preparedStatement =
connection.prepareStatement
("select * from tb_user where user = ? and password = ? ");
//给占位符赋值
preparedStatement.setString(1,"jack");
//password=123
//1234' or '1'='1' 是SQL注入
preparedStatement.setString(2,"1234' or '1'='1'");
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("失败");
}
前面与上面代码块一样,从获取数据库对象开始不同,password设置的值为123,可当我输入的不是123且使用statement时,却登录成功,这是一个漏洞,所以使用preparStatemnet,不会出现这个漏洞。