由于数据库的厂商有很多,每个数据库的特点都不同,为了屏蔽数据库层的细节,规定一组接口,具体实现由每个数据库的厂商根据自己情况实现,java应用层只需要面向这个接口,这个接口就是JDBC
基本的使用:
获取数据库连接的5种方式:
1、获取Driver对象,这种方式属于静态加载,灵活性差,依赖强
public void connect01 throws SQLException{
//创建Driver对象
Driver driver = new Driver();
//保存数据库地址,这里的jdbc:mysql:是固定的,不能更改
String url = "jdbc:mysql://ip地址:端口/表的地址";
//将用户名、密码保存在Properties对象
Properties properties = new Properties();
Properties.setProperty("user","用户名");
Properties.setProperty("password","密码");
//创建Connection对象,建立连接
Connection connection = driver.connect(url,properties);
}
2、使用反射加载Driver类,主要是创建Driver对象的不同,相对灵活,减少依赖性
public void connect02 throws NotClassFoundException{
//通过反射加载Driver类
Class<?> aClass = Class.forName("Driver包目录");
Driver driver = (Driver)aClass,newInstance();
//保存数据库地址
String url = "jdbc:mysql://ip地址:端口/表的地址";
//将用户名、密码保存在Properties对象
Properties properties = new Properties();
Properties.setProperty("user","用户名");
Properties.setProperty("password","密码");
//创建Connection对象,建立连接
Connection connection = driver.connect(url,properties);
}
3、使用DriverManager替代Driver对象
public void connect03 throws Exception{
//通过反射加载Driver类
Class<?> aClass = Class.forName("Driver包目录");
Driver driver = (Driver)aClass,newInstance();
//保存数据库地址,用户名,密码
String url = "jdbc:mysql://ip地址:端口/表的地址";
String user = "用户名";
String password = "密码";
//注册Driver驱动
DriverManager.registerDriver(driver);
//创建Connection对象,建立连接
Connect connect = DriverManager.getConnection(url,user,password);
}
4、使用Class.forName自动完成注册驱动,是对方法3的简化
public void connect04 throws Exception{
//通过反射加载Driver类,在jdk1.5以后使用了jdbc4,不再需要显式的反射,会自动调用驱动包
//中的类名称去注册
//另外mysql5.1.6之后的版本不用反射
//不过还是建议显式写出
Class.forName("Driver包目录");
//保存数据库地址,用户名,密码
String url = "jdbc:mysql://ip地址:端口/表的地址";
String user = "用户名";
String password = "密码";
//创建Connection对象,建立连接
Connect connect = DriverManager.getConnection(url,user,password);
}
方法4之所以能简化,是因为Driver类有个静态方法块,已经注册好了驱动,也是比较推荐的
5、在方法4的基础上改进,增加配置文件,可以更加灵活
public void connect05 throws Exception{
//创建Properties对象,获取配件文件信息
Properties properties = new Properties();
properties.load(new FileInputStream("配置文件目录"));
//保存数据库地址,用户名,密码,驱动
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
//创建Connection对象,建立连接
Class.forName("Driver包目录");//可不写,建议写上
Connect connect = DriverManager.getConnection(url,user,password);
}
通过jdbc操作表:
public void jdbctest throws Exception{
//先利用上面的5种方式连接表,代码就先省略
...
//执行sql
String sql = "sql语句";
Statement statement = connect.creatStatement();
int rows = statement.executeUpdate(sql);//返回的是查询的行数或者dml影响到的行数
//关闭连接资源
statement.close();
connect.close();
}
ResultSet(结果集):
通常是操作表后执行,里面有个方法类似迭代,可以通过循环语句遍历表中的数据
public void ResultSettest throws Exception{
//连接表、执行sql,代码就先省略
...
//执行后的表,一行数据作为一个对象,创建ResultSet对象后,光标指向列名的一行
ResultSet resultSet = statement.executeQuery(sql);
//通过while遍历表中的数据
while(resultSet.next()){//如果没有更多行,返回false
int i = resultSet.getInt(1);//获取该行的第一列数据
String name = resultSet.getString(2);//获取该行的第二列数据,可以看出方法名需要根据数据类型选择
}
//关闭连接资源
resultSet.close();
statement.close();
connect.close();
}
SQL注入:
利用sql的语法漏洞,输入非法的sql语句,恶意攻击数据库
之前用的是Statement对象操作sql语句,无法阻止非法注入
所以衍生了扩展类preparedStatement预处理,可以有效阻止这类情况发生
public void preparedStatementSettest throws Exception{
//连接表,代码就先省略
...
String sql = "select * from table where lable1 = ? and lable2 = ?";
//通过PreparedStatement操作sql,也可以进行DML操作
PreparedStatement preparedStatement = connect.preparedStatement (sql);
//第一个参数代表占位符的第几顺位,第二个参数代表替换
preparedStatement.setString(1,String1);
preparedStatement.setString(2,String2);
//这里就不要带参数了
ResultSet resultSet = preparedStatement.executeQuery();
//关闭连接资源
resultSet.close();
statement.close();
connect.close();
}
其他知识点:
1、在java程序中,用Connection连接表时,事务默认是自动提交状态
可以通过setAutoCommit(false)
方法,关闭自动提交
rollback()
回滚到setAutoCommit(false)
这一行
2、批量处理
在java程序中执行sql后,PreparedStatement或者Statement调用addBatch()方法进行批量处理打包
然后executeBatch()进行批量执行
可以通过clearBatch()进行批量包清空