JDBC
Posted huangqiang97
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC相关的知识,希望对你有一定的参考价值。
1.1 1:JDBC概述
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。
JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。
1.2 2:JDBC开发步骤
1.注册驱动
告知JVM使用的是哪一个数据库的驱动
2.获得连接
使用JDBC中的类,完成对mysql数据库的连接
3.获得语句执行平台
通过连接对象获取对SQL语句的执行者对象
4.执行sql语句
使用执行者对象,向数据库执行SQL语句
获取到数据库的执行后的结果
5.处理结果
6.释放资源 一堆close()
1.3 3API详解:获得语句执行平台
String sql = "某SQL语句";
获取Statement语句执行平台:Statement stmt = con.createStatement();
常用方法:
int executeUpdate(String sql); --执行insert update delete语句.
ResultSet executeQuery(String sql); --执行select语句.
boolean execute(String sql); --执行select返回true 执行其他的语句返回false.
1.4 4API详解:处理结果集(执行insert、update、delete无需处理)
ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据,遍历要紧接着放在查询语句后面,之间不能插入其他执行语句:
rs.next();//指向第一行
rs.getInt(1);//获取第一行第一列的数据
常用方法:
Object getObject(int index) / Object getObject(String name) 获得任意对象
String getString(int index) / Object getObject(String name) 获得字符串
int getInt(int index) / Object getObject(String name) 获得整形
double getDouble(int index) / Object getObject(String name) 获得双精度浮点型
1.5 5API详解:释放资源
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
rs.close();
stmt.close();
con.close();
4:链接SQL:
Class.forName("com.mysql.cj.jdbc.Driver");//Driver中含有注册驱动的静态代码块,进内存时就会完成初始化。
String url = "jdbc:mysql://localhost:3306/DataBaseName?useSSL=FALSE&serverTimezone=UTC";
String username="root";
String password="password
";
Connection con = DriverManager.getConnection(url,username,password);//获得链接对象
Statement stat = con.createStatement();//获得执行者对象。
int row = stat.executeUpdate ("sql表达式");//执行语句,row 为改变的表格行数。
ResulrSet rs=stat.executeQuery(SQL语句);
While(rs.next){
rs.getInt(“id”)+rs.getString(“name”);
}
Rs.close();
Sta.close();
con.close();
1.6 5:注入攻击
String sql = "SELECT * FROM users WHERE username=‘"+user+"‘ AND PASSWORD=‘"+pass+"‘";
在输入:user=”name” password=”password ‘or’1=1”;
SqL语句就会变成:SELECT * FROM users WHERE username=‘name‘ AND PASSWORD=‘password’ or ’ 1=1‘
在SQL语句中布尔值也要用‘’包围,‘1=1’即为‘true’ where 后面就变成true.查询成功。
解决:应用PreparedStatement (SQL预编译存储,多次高效的执行SQL) ,可用于executeUpdate,executeQuery()
String sql="select * from testdatabase.testtable where usr_name=? and usr_password=?";
PreparedStatement
preparedStatement=con .prepareStatement(sql);
preparedStatement.setString(1,usrName);//int index:从1开始第几个占位符初始化。setInt(),setObject()….
preparedStatement.setString(2,usrPassword);
ResultSet resultSet=preparedStatement.executeQuery();
String sql="insert
into testdatabase.testtable(usr_name, usr_password) values (?,?)";ent preparedStatement=con .prepareStatement(sql);
preparedStatement.setString(1,usrName);
preparedStatement.setString(2,usrPassword);
preparedStatement.executeUpdate();
1.7 6:工具类
public class JDBCUtils {
private JDBCUtils(){}
private static Connection con ;
static{
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybase";
String username="root";
String password="123";
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(ex);
}
}
public static Connection getConnection(){
return con;
}
public static void close(Connection con,Statement stat){
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
public static void close(Connection con,Statement stat , ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(SQLException ex){}
}
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
}
1.8 使用properties配置文件
开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
通常情况下,我们习惯使用properties文件,此文件我们将做如下要求:
文件位置:任意,建议src下,客户仅有bin 文件夹,系统会自动把文件拷贝到out\prodection\projectname下,从该目录下读取文件。
文件名称:任意,扩展名为properties
文件内容:一行一组数据,格式是“key=value”.
key命名自定义,如果是多个单词,习惯使用点分隔。例如:jdbc.driver
value值不支持中文,如果需要使用非英文字符,将进行unicode转换。
public class JDBCUtilsConfig {
private static Connection con ;
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
try{
readConfig();
Class.forName(driverClass);
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException("数据库连接失败");
}
}
private static void readConfig()throws Exception{
InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");//使用类的加载器在.class文件文件夹下加载配置文件。
Properties pro = new Properties();
pro.load(in);
driverClass=pro.getProperty("driverClass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
}
public static Connection getConnection(){
return con;
}
}
以上是关于JDBC的主要内容,如果未能解决你的问题,请参考以下文章