目录
四、Statement与PreparedStatement区别
一、JDBC概述
java database connection java连接数据库
jdbc是Java制定的的一套用于如何连接数据库的API,可以支持连接多种数据库。
Java只定义了一套标准(抽象类/接口),每种数据库的连接方式都不同,具体连接数据库的实现,数据库开发商自己实现,遵循Java制定的规范。
mysql-connector-java-8.0.16.jar jar文件,打包好的.class文件。
二、JDBC搭建
将MySQL 的jar文件导入到项目
首先 在项目中建立一个lib的文件夹
复制 mysql-connector-java-8.0.16.jar 粘贴在lib中
然后选中 jar 点击 add as library 能打开jar才算完成
三、JDBC代码实现
1.加载驱动
new Driver();
Class.forName("com.mysql.cj.jdbc.Driver");
//动态 加载Driver类 通过反射实现
2.建立与数据库连接
String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
Connection connection= DriverManager.getConnection(url,"root","root");
System.out.println(connection);
//com.mysql.cj.jdbc.ConnectionImpl@37574691 返回的类在此位置
3.向数据库发送SQL
对一列数据进行操作
Statement st=connection.createStatement();//返回的也是实现类
String mname= "信息与计算科学";
st.executeUpdate("insert into major(name) value ('"+mname+"')");
//增加 mname
st.executeUpdate("UPDATE major SET NAME = '"+mname+"' WHERE id = "+id);
// 修改
st.executeUpdate("delete from major where id ="+id);
//删除
PreparedStatement插入一组数据
4.关闭与数据库的连接
st.close();
connection.close();
四、Statement与PreparedStatement区别
区别1
Statement是将变量拼接到sql中,书写不便。
PreparedStatement 不需要将变量拼写到sql中, 使用特定的set方法设置值,书写方便。
区别2
Statement是将变量拼接到sql中,不安全,添加永远成立条件,恶意攻击(sql注入)。
PreparedStatement使用特定的set方法设置值,对设置的值进行检测,防止sql注入。
五、结果集处理
PreparedStatement和Statement中的executeQuery()方法中会返回一 个ResultSet对象,查询结果就封装在此对象中.
使用ResultSet中的next()方法获得下一行数据 使用getXXX(String name)方法获得
查询一条记录
public static void main(String[] args) throws ClassNotFoundException, SQLException {
findStudentById(1);
}
public static void findStudentById (Integer id) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
//动态 加载Driver类
String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
String uname="root";
String password="root";
Connection connection= DriverManager.getConnection(url,uname,password);
//将sql与 sql值预编译到 PreparedStatement中并未执行
PreparedStatement ps= connection.prepareStatement("select num,name,gender,birthday,height,phone,address from student where num =?");
ps.setObject(1,id);
ResultSet rs=ps.executeQuery();
//将查询到的数据封装到 对象中使用
// next 判断有无下一条数据,没有返回false
Student student=new Student();
while(rs.next()){
student.setNum(rs.getInt("num"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setHeight(rs.getDouble("height"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
}
System.out.println(student);
ps.close();
connection.close();
}
查询所有记录
查询所有记录时,建立一个学生类,查询时建立一个学生的集合来存储。
public static void main(String[] args) throws ClassNotFoundException, SQLException {
ArrayList<Student> students= findStudents();
System.out.println(students);
}
public static ArrayList<Student> findStudents () throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
//动态 加载Driver类
String url="jdbc:mysql://127.0.0.1:3306/schooldb?serverTimezone=Asia/Shanghai";
String uname="root";
String password="root";
Connection connection= DriverManager.getConnection(url,uname,password);
PreparedStatement ps= connection.prepareStatement("select num,name,gender,birthday,height,phone,address from student");
ResultSet rs=ps.executeQuery();
//将查询到的数据封装到 对象中使用
// next 判断有无下一条数据,没有返回false
ArrayList<Student> students=new ArrayList<>();
while(rs.next()){
Student student=new Student();
student.setNum(rs.getInt("num"));
student.setName(rs.getString("name"));
student.setGender(rs.getString("gender"));
student.setBirthday(rs.getDate("birthday"));
student.setHeight(rs.getDouble("height"));
student.setPhone(rs.getString("phone"));
student.setAddress(rs.getString("address"));
students.add(student);
}
ps.close();
connection.close();
return students;
}