用于执行SQL语句的Java API,可为多种关系数据库提供统一访问。
它由一组用Java语言编写的类和接口组成,是Java访问数据库的标准规范。
JDBC需连接驱动。
- 驱动:两个设备要进行通信时需满足的一定的通信数据格式。
- 数据格式由设备供应商规定
- 设备供应商提供驱动软件,通过软件可以与该设备进行通信。
- JDBC是接口
- 驱动是接口的实现
1.JDBC开发步骤
1.1导入驱动jar包
创建lib目录,用于存放当前项目需要的所有jar包。
选择jar包,右键执行build path/Add to Build Path
1.2注册驱动
Class.forName("com.mysql.jdbc.Driver");
- java.sql.Driver:JDBC规范定义驱动接口;
- com.mysql.jdbc.Driver:MySQL包提供的实现类;
- Class.forName():加载一个使用空字符串描述的驱动类
- static Class<?> forName(String classname):返回与带有给定字符串名的类或接口相关联的Class对象。
- Driver类主动将自己注册。
1.3获得连接
Connection cn=DriverManager.getConnection("jdbc:mysql"//localhost:3306/mydb","root","root");
1.3.1DriverManager
在调用 getConnection
方法时,DriverManager
会试着从初始化时加载的那些驱动程序以及使用与当前 applet 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。
DriverManager.getConnection(String url,String username,String pw):试图建立到给定数据库 URL 的连接。
三个参数:
- 需要连接数据库的位置
- 用户名
- 密码
JDBC规定url格式:
- jdbc固定
- 数据路名称(mysql)
- 数据库厂商规定
- 数据库IP地址:localhost
- 端口号:3366
- DATABASE名称:mydb
1.4获得语句执行平台
String sql="某sql语句";
Statement stmt=con.createStatement();
获得Statement语句执行平台。
1.4.1Statement
用于执行静态 SQL 语句并返回它所生成结果的对象。
在默认情况下,同一时间每个 Statement对象在只能打开一个 ResultSet对象。
因此,如果读取一个 ResultSet对象与读取另一个交叉,则这两个对象必须是由不同的 Statement对象生成的。
如果存在某个语句的打开的当前ResultSet对象,则 Statement接口中的所有执行方法都会隐式关闭它。
常用方法:
int executeUpdate(String sql):执行insert、update、delete语句
ResultSet executeQuery(String sql):执行select语句
boolean execute(sql):执行select返回true,执行其他语句,返回false
1.5处理结果集
ResultSet是一个二维表格。
boolean next():执行下一条记录。
getXXX(int col):列从1开始。
- 获得对象:Object getObject(int index)、Object getObject(String name)
- 获得字符串:String getString(index)、Object getObject(String name)
- 获得整型:int getInt(index)、Object getObject(String name)
- 获得双精度浮点型:double getDouble(int index)、Object getObject(String name)
1.6释放资源
关闭的顺序:先得到的后关闭
rs.close();
stmet.close();
con.close();
2.SQL注入
输入的口令为:
则进入系统会,判断语句会为:password='xxx'OR'a'='a',通过验证。
用PreparedStatement解决
3.PreparedStatement
建议每条SQL语句的所有实际参数都用逗号分隔。
String sql="insert into user(id,name) values (?,?)";
PreparedStatement psmt=conn.preparedStatement(sql);
preparedStatement(String sql):创建一个preparedStatement对象来将参数化的 SQL 语句发送到数据库。
带有 IN 参数或不带有 IN 参数的 SQL 语句都可以被预编译并存储在preparedStatement对象中。然后可以有效地使用此对象来多次执行该语句。
sql
- 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句
3.1常用方法
int executeUpdate()
ResultSet executeQuery()
boolean execute()
3.2设置实际参数
void setXXX(int index, XXX xx)
将指定参数设置为给定的Java值。
将此值发给数据库时,驱动程序将它转换为一个SQL xxx类型值。
setString(2,"张三");
把SQL语句中的第2个占位符'?'替换为“张三“。
3.3预处理对象executeUpdate方法
3.3.1 操作格式
- 注册驱动
- 获取连接
- 获取预处理对象
- SQL语句占位符设置实际参数
- 执行SQL语句
- 释放资源
3.3.2 insert
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
String sql="insert into user(name) values (?)";
PreparedStatement pstmt=conn.preparedStatement(sql);
stmt.setString(1,"李四");
int line=stmt.executeUpdate();
System.out.println("新添加的行数:"+line);
stmt.close();
conn.close();
3.3.3update
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
String sql="update user set name=? where id=?";
PreparedStatement pstmt=conn.preparedStatement(sql);
stmt.setString(1,"李四");
stmt.setString(2,1);
stmt.close();
conn.close();
3.3.4delete
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
String sql="delete from user where id=?";
PreparedStatement pstmt=conn.preparedStatement(sql);
stmt.setString(1,1);
stmt.close();
conn.close();
3.4预处理对象executeQuery方法
3.4.1 操作格式
- 注册驱动
- 获取连接
- 获取预处理对象
- SQL语句占位符设置实际参数
- 执行SQL语句
- 处理结果集(遍历结果集合)
- 释放资源
3.4.2 select
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
String sql="select * from user";
PreparedStatement pstmt=conn.preparedStatement(sql);
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
String id=rs.getInt("id");
String name=rs.getString("name);
System.out.println(id+"---"+name);}
rs.close();
stmt.close();
conn.close();
4. JDBC工具类
可将“获得数据库连接”操作封装为工具类JDBCUtils
提供获取连接对象的方法,从而达到代码复用
提供方法:public static Connection getConn();
public class JDBCUtils{
public static final String DRIVERNAME="com.mysql.jdbc.Driver";
public static final String URL="JDBC:MYSQL://LOCALHOST:3306/mydb";
public static final String USER="root";
public static final String PAEEWORD="root";
static{
try{
Class.forName(DRIVERNAME);
}catch(ClassNotFoundException e){
System.out.println("数据库驱动注册失败!");
}
}
public static Connection getConn() throws Exception{
Connection conn=DriverManager.getConnection(URL,USER,PAEEWORD);
return conn;
}
}
5.Properties配置文件
获得的连接的4个参数(驱动、URL、用户名、密码)通常在配置文件中保存,方便后期维护。
层序如果需要更换数据库,只需要改配置文件即可。
习惯使用Properties文件,要求如下;
- 文件位置:任意,建议src下
- 文件名称:任意,扩展名为.properties
- 文件内容:一行一组数据,格式为"key=value"
- key命名自定义,多个单词用点分隔,jdbc.driver
- value不支持中文,如果非要用非中文,需unicode转换
文件名db.properties
driver=com.mysql.jdbc.Driver;
url=jdbc:mysql://localhost:3306/mydb;
user=root;
password=root
JDBCUtils更改为:
public class JDBCUtils{
public static String driver;
public static String url;
public static String user;
public static String password;
static{
try{
Properties props=new Properties();
Reader is=new FileReader("db.properties");
props.load(is);
driver=props.getProperties("deriver");
url=props.getProperties("url");
user=props.getProperties("user");
password=props.getProperties("pwssword");
}catch(ClassNotFoundException e){
throw new RuntimeException(e);
}
}
public static Connection getConn() throws Exception{
try{
Class.forName(driver);
Connection conn=DriverManager.getConnection(url,user,password);
return conn;
}catch(Exception e){
throw new RuntimeException(e);
}
}
}