1.什么是JDBC?
JDBC: Java Database Connectivity java数据库连接,即使用java代码发送sql语句的技术,为多种关系型数据库提供统一访问。
2.JDBC连接数据库
加载驱动 创建连接 执行sql并返回执行结果 处理结果 关闭资源
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.创建连接
Connection conn = DriverManager.getConnection(url, user, password);
//3.执行sql语句并返回执行结果
//准备sql
String sql = "SELECT * FROM student";
//创建Statement,用PreparedStatement更好
//PreparedStatement stmt = conn.prepareStatement(sql);
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//4.处理结果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String gender = rs.getString("gender");
System.out.println(id+","+name+","+gender);
}
//5.关闭资源
stmt.close();
conn.close();
2.1接口
1.Connection接口
- Connection接口代表着与数据库的链接
connection接口的常用方法
返回类型 | 方法 | 功能描述 |
---|---|---|
Statement | createStatment() | 创建一个Statment对象 |
Statement | createStatment(int resultSetType,int resultSetConcurrency) | 创建一个statment对象,该对象将生成具有给定类型并发性,和可保存的ResultSet对象 |
PrepareStatement | prepareStatement() | 创建预处理对象prepardStatement |
CallableStatement | prepareCall(String sql) | 创建一个CallableStatment对象来调用数据库存储过程 |
boolean | isReadOnly() | 查看当前Collection对象是否为只读 |
boolean | setReadOnly() | 设置当前对象的默认读写模式 |
2.Statment接口
statment接口
返回类型 | 方法 | 功能描述 |
---|---|---|
boolean | execute(String sql) | 执行静态sql语句,该语句可能返回多个结果集,(改方法看似鸡肋,其实也很鸡肋,如果该语句可以返回一个ResultSet结果集,则为true,反之false,当然,当sql语句庞大的时候,可以用这个方法来检测是否能够执行从而节省资源) |
ResultSet | executeQuery(String sql) | 执行给定的sql语句,该语句返回单个ResultSet对象 |
void | clearBatch() | 清空这个Statement对象的sql命令列表 |
int[] | executeButch() | 将一批sql命令交给数据库类执行,如果全部成功,则返回更新计数组成的数组,数组元素的排序和sql添加的顺序相同 |
3.PreparedStatment接口,继承自Statment接口,因为PreparedStatment是安全的,Statment接口是不安全的
PrepareStatment接口的常用方法
方法参数 | 方法 | 功能描述 |
---|---|---|
void | setXXX(int index,[指定给的类型] k) | 将制定位置的参数设置成XXX值 |
ResultSet | executeQuery() | 执行Sql查询,并返回对应的ResultSet结果集 |
void | setNull(int index ,int sqlType) | 设置指定的位置为SQL NUll值 |
int | executeUpdate() | 执行前面包含的参数的动态 [INSERT |
void | clearParameters() | 清楚当前所有参数值 |
4.CallableStatement接口
CallableStatemnt接口继承并且扩展了PrepareStatemnt接口,用来执行对数据库的存储过程操作;
方法 | 功能描述 |
---|---|
set+数据类型 | 将指定参数设置为java中指定的数据类型值 |
get+数据类型 | 以java中指定类型值的形式获取指定的JDBC中相应参数的类型值 |
3.ResultSet结果集
所有静态字段
int | CLOSE_CURSORS_AT_COMMIT | 该常量指示提交当前事务时,具有此可保存性的打开的 ResultSet 对象将被关闭 |
---|---|---|
int | CONCUR_READ_ONLY | 该常量指示不可以更新的 ResultSet 对象的并发模式 |
int | CONCUR_UPDATABLE | 该常量指示可以更新的 ResultSet 对象的并发模式 |
int | FETCH_FORWARD | 该常量指示将按正向(即从第一个到最后一个)处理结果集中的行。 |
int | FETCH_REVERSE | 该常量指示将按逆向(即从最后一个到第一个)处理结果集中的行处理。 |
int | FETCH_UNKNOWN | 该常量指示结果集中的行的处理顺序未知。 |
int | FETCH_UNKNOWN | 该常量指示提交当前事务时,具有此可保存性的打开的 ResultSet 对象将保持开放 |
int | TYPE_FORWARD_ONLY | 该常量指示光标只能向前移动的 ResultSet 对象的类型。 |
int | TYPE_SCROLL_INSENSITIVE | 该常量指示可滚动,再固定条件下可以修改表内容; |
int | TYPE_SCROLL_SENSITIVE | 该常量指示可滚动并且,不可修改表内容; |
常用方法
返回类型 | 方法 | 功能描述 |
---|---|---|
boolean | next() | 将光标从当前位置向下移动一行,也就是读取下一行 |
boolean | previous() | 将光标从当前位置向上移动一行,也就是读取上一行 |
void | close() | 关闭ResultSet对象 |
int | getInt(int) | 以int的形式获取结果集,以当前行指定序号的值,以列的编号或者列的名字 |
int | getInt(String) | 以下跟以上一样以此类推 |
float | getFloat(int) | |
float | getFloat(String) | |
String | getString(int) | |
String | getString(String) | |
int | getRow() | 得到光标当前所指定的行号 |
boolean | absolute(int row) | 光标移动到row指定的行 |
boolean | relative(int rows) | 光标移动到相对于当前行的指定行,上下使用+和-表示 |
4.JDBC增删改查
增操作(create):
Statement st = conn.createStatement();
String sql = "insert into user(….) values(…..) ";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println("插入成功!!!");
}
更新操作(update):
Statement st = conn.createStatement();
String sql = “update user set name= ' ' where name= ' ' ";
int num = st.executeUpdate(sql);
if(num>0){
System.out.println(“修改成功!!!");
}
删除操作(delete):
Statement st = conn.createStatement();
String sql = “delete from user where id=1”;
int num = st.executeUpdate(sql);
if(num>0){
System.out.println(“删除成功!!!");
}
查操作(read):
Statement st = conn.createStatement();
String sql = “select * from user where id=1;
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
//根据获取列的数据类型,分别调用rs的相应方法映射到java对象中
}
5.PreparedStatement与Statement
PreparedStatement的优点
1)PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
2)PreparedStatement可以使用sql缓存区,效率比Statment高
3)PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。
preparedStatement与Statement区别
PreperedStatement是Statement的子类 ;
它的实例对象可以通过调用Connection.preparedStatement()方法获得,相对于Statement对象 而言:PreperedStatement可以避免SQL注入的问题
Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。PreparedStatement可对 SQL进行预编译,从而提高数据库的执行效率
PreperedStatement对于sql中的参数, 允许使用占位符的形式进行替换;
PreparedStatement 的占位符使用代码实例:
public static void main(String[] args) {
int _id=1;
String _name="张三";
String _gender="男";
Connection con=null;
PreparedStatement ps=null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//使用驱动创建连接
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql","root","123456");
//定义sql语句
String sql="insert into hehe values(?,?,?)";
//创建执行命令对象
ps= con.prepareStatement(sql);
//设置参数
ps.setInt(1, 1);
ps.setString(2,_name);
ps.setString(3, _gender);
//执行命令并接受结果
int result=ps.executeUpdate();
System.out.println(result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(null!=ps)
ps.close();
if(null!=con)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}