JDBC:Java DataBase Connectivity Java 连接数据库
JDBC,其实就是Java定义的一套和数据库建立连接的规范(接口),那么各家数据库厂商,想要Java去操作各家的数据库,必须实现这套接口,我们把数据库厂商写的这套实现类,称之为数据库驱动。
JDBC快速入门
⭐⭐⭐JDBC快速入门代码:
1.导入数据库的jar包。
2.加载驱动jar包。
3.获取连接对象。
4.获取操作对象。
5.开始操作。
6.释放资源
//导入jar包,mysql-connector-java-5.1.18-bin.jar,jar包在上一篇博客中找
//加载驱动jar包
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
String url="jdbc:mysql://localhost:3306/mydb";
String username="root";
String password="1234";
Connection connection=DriverManager.getConnection(url,username,password);
//获取操作对象
Statement statement = connection.createStatement();
//定义SQL语句
String sql="insert into users values(null,'yangjian','666666',now())";
//发送SQL语句
int i = statement.executeUpdate(sql); // i 返回的是影响的行数
if (i!=0) {
System.out.println("插入成功!");
}else{
System.out.println("插入失败!");
}
//释放资源
connection.close();
statement.close();
Class.forName("com.mysql.jdbc.Driver"); 加载驱动,也可以省略不写
注册驱动这个动作是Driver里面有个静态代码块在做
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
类 DriverManager Java提供的 管理一组 JDBC 驱动程序的基本服务。
接口 Connection 试图建立到给定数据库 URL 的连接。
接口 Statement 用于执行静态 SQL 语句并返回它所生成结果的对象。
boolean b = statement.execute(sql);//用来执行所有的SQL语句 返回:
如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false
int i = statement.executeUpdate(sql);//用来执行DML语句 用来对表中数据进行增删改 返回值是影响的行数
statement.executeQuery(sql);//用来执行DQl语句
结果集对象 ResultSet
结果集对象,是我们执行了查询语句之后返回的一个查询结果对象。
ResultSet 对象具有指向其当前数据行的光标,最初,光标被置于第一行之前,next方法将光标移动至下一行;
因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。
最初,光标被置于第一行之前,next方法将光标移动到下一行,该方法在ResultSet对象没有下一行时返false
所以可以在while循环中使用它来迭代结果集。
while (resultSet.next()){
//根据列名或列号
//参数就是数据库中的字段序号 从1开始
int id= resultSet.getInt(1);
//通过字段名来获取字段的值
String username1 = resultSet.getString("username");
String password1 = resultSet.getString(3);
Date date = resultSet.getDate(4);
System.out.println(id+"=="+username1+"=="+password1+"=="+date);
//把查询出来的数据,封装到对象中
//我们从数据库中取出了数据,就是为了要使用这些数据,那我们就要对这些数据进行封装
User user = new User();
user.setId(id);
user.setUsername(username1);
user.setPassword(password1);
user.setMydate(date);
list.add(user);
}
预编译操作对象PreparedStatement
这个操作对象,可以在安全方面防止SQL注入
使用步骤:1.connection.prepareStatement(sql);
2.sql语句中的字段的值用?问号占位
3.给sql语句中的问号?赋值
public class Mytest3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//模拟登录
//SQL注入:利用数据库的语法规则漏洞,拼接一些特殊的字符串,从而绕过数据库正常的规则校验
String username="1 'or' 1'='1";
String password="1 'or' 1'='1";
username="aaa";
password="123456";
//调用JDBC来查询数据库
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/mydb";
String uname="root";
String pwd="1234";
Connection connection = DriverManager.getConnection(url, uname, pwd);
//创建读写操作
//我们使用可以预防sql注入的操作读写
//Statement statement = connection.createStatement();
//参数使用?占位
String sql="select * from users where username=? and password=?";
//我们提前把sql传进来,进行预编译
//PreparedStatement预编译操作对象,可以防止SQL注入
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//对问号进行赋值,问号从左往右数,从1开始
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//执行查询语句
//ResultSet 返回结果集对象
//SELECT * FROM users WHERE username='1' OR '1'='1' AND PASSWORD='1' OR '1'='1';
//String sql="select * from users where username='"+username+"' and password='"+password+"'";
//执行查询
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()){
System.out.println("登陆成功");
}else{
System.out.println("登录失败");
}
//资源释放
connection.close();
preparedStatement.close();
resultSet.close();
}
}
JDBC调用存储和自定义函数 CallableStatement
public class Mytest {
public static void main(String[] args) throws SQLException {
//调用存储过程和函数
/*
* 用于执行SQL存储过程的接口,JDBC API提供了一个存储过程SQL转义语法
* 该语法允许对所有的RDBMS使用标准方式调用存储过程。
* 此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式
* 如果使用结果参数,则必须将其注册为OUT参数
* 其他参数可用于输入,输出或同时用于二者,参数是根据编号按顺序引用的,第一个参数的编号是1.
*/
// {?=call<procedure -name >[( < arg1 >,<arg2 >, ...)]} //调用函数的语法
// {call<procedure -name >[( < arg1 >,<arg2 >, ...)]} //调用存储过程的语法
Connection connection = JDBCUtils.getConnection();
String sql="{call myPro1(?,?)}";
CallableStatement callableStatement = connection.prepareCall(sql);
callableStatement.setInt(1,7566);
//注册一下输出参数
callableStatement.registerOutParameter(2, Types.INTEGER);
//调用存储过程
/*
* execute() 方法返回值的意思
* 如果第一个结果为ResultSet() 对象,则返回true;
* 如果其为更新计数或者不存在任何结果,则返回false
*/
boolean b = callableStatement.execute();
System.out.println(b);
//获得输出参数值
int sum = callableStatement.getInt(2);
System.out.println(sum);
//释放资源
JDBCUtils.close(connection,callableStatement);
}
}
获取自增长键的值
1.要获取自增长键的值,需要在获取操作对象时声明一个参数,Statement.RETURN_GENERATED_KEYS
PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "我爱你");
preparedStatement.setInt(2, 20);
2.当数据插入成功后,就可以取出这个自增长键的值
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
while (generatedKeys.next()) {
int keysInt = generatedKeys.getInt(1);
System.out.println(keysInt);
}