JDBC
一、jdbc基础
JDBC (Java Database Connectivity) 是用于执行SQL语句的Java应用程序接口,由一组用Java语言编写的类和接口组成。
JDBC 是一种规范,各数据库厂商为Java程序员提供标准的数据库访问类和接口,使得独立于DBMS的Java应用程序的开发工具和产品成为可能。
所需接口与类都在java.sql中,常用接口与类如下:
Driver (interface)
DriverManager (class)
Connection (interface)
Statement (interface)
PreparedStatement (interface)
CallableStatement (interface)
ResultSet (interface)
DatabaseMetaData (interface)
ResultSetMetaData (interface)
Types (class)
二、MySql连接
下载jar包(mysql-connector-java),下载地址:http://www.cr173.com/soft/45333.html,导入jar包。
package day0912;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
public class MySql {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
//jdbc连接数据库参数 账号 密码 ip 端口 数据库名
String url = "jdbc:mysql://localhost:3306/test";
//驱动类,告诉jdbc使用哪个数据库
String driverClass="com.mysql.jdbc.Driver";
//账号密码
String user = "root";
String password = "zyp";
//需要jvm加载该类(反射)
try {
Class.forName(driverClass);
//connection 用于和数据库连接的类
//DriverManager 驱动管理类,通过获取不同数据库的驱动类,实现不同的登录方式
Connection conn=DriverManager.getConnection(url, user, password);
//如果打印出地址则登录成功,异常则失败
System.out.println(conn);
//statement 用来执行静态sql语句
Statement state = conn.createStatement();
//ResultSet 用来游标遍历数据行 next()
ResultSet rs =state.executeQuery("select * from emp");
while(rs.next()){
int empno = rs.getInt(1);//根据下标获取值,下标从1开始
String ename = rs.getString("ename");//根据列名获取值
String job = rs.getString("job");
int mgr = rs.getInt(4);
//mysql datestamp对应java.sql.Timestamp
Timestamp hiredate = rs.getTimestamp(5);//取时间
int sal = rs.getInt(6);
int comm = rs.getInt(7);
int deptno = rs.getInt(8);
String empdesc = rs.getString("empdesc");
System.out.println(empno+" "+ename+" "+job+" "+mgr+" "+sdf.format(hiredate)+" "+sal+" "+comm+" "+deptno+" "+empdesc);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
三、Oracle连接
寻找jar包:在oracle的安装目录中就有(c:\app\Administrator\product\11.2.0\)一般用ojdbc6, 导入jar包。
package day0912;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
public class Oracle {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
//jdbc连接数据库参数 账号 密码 ip 端口 数据库名
String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
//驱动类,告诉jdbc使用哪个数据库
String driverClass="oracle.jdbc.OracleDriver";
//账号密码
String user = "scott";
String password = "tiger";
//需要jvm加载该类(反射)
try {
Class.forName(driverClass);
//connection 用于和数据库连接的类
//DriverManager 驱动管理类,通过获取不同数据库的驱动类,实现不同的登录方式
Connection conn=DriverManager.getConnection(url, user, password);
//如果打印出地址则登录成功,异常则失败
System.out.println(conn);
//statement 用来执行静态sql语句
Statement state = conn.createStatement();
//ResultSet 用来游标遍历数据行 next()
ResultSet rs =state.executeQuery("select * from emp");
while(rs.next()){
int empno = rs.getInt(1);//根据下标获取值,下标从1开始
String ename = rs.getString("ename");//根据列名获取值
String job = rs.getString("job");
int mgr = rs.getInt(4);
//oracle date
Date hiredate = rs.getDate(5);//取时间
int sal = rs.getInt(6);
int comm = rs.getInt(7);
int deptno = rs.getInt(8);
System.out.println(empno+" "+ename+" "+job+" "+mgr+" "+sdf.format(hiredate)+" "+sal+" "+comm+" "+deptno);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
四、整理和补充
jdbc参数:
url="jdbc:mysql://ip:端口/数据库名"(mysql)
url="jdbc:oracle:thin:@ip:端口:数据库名"(oracle)
dirverClass="com.mysql.jdbc.Driver"(mysql)
dirverClass="oracle.jdbc.OracleDriver"(oracle)
username=用户名
password=密码
sql注入:
由于sql语句是字符串拼接的,所以再传值时,有人会传入一个恒成立语句,使得sql语句的条件成立,这样就会暴露数据库中的信息
例:
原来sql语句:select * from emp where job=''
传值后sql语句:select * from emp where job='' or1=1 or 1=''
解决方法:使用PreparedStatement预编译传值
Statment与PreparedStatement:
Statement 每一次都会将sql语句传给数据库,如果要执行多次,会占用数据库资源,效率会下降,并且它还是不安全的,会被sql注入。
PreparedStatement 继承Statement,用来处理一个预编译的sql,防止sql注入,
可滚动游标:用来指定行抓取数据,分页,设置,最大抓取行数
事务:是一个运行的单元,该单元运行的程序,必须满足acid特性,jdbc中事务是自动提交的
设置手动提交:conn.setAutoCommit(true/false);true自动,false手动
提交方式:conn.commit()提交,conn.rollbacke()回滚
调用存储过程:
{call 存储过程名 (?...)}
调用函数:
{?=call 函数名 (?...)}
批处理:减少连接,提高效率
使用addBatch(),executeBatch()