JDBC的入门与进阶理解

J什么是JDBCJava Database Connectivity java数据库连接SUN公司提供的访问数据库规则、规范,由于数据库种类较多

J什么是JDBC

Java Database Connectivity java数据库连接

  • SUN公司提供的访问数据库规则、规范,由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其他的数据库去实现底层的访问规则。我们的java程序只要使用sun公司提供的jdbc驱动即可。

JDBC连接数据库

package com.itheima.test;
​
import java.sql.*;
​
public class MainTest {
 public static void main (String[] args) throws ClassNotFoundException {
 Connection conn=null;
 Statement st=null;
 ResultSet rs=null;
 try {
 //1.注册驱动
 //静态代码块----》类加载了就会执行:java.sql.DriverManager.registerDriver(new Driver());
 //因此以下代码,相当于注册了两次
 //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
 Class.forName("com.mysql.jdbc.Driver");//修改
 //2.建立连接 参数一:协议+访问的数据库,参数二:用户名,参数三:密码
 Connection conn= DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "root");
 //3.创建statement,跟数据库打交道,一定需要这个对象
 Statement st = conn.createStatement();
 //4.执行查询,得到结果集
 String sql="select * from mystudent";
 ResultSet rs=st.executeQuery(sql);
 //遍历每一条记录
 while(rs.next()) {
 int id=rs.getInt("id");
 String name=rs.getString("name");
 int age=rs.getInt("age");
 System.out.println("id="+id+"==name="+name+"==age="+age);
 
 }
 rs.close();
 st.close();
 conn.close();
 
 }catch(SQLException e) {
 e.printStackTrace();
 }
 
}
}

释放资源改进:

另外建一个类,专门进行释放工作:

public class JDBCutil {
 public static void release(Connection conn,Statement st,ResultSet rs) {
 closeRs(rs);
 closeSt(st);
 closeConn(conn);
 
 }
 
 private static void closeRs(ResultSet rs) {
 try {
 if(rs!=null)
 rs.close();
 }catch(SQLException e) {
 e.printStackTrace();
 
 }finally {
 rs=null;
 }
 }
 
 private static void closeSt(Statement st ) {
 try {
 if(st!=null)
 st.close();
 }catch(SQLException e) {
 e.printStackTrace();
 
 }finally {
 st=null;
 }
 }
 
 private static void closeConn(Connection conn) {
 try {
 if(conn!=null)
 conn.close();
 }catch(SQLException e) {
 e.printStackTrace();
 
 }finally {
 conn=null;
 }
 }
}

使用JDBC使用步骤

  1. 注册驱动
  2. 建立连接
  3. 创建statement
  4. 执行sql,得到ResultSet
  5. 遍历结果集
  6. 释放资源

JDBC工具类构件

  1. 资源释放工作的整合
  2. 驱动防二次注册
//静态代码块----》类加载了就会执行:java.sql.DriverManager.registerDriver(new Driver());
 //因此以下代码,相当于注册了两次驱动
 //DriverManager.registerDriver(new com.mysql.jdbc.Driver());
 Class.forName("com.mysql.jdbc.Driver");//修改

3.使用properties配置文件

一般情况下,我们不会在java类文件中写

 static String url=jdbc:mysql://localhost/student
 static String name=root
 static String password=root

而是将它们单独写在资源文件中然后在使用时读取文件,这样我们只需要更改资源文件信息即可,不需要找到源java文件

//jdbc.properties
 driverClass=com.mysql.jdbc.Driver
 url=jdbc:mysql://localhost/student
 name=root
 password=root
 //JDBCutil.java
 static String driverClass=null; 
 static String url=null;
 static String name=null;
 static String password=null;
 static {
 try {
 //读文件
 //1.创建一个属性配置对象
 Properties properties=new Properties();
 //InputStream is=new FileInputStream("jdbc.properties");
 //使用类加载器读取SRC底下的资源文件,后面在servlet 对应文件位于src目录下
 InputStream is =JDBCutil.class.getClassLoader().getSystemResourceAsStream("jdbc.properties");
 //导入输入流
 properties.load(is);
 //读取属性
 driverClass = properties.getProperty("driverClass");
 url= properties.getProperty("url");
 name = properties.getProperty("name");
 password = properties.getProperty("password");
 
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }

步骤

  1. 在src底下声明一个文件xxx.properties
  2. 在工具类里面,使用静态代码块,读取属性

使用单元测试代码:

步骤

  1. 定义一个类,textxxx,里面定义方法
  2. 添加junit 支持:右键工程》add Library》Junit》选择版本
  3. 在方法上加上注解@Test,其实就是一个标记
@Test
public void testQuery(){
 ...
}
  1. 将光标点在需要测试的方法名上,然后右键Run
  2. 如果光条是绿色,表示代码运行没有错误

意义

对于不想讲测试内容写在main函数里,可以新建一个方法,讲测试代码放入执行。

即可以测试任何方法的正确性

:如果方法较多,我们可以批量Run,在outline窗口进行操作即可

java对数据库的增删改查

查询:Query

public void textQuery() {
 Connection conn=null;
 Statement st=null;
 ResultSet rs=null;
 try {
 //查询
 //1.获取连接对象
 conn = JDBCUtil.getConn();
 //2.根据连接对象,得到statement
 st = conn.createStatement();
 //3.执行sql语句,返回resultset
 String sql = "select * from mystudent";
 rs=st.executeQuery(sql);
 
 //4.遍历结果集
 while(rs.next()) {
 String sname=rs.getString("sname");;
 String sex=rs.getString("sex");;
 String specialty=rs.getString("specialty");
 String grade=rs.getString("grade");;
 System.out.println(sname+" "+sex+" "+specialty+" "+grade);
 }
 } catch (Exception e) {
 // TODO: handle exception
 e.printStackTrace();
 }finally {
​
 JDBCUtil.release(conn, st, rs);
 }
 }

增添:insert

public void textInsert() {
 Connection conn=null;
 Statement st=null;
 //ResultSet rs=null;
 try {
 //查询
 //1.获取连接对象
 conn = JDBCUtil.getConn();
 //2.根据连接对象,得到statement
 st = conn.createStatement();
 //3.执行添加
 String sql = "insert into mystudent values(6,'王明','男','计算机','大一')";
 //影响的行数,如果大于0表名操作成功,否则则失败
 int result=st.executeUpdate(sql);
 if(result>0) {
 System.out.println("添加成功");
 }else {
 System.out.println("添加失败");
 }
​
 } catch (Exception e) {
 // TODO: handle exception
 e.printStackTrace();
 }finally {
​
 JDBCUtil.release(conn, st);
 }
 }
​

删除:delete

 String sql = "delete from mystudent where id=6";
 //影响的行数,如果大于0表名操作成功,否则则失败
 int result=st.executeUpdate(sql);
 if(result>0) {
 System.out.println("删除成功");
 }else {
 System.out.println("删除失败");
 }

更新:update

String sql = "update mystudent set grade='大二' where id=1";
 //影响的行数,如果大于0表名操作成功,否则则失败
 int result=st.executeUpdate(sql);
 if(result>0) {
 System.out.println("更新成功");
 }else {
 System.out.println("更新失败");
 }
​

JDBC Dao模式

  1. 新建一个dao的接口,里面声明数据库访问规则
  2. 新建一个dao的实现类,具体实现早前定义的规则
  3. 直接使用实现
package dao;
/**
 * 定义操作数据库的方法
 * */
public interface UserDao {
 /**
 * 查询所有
 * */
 void Query();//findAll;
 
}
-----------------------------------------------
package dao.impl;
​
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
​
import org.junit.jupiter.api.Test;
​
import dao.UserDao;
import util.JDBCUtil;
​
public class UserDaoImpl implements UserDao{
​
 @Override
 @Test
 public void Query() {
 Connection conn=null;
 Statement st=null;
 ResultSet rs=null;
 try {
 //1.获取连接对象
 conn = JDBCUtil.getConn();
 //2.创建Statement对象
 st = conn.createStatement();
 //3.
 String sql = "select * from myuser";
 rs = st.executeQuery(sql);
 while(rs.next()) {
 int id=rs.getInt("id");
 String username=rs.getString("username");
 String password=rs.getString("password");
 System.out.println("id="+id+" username="+username+" password="+password);
 }
 
 } catch (Exception e) {
 e.printStackTrace();
 }finally {
​
 JDBCUtil.release(conn, st, rs);
 }
 }
​
}
--------------------------------------------------------------------------------
 package test;
​
import org.junit.Test;
​
import dao.UserDao;
import dao.impl.UserDaoImpl;
​
public class TestUserDaoImpl {
 @Test
 public void TestQuery() {
 UserDao dao=new UserDaoImpl();//接口引用对象
 dao.Query();
 }
}

statement安全问题

statement的执行,其实是拼接sql语句,然后再一起执行。

//前面先拼接sql语句,如果变量里面带有了数据库的关键字,那么一并认为是关键字,不认为是普通的字符串
String sql = "select * from myuser where username='"+username+"' and password='"+password+"'";
			rs = st.executeQuery(sql);
			if(rs.next()) {
				System.out.println("登录成功");
			}else {
				System.out.println("登录失败");
			}
public void TestLogin() {
		UserDao dao=new UserDaoImpl();
		dao.login("admin", "10086'or'1=1");
//		SELECT * FROM myuser WHERE username="admin" AND PASSWORD="10088" OR 1=1;
	}

PrepareStatement

该对象就是替换前面的statement对象(预先对sql语句执行语法校验)

String sql="select * from myuser where username=? and password=?";
//?对应的内容,后面不管传递什么进来,都把它看成是字符串
			 PreparedStatement ps = conn.prepareStatement(sql);
			 //?对应的索引从1开始
			 ps.setString(1, username);
			 ps.setString(2, password);
			 
			 rs=ps.executeQuery();
			 if(rs.next()) {
				 System.out.println("登录成功");
			 }else {
				 System.out.println("登录失败");
			 }

statement 给preparedstatement参数不报错因为preparedstatement是statement 的子类(体现了多态性)


总结

  1. JDBC入门
  2. 抽取工具类
  3. statement CRUD
  4. Dao模式

声明与实现分开

  1. PreparedStatement CRUD

预处理sql语句,解决上面statement出现的问题

  1. dao里面声明crud,以及登录方法

登录方法:成功后返回该用户的所有信息

查询:如果是findAll返回一个集合

增加&删除&更新

返回影响的行数即可 int类型

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/5341.html

(0)
上一篇 2022-12-13 21:21
下一篇 2022-12-13 21:21

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信