一、JDBC是什么?
JDBC(Java Database Connectivity):是Java访问数据库的解决方案。
JDBC定义了一套标准的接口,即访问数据库的通用API,不同数据库的厂商根据各自数据库的特点实现这些接口。
JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数据库厂商实现无关,从而不同数据库之间轻易的进行切换。
二、JDBC相关类和接口
一个类:DriverManager 驱动管理类
三个接口:Connection 连接接口
Statement 语句对象接口
ResultSet 结果集接口
三、下载数据库驱动
ps:我上传不上去,需要私聊我(笔芯)
四、JDBC工作原理(数据库连接JDBC的步骤)
(1)加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
(2)创建数据库连接
Connection conn = DriverManager.getConnection("mysql:jdbc://localhost:3306/myschool?severTimezone=GMT&useSSL=false","root","123456");
# myscool 数据库库名
# root 数据库账号
#123456 数据库密码
(3)创建Statement对象,执行SQL语句
Statement statm = conn.createStatement();
(4)返回ResultSet结果
#增删改
int rs = statm.executeUpdate(sql)
#查
ResultSet rs = statm.executeQuery(sql);
(5)释放资源(先开后关)
rs.close();
statm.close();
conn.close();
五、JDBC对数据库的增删改查
4.1 增加数据(Insert)
public class InsertTest {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");//3.创建Statement对象,处理sql语句Statement statm = conn.createStatement();String sql = "insert into class(classid,classname) values(5,'软件2101班')";int rs = statm.executeUpdate(sql);//测试if(rs>0) {System.out.println("插入成功!");}else {System.out.println("插入失败!");}//4.关闭资源statm.close();conn.close();}}
4.2 删除数据(Delete)
public class DeleteTest {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");//3.创建Statement对象,处理sql语句Statement statm = conn.createStatement();String sql = "delete from class where classid=4";int rs = statm.executeUpdate(sql);//测试if(rs>0) {System.out.println("删除成功!");}else {System.out.println("删除失败!");}//4.关闭资源statm.close();conn.close();}
}
4.3 修改数据(Update)
public class UpdateTest {public static void main(String[] args) throws ClassNotFoundException, SQLException {Scanner input = new Scanner(System.in);//1.加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");//3.创建Statement对象,执行sql语句Statement statm = conn.createStatement();System.out.println("请输入班级名称:");String classname = input.nextLine();System.out.println("请输入班级编号:");String classid = input.nextLine();String sql = "Update class set classname ='"+classname+"'"+"where classid="+classid;int ret = statm.executeUpdate(sql);//判断if(ret>0) {System.out.println("修改成功!");}else {System.out.println("修改失败!");}//4.释放资源statm.close();conn.close();}
}
4.5 查找数据(Select)
public class SelectTest {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建数据库连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk","账号","密码");//3.创建Statement对象,执行sql语句Statement statm = conn.createStatement();String sql = "select * from class";ResultSet ret = statm.executeQuery(sql);//判断while(ret.next()) {int classid = ret.getInt("classid");String classname = ret.getString("classname");System.out.println(classid+classname);}//4.释放资源ret.close();statm.close();conn.close();}
}
代码优化:
将冗余代码封装进一个工具类,每次使用直接调用即可。
public class DAOUtil {//加载驱动static {try {Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) {e.printStackTrace();}}//获取连接对象public static Connection getConnection() {Connection conn = null;//2.获取连接try {String url = "jdbc:mysql://localhost:3306/库名?serverTimezone=GMT&useSSL=false&characterEncoding=gbk";String user="账号";String pwd = "密码";conn = DriverManager.getConnection(url,user,pwd);} catch (SQLException e) {e.printStackTrace();}return conn;}//释放资源public static void closeResourse(Connection conn,PreparedStatement prestatm,ResultSet rs) {if(rs !=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(prestatm !=null) {try {prestatm.close();} catch (SQLException e) {e.printStackTrace();}}if(conn !=null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}} }
}
六、防止sql注入
1.什么是sql注入?
SQL注入(SQL Injection)是一种网络安全漏洞,允许攻击者在应用程序没有正确验证或清理用户输入数据的情况下,导致攻击者能够操纵数据库查询、获取、修改和删除敏感信息。
2.什么方法可以解决sql注入?
(1)使用预编译语句(prepared Statements):如使用?占位符,并通过编程语言的库绑定参数。
(2)使用存储过程(Stored Procedures):将SQL代码预先存储在数据库中,并通过参数调用
(3)验证和清理用户输入:确保用户输入不包含恶意字符或SQL关键字
(4)使用ORM工具:许多ORM工具会自动处理SQL构建,减少注入风险。