JDBC:
JDBC,其实就是Java定义的一套和数据库建立连接的规范(接口),那么各家数据库厂商,想要Java去操作各家的数据库,必须实现这套接口,我们把数据库厂商写的这套实现类,称之为数据库驱动。
快速入门:
1.导入数据库的驱动jar包,记得依赖一下
2.加载驱动,通过反射方式
class.forName(com.mysql.jdbc.Driver);
3.获取连接对象
- 方式1:Connection conn=DriverManager.getConnection("jdbc(主协议):mysql(子协议): //localhost(主机名):3306(端口号 )/库名","root","密码");
- 方式2:Connection conn=DriverManager.getConnection("jdbc:mysql:///库名","root","密码");
4.获取操作对象
Statement statement=conn.createStatement();
5.执行SQL语句
String sql="........";
int i=statement.executeUpdate(sql);
//用来执行DML语句 用来对表中数据进行增删改 返回值是影响的行数
ResultSet resultSet=statement.excuteQuery(sql);
resultSet.next();
//用来执行DQl语句
boolean b = statement.execute(sql);
//用来执行所有的SQL语句 返回:
6.释放资源
conn.close();
statement.close();
resultSet.close();
实例:JDBC 给数据库添加数据
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCtest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql:///logindb", "root", "123456");
//获取操作对象
Statement statement = conn.createStatement();
//执行SQl语句
int i = statement.executeUpdate("insert into test_user values ('王五','123456')");
if(i>0){
System.out.println("操作成功");
}else{
System.out.println("操作失败");
}
//释放资源
conn.close();
statement.close();
}
补充:
结果集对象,是我们执行了查询语句之后返回的一个查询结果对象
ResultSet 对象具有指向其当前数据行的光标。 最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while循环中使用它来迭代结果集。
while (resultSet.next()){
//方式1:
//参数就是数据库中的字段序号 从1开始
//String username = resultSet.getString(1);
//int age = resultSet.getInt(2);
//方式2:
//通过字段名来获取字段的值
String username = resultSet.getString("username");
int age = resultSet.getInt("age");
//System.out.println(username+"==="+age);
//我们从数据库中取出了数据,就是为了要使用这些数据,那我们就要对这些数据进行封装
Student student = new Student(username, age);
list.add(student);
}
预编译操作对象
这个操作对象,可以在安全方面防止SQL注入
使用步骤:
- 1.conn.prepareStatement(sql);
- 2.sql语句中的字段的值用?问号占位
- 3.给sql语句中的问号赋值
实例:
import java.sql.*;
public class JDBCTest2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///logindb", "root", "123456");
//获取一个预编译操作对象 PreparedStatement,SQL语句中的值 全部用 ? 问号占位
PreparedStatement preparedStatement = conn.prepareStatement("select *from test_user where username=? and password=?");
//下来给问号赋值 参1.问号的顺序,从1开始数 参数2 问号的值
preparedStatement.setString(1,"李四");
preparedStatement.setInt(2,123456);
//这里就不要再传入SQL语句
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()){
System.out.println("查询成功");
}else{
System.out.println("查询不存在");
}
}
}
批处理
插入大量数据时,建议使用批处理来做
public class MyJDBCDemo {
public static void main(String[] args) throws Exception {
//模拟数据
ArrayList<Users> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Users users = new Users("李某某" + i, "12345" + i);
list.add(users);
}
//将上面的数据添加到数据库中的user表
Connection conn = JDBCUtils.getConnection();
String sql="insert into users values(?,?)";
PreparedStatement statement = conn.prepareStatement(sql);
for (Users u : list) {
//给问号赋值
statement.setString(1,u.getUsername());
statement.setString(2,u.getPassword());
//statement.executeUpdate();//一条一条往里面插入,效率不高
statement.addBatch();//添加批处理,先将数据缓存起来
}
statement.executeBatch();//执行批处理
statement.clearBatch();//清空缓存
//释放资源
JDBCUtils.close(conn,statement);
}
}