mysql-connector-java-5.1.38百度云下载链接:https://pan.baidu.com/s/1bOEd6_mecjPxtSZMZgVyNA
提取码:hg63
JDBC(Java DataBase Connection):是一种用于执行SQL语句的JavaAPI(标准规范)
Java提供的访问数据库规范就是JDBC
使用前提:需要连接驱动jar(驱动jar是由生产厂商开发)
开发者通过Java代码实现与数据库进行通信,是因为有数据库连接驱动来规定通信的数据格式
数据库生产厂商提供数据库规范的实现类就是驱动
使用JDBC开发的步骤:
1.(注册)加载驱动:通过反射加载
2.获取连接:通过驱动管理器获取
3.获取SQL语句执行平台:通过连接获取
4.执行语句:通过平台发送执行
5.处理结果:执行语句返回值,更新(增,删,改)操作返回int值表示受影响行数,查询操作返回ResultSet(结果集,类似数据库表)
6.释放资源:通过close方法
开发准备:
1.下载驱动jar
2.将jar添加到java项目中
在项目上鼠标右键:Build Path->configure build path
开发代码-查询:
String url ="jdbc:mysql://localhost:3306/mydb";
String username = "root";
String password = "mysqlpass";
//加载驱动
/*
*
java.lang.ClassNotFoundException:表示驱动类没有找到
*/
Class.forName("com.mysql.jdbc.Driver");
//获取连接
/*
* 需要三个参数:
数据库连接地址:jdbc:mysql://ip或者hostname:端口号/数据库名
*--String url ="jdbc:mysql://localhost:3306/mydb";
* 地址三部分组成:
* 第一部分jdbc,固定的
* 第二部分:数据库厂商名称
* 第三部分:由数据库厂商规定,由数据库IP地址、端口号、数据库名组成
String username = "root";数据库用户名
*String password = "mysqlpass";数据库密码
*/
Connection con = DriverManager.getConnection(url, username, password);
//获取执行平台
/*
* 常用方法:
* int executeUpdate(String sql):执行inset,update,delete语句
* ResultSet executeQuery(String sql):执行select语句
*/
Statement sta = con.createStatement();
//执行语句
// sta.executeUpdate(sql)//执行更新
String sql = "select * from tb_user";
ResultSet rs = sta.executeQuery(sql);//执行查询
//处理结果
/*
* 处理结果集:
* 结果集实际就是一张二维表,通过next()方式向下移动指针指向一行数据
* 然后通过调用getXXX(列序号或列名),XXX表示数据库中当前列的数据类型,列序号从1开始的整数,列名是字符串
* 注意:操作结果集之前指针在表上,没有执行第一行数据,只有调用了一次next后指针才指向的第一行
*/
while(rs.next()) {
//通过getXXX返回获取每一列数据
int id = rs.getInt(1);
String name = rs.getString("name");
int age = rs.getInt(3);
System.out.println(id+" "+name + " " + age);
}
//释放资源
/*
* 和IO流一样,使用后的对象都需要关闭,关闭顺序是:先创建获取的后关闭,后创建获取的先关闭
*/
rs.close();
sta.close();
con.close();
SQL注入攻击:字符串语句中需要添加变量参数(字符串值拼接问题)
String uname = "任意字符 or 1=1
– ";
String sql = “select * from tb_user
where username=’”+uname+"’ and password=‘zs123’"
在通过执行平台执行SQL语句时,可以随便输入用户名和密码都能登录成功
解决办法:使用预处理对象PrepareStatement
PrepareStatement:使用方式:
- 获取执行平台:获取对象时指定的sql语句中在需要添加数据的位置通过占位符“?”代替,注意语句中的代替的部分是整个值(包含’’部分),而不是单引号中间的值,只有拼接才是代替单引号中间的值
错误写法:select * from tb_user where username=’?’ and password=’?’
正确写法:
- 设置实际参数:需要放入语句中的值,不是通过拼接,而是通过调用装配方法添加,方法是setXXX(占位符序号,值),XXX表示数据类型,序号从1开始,值是放入语句中的值
3.调用执行sql语句:
常用方法:
intexecuteUpdate();----执行insert,update,delete语句
ResultSet ececuteQuery();----执行select语句
使用预处理对象执行语句步骤:
1.(注册)加载驱动
2.获取连接
3.获取预处理对象:获取时需要指明sql语句,在其中通过?进行占位。
4.给SQL语句中的占位符设置实际参数:通过set方法设置
5.执行语句
6.处理结果:执行语句返回值,更新(增,删,改)操作返回int值表示受影响行数,查询操作返回ResultSet(结果集,类似数据库表)
7.释放资源:通过close方法
Statement和PreparedStatement的区别:
-
都是执行平台,都可以进行增,删,查,改
-
在Statement平台的sql设置语句参数时只能通过字符串拼接(会引起SQL语句注入攻击),而PreparedStatement平台可以通过占位符来避免注入攻击
-
使用Statement执行语句效率比PreparedStatement高
实际开发中一般都直接使用PreparedStatement对象
更新操作: