使用JDBC连接数据库的基本过程
1:加载驱动
2:使用驱动管理器与数据库建立连接,并获取Connection对象
3:通过Connection创建执行语句对象Statement
4:通过执行语句对象执行SQL语句
5:如果执行的是DQL语句则会得到查询结果集ResultSet
6:遍历结果集获取查询数据
7:关闭数据库连接
java访问数据库的解决方案,无论是Oracle还是mysql还是高斯,java连接数据库的方式都是一样的
JDBC就是一套标准接口,面向java程序,接口里面有很多抽象方法,规定了我们怎么连数据库,连上之后怎么发送sql语句,因此各数据库厂商就会根据自己数据库的特点分别写他们自己的实现类,去实现JDBC接口
JDBC Driver就是JDBC接口的这些实现类
mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver");
mysql的url地址
db.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
1.JDBC创建表userinfo(DDL)
public static void main(String[] args)throws Exception {
//1.加载驱动
//不同数据库提供的驱动名字不一样
Class.forName("com.mysql.cj.jdbc.Driver");
//2:使用驱动管理器与数据库建立连接,并获取Connection对象
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true","root","root");
System.out.println("数据库连接成功!");
//3:通过Connection创建执行语句对象Statement
Statement statement = connection.createStatement();
String sql="CREATE TABLE userinfo(" +
" id INT PRIMARY KEY AUTO_INCREMENT," +
" username VARCHAR(30)," +
" password VARCHAR(30)," +
" nickname VARCHAR(30)," +
" age INT(3)" +
")";
//4:通过执行语句对象执行SQL语句
statement.execute(sql);
//5:关闭数据库连接
connection.close();
}
2.JDBC给表中插入记录(DML)
Statement提供了用于执行DML语句的方法:
int executeUpdate(String sql)
该方法执行后会返回一个int值,表示执行DML操作后影响了表中多少条记录
public static void main(String[] args) throws Exception {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true"
,"root","root");
Statement statement = connection.createStatement();
String sql="insert into userinfo(username,password,nickname,age) " +
"values('张三','123456','三哥',22)";
int i = statement.executeUpdate(sql);
if(i>0)
System.out.println("插入成功!");
connection.close();
}
案例
/**
* 实现用户注册功能
* 程序启动后要求用户顺序输入:用户名,密码,昵称,年龄
* 用户名,密码,昵称不能为空,年龄必须是整数
* 然后将该信息插入到表userinfo中。
*/
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true"
,"root","root");
System.out.println("请输入用户名,密码,昵称,年龄");
Scanner scan=new Scanner(System.in);
String username = scan.nextLine();
String password=scan.nextLine();
String nickname=scan.nextLine();
int age=scan.nextInt();
Statement statement = connection.createStatement();
String sql="insert into userinfo (username,password,nickname,age) " +
" values ('"+username+"','+"+password+"','"+nickname+"','"+age+"')";
int i = statement.executeUpdate(sql);
if(i>0)
System.out.println("注册成功!");
else
System.out.println("用户名已存在!");
}
可以发现以上案例中每次都需要加载驱动,与数据库建立连接,所以我们把加载驱动和
建立连接封装起来,后面的案例就会简化很多
创建DBUtil类管理数据库连接
public class DBUtil {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getconnection()throws Exception {
return DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true"
,"root","root");
}
}
3.JDBC更新表中数据
public static void main(String[] args){
//需要关闭的流或者连接放到try后面的括号里
try (Connection connection = DBUtil.getconnection()){
Statement statement = connection.createStatement();
String sql="update userinfo " +
"set password='666666'" +
" where username='lkp'";
int num = statement.executeUpdate(sql);
if(num>0)
System.out.println("修改成功!");
else {
System.out.println("修改失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
4.JDBC删除表中记录
public static void main(String[] args) {
//根据用户名删除对应的用户
try (Connection connection = DBUtil.getconnection()){
Statement statement = connection.createStatement();
String sql="delete from userinfo where username='lkp'";
int num = statement.executeUpdate(sql);
if(num>0)
System.out.println("删除成功!");
else {
System.out.println("删除失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
5.JDBC查询表中数据
ResultSet提供的遍历结果集相关方法:
boolean next()
让结果集向下移动一条记录,如果该记录存在则返回true
默认结果集在第一条记录之上int getInt(String cn)
String getString(String cn)
long getLong(String cn)
double getDouble(String cn)Statement提供的用于执行DQL语句的方法:
ResultSet executeQuery(String sql)
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimeZone=Asia/shanghai&rewriteBatchedStatements=true",
"root",
"root"
);
String sql="select id,name,salary,title from teacher";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int id=resultSet.getInt("id");
String name=resultSet.getString("name");
int salary=resultSet.getInt("salary");
String title=resultSet.getString("title");
System.out.println(id+","+name+","+salary+","+title);
}
}
1,刘苍松,10000,总监
2,范传奇,3000,三级讲师
3,王克晶,8000,一级讲师
4,刘国斌,7300,二级讲师
5,成恒,5200,三级讲师
6.JDBC关联查询
//查看lkp所带班级的信息,列出老师名字,老师性别,班级名字,班级楼层
也可以通过字段下标获取对应的值。注:结果集第一个字段下标是1,不是0。
public static void main(String[] args) {
try (
Connection connection = DBUtil.getConnection();
){
Statement statement = connection.createStatement();
String sql = "SELECT t.name,t.gender,c.name,c.floor " +
"FROM teacher t,class c " +
"WHERE t.id=c.teacher_id " +
"AND t.name='lkp'";
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
// String tName = rs.getString("t.name");
// String tGender = rs.getString("t.gender");
// String cName = rs.getString("c.name");
// int cFloor = rs.getInt("c.floor");
//也可以通过字段下标获取对应的值。注:结果集第一个字段下标是1,不是0。
String tName = rs.getString(1);
String tGender = rs.getString(2);
String cName = rs.getString(3);
int cFloor = rs.getInt(4);
System.out.println(tName + ", " + tGender + ", " + cName + ", " + cFloor);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
7.JDBC关联查询2
//查看1年级1班的学生共多少人?
可以给聚合函数起别名然后在java中使用
public static void main(String[] args) {
try (Connection getconnection = DBUtil.getconnection()){
Statement statement = getconnection.createStatement();
String sql="select COUNT(*) count from student s,class c where s.class_id=c.id" +
" and c.name='1年级1班'";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
int c=resultSet.getInt("count");
System.out.println("人数:"+c);
}
} catch (Exception e) {
e.printStackTrace();
}
}
8.JDBC-在DML语句中使用预编译SQL
预编译是防止sql注入
Statement提供了用于执行DML语句的方法:
int executeUpdate(String sql)
该方法执行后会返回一个int值,表示执行DML操作后影响了表中多少条记录
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true"
,"root","root");
System.out.println("请输入用户名,密码,昵称,年龄");
Scanner scan=new Scanner(System.in);
String username = scan.nextLine();
String password=scan.nextLine();
String nickname=scan.nextLine();
int age=scan.nextInt();
String sql="insert into userinfo (username,password,nickname,age)" +
" values (?,?,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
ps.setString(3,nickname);
ps.setInt(4,age);
int i = ps.executeUpdate();
if(i>0)
System.out.println("注册成功!");
}