JDBC编程基础
什么是JDBC编程?
JDBC全称叫Java数据库连接(Java Database Connectivity),是一种利用Java API(Java抽象接口)进而执行数据库SQL语句的一种数据库连接规范。
什么是Java API?
它是java.sql.*或者javax.sql.*中一些抽象类和接口组成,它为关系型数据库的操作提供了统一规范。
什么是数据库驱动包?
不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动“mysql-connector-java”,需要基于Java操作MySQL即需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包。
JDBC的工作原理
导入数据库驱动包(每种数据库对每种语言都有专门的数据库驱动包)——>加载驱动程序(使Java确定操作对象)——>建立与客户端的连接——>执行SQL语句。
具体过程如下:
(导包):在项目的src同级目录下建立一个名为lib的文件,并将依赖包mysql-connector-java-5.1.47.jar制到lib中。再配置该jar包到本项目的依赖中:右键点击项目Open Module Settings,在Modules中,点击项目,配置Dependencies,点击+,JARS or Directories,将该lib文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。
(加载驱动程序):
Class.forName("com.mysql.jdbc.Driver");
(建立与客户端的连接):
String url="jdbc:mysql://127.0.0.1:3306/mydatabase?useSSL=false";//定位数据库所在的客户端的表
String name="***";//用户名(自己的数据库账户名)
String password="*****";//密码 (自己数据库的密码)
Connection connection=DriverManager.getConnection(url,name,password);//建立连接
在url中127.0.0.1代表本地主机IP地址,3306代表当前sql服务器的进程号。
(执行sql语句):
String sql="select * from user";//容易出现sql注入
Statement statement=connection.createStatement();
ResultSet resultset=statement.executeQuery(sql);
while(resultset.next()){//resultset此时指向数据行的上一行,它会自行进行判断,如果下一行
//没有数据返回false否则返回true
System.out.print("id="+resultset.getInt(1)+" ");
System.out.print("acount="+resultset.getString(2)+" ");
System.out.println("amount="+resultset.getInt(3));
//上面三行是指我访问表中一行的对应字段值
}
以上只是以执行查询作为例子进行执行的,并且是有对应优化的,如下:
String url="jdbc:mysql://127.0.0.1:3306/mydatabase?useSSL=false";//定位数据库所在的客户端
String name="***";//用户名
String password="******";//密码
DataSource dataSource=new MysqlDataSource();//获取连接(DataSourse具有数据库连接池)
/*数据源*/
((MysqlDataSource)dataSource).setUrl(url);
((MysqlDataSource)dataSource).setUser(name);
((MysqlDataSource)dataSource).setPassword(password);
Connection connection=dataSource.getConnection();
/*
* 执行sql语句
* */
String sql="select * from user where id=? or id=?";//进一步解决sql注入,其中?为占位符,编译时会进行变量替换
PreparedStatement statement=connection.prepareStatement(sql);//直接执行,不用Statement对象
statement.setInt(1,1);//第一个参数是字段号,第二个参数是数据值
statement.setInt(2,250);
ResultSet resultset=statement.executeQuery();//对sql语句进行优化,减少sql注入的可能
while(resultset.next()){
System.out.print("id="+resultset.getInt(1)+" ");
System.out.print("acount="+resultset.getString(2)+" ");
System.out.println("amount="+resultset.getInt(3));
}
resultset.close();//这些都是资源用完一定要关闭
statement.close();//这些都是资源用完一定要关闭
connection.close();//这些都是资源用完一定要关闭
那有人就问了,飞哥,为什么没有驱动加载这一步呢,因为在DataSourse中已经封装好了。