18.jdbc技术

来源:互联网 发布:淘宝网改地址怎么改 编辑:程序博客网 时间:2024/06/13 05:58

JDBC: Java DataBase Connectivity   Java数据库连接技术
主要功能:
–1.创建与数据库的连接
–2.执行SQL语句
–3.获得SQL语句的执行结果
1.Java连接数据库的步骤
★1.加载JDBC驱动
使用Class.forName()方法将给定的JDBC驱动类加载到Java虚拟机中(注意:如果系统中没有指定的类,会引发异常ClassNotFoundException。)
语法:Class.forName("JDBC驱动类的名称");
   //加载MySql驱动
Class.forName("com.mysql.jdbc.Driver");


   //加载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver");


★2.通过DriverManager获得连接
DriverManager类是JDBC的管理层,作用于用户和驱动之间。DriverManager可以跟踪可用的驱动程序,并在数据库相应的驱动程序之间建立连接。当调用getConnection()方法时,DriverManager类首先从已经加载的驱动程序中找到可以接受该数据库URL的驱动程序,然后请求相应的驱动程序来使用URL,用户名,密码连接到数据库,于是建立了与数据库的链接,可以返回Connection对象。
语法:Connection conn = DriverManager.getConnection(String URL,String user,String password);
统一资源定位符   用户名 密码


eg:
   //MySql
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","myadmin");


  //Oracle
Connection conn = DriverManager.getConnection("jdbc:oracl:thin:@127.0.0.1:1521:orcl","scott","tiger");


★3.发送SQL语句,并得到返回结果
一旦建立连接,就可以使用该链接创建Statement接口的对象,该对象可以将SQL语句传递给他连接的数据库。如果执行的是查询操作会返回ResultSet结果集对象,该对象中包含了执行该SQL语句得到的查询结果。如果是其他的操作(增,删,改....)返回的是整形数据(影响的记录条数)或者布尔值


语法:
//查询操作(返回ResultSet对象)
Statement stmt= conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from user");


//删除操作(没有结果集,只返回一个int类型数据)
Statement stmt= conn.createStatement();
int i = stmt.executeUpdate("delete from user where age = 17");
System.out.println("删除记录"+i+"条");


注意:Statement接口中常用方法
executeQuery()//执行select
executeUpdate()//执行delete update insert
execute()//所有语句




★4.处理返回结果
主要针对查询操作的结果集,执行SQL语句是查询语句执行结果将返回一个ResultSet对象,该对象保存了SQL语句执行后返回的结果。程序可以通过该ResultSet对象取出查询的所有结果。
ResultSet常用方法
1.next()、previous()、first()、last().....他们都是用来移动记录指针的方法


2.getXxx()方法 获取记录指针指向行的特定列的值。注意.该方法取出值可以用索引,也可以用列名作为参数。


案例  查询emp 表信息
public class Jdbc_Emp {
public void selectEmp(){
try {
//1加载驱动(反射)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2获得oracle链接
Connection conn=DriverManager.getConnection(
"jdbc:oracl:thin:@127.0.0.1:1521:orcl", "scott", "tiger");
//3执行sql语句
String sql="select * from emp";
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql);
//4处理结果
while(rs.next()){
int empno=rs.getInt(1); //rs.getInt("empno")
String ename=rs.getString("ename");
String job=rs.getString(3);
System.out.println("编号:"+empno+"\t 姓名:"+ename+"\t 职位:"+job);
}
//3关闭链接
if(conn!=null){
conn.close();
}
if(st!=null){
st.close();
}
if(rs!=null){
rs.close();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}


}


public static void main(String[] args) {
Jdbc_Emp jEmp=new Jdbc_Emp();
jEmp.selectEmp();
}


}


插入语句
/*表
用户id  userid  主键
用户账号  account
密码    psw
用户名   username
账户余额   money
*/
//数据插入
public void insert_usert(){
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//获得链接
Connection conn= DriverManager.getConnection(URL,UNAME,PSW);
//执行sql语句
String sql="insert into user_t(userid,account,psw,username,money) "
+ "values (3,'qwe','123','wangwu',500)";
Statement statement= conn.createStatement();
statement.executeUpdate(sql);
//关闭链接
if(conn!=null){
conn.close();
}
if(statement!=null){
statement.close();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}
//更新数据
public void update_usert(){
try {
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//获得链接
Connection conn= DriverManager.getConnection(URL,UNAME,PSW);
//执行sql语句
String sql="update user_t set money=1000 where userid=3";
Statement statement= conn.createStatement();
statement.executeUpdate(sql);
//关闭链接
if(conn!=null){
conn.close();
}
if(statement!=null){
statement.close();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}


使用Statement对象执行sql语句容易造成sql注入
为了防止sql注入我们使用预编译对象PreparedStatement
使用PreparedStatement对象的setXXX方法来向sql语句中传递参数
//登录
public  void  login(String account,String psw){
try {
//1加载驱动(反射)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2获得oracle链接
Connection conn=DriverManager.getConnection(
URL, UNAME, PSW);
//3执行sql语句 
String sql="select *  from  user_t where  account=? and psw=?";
PreparedStatement pStatement=conn.prepareStatement(sql);
pStatement.setString(1, account);
pStatement.setString(2, psw);
ResultSet rs=pStatement.executeQuery();
//4处理结果
if(rs.next()){
String username=rs.getString("username");
System.out.println(username);
}
//5关闭链接
if(conn!=null){
conn.close();
}
if(pStatement!=null){
pStatement.close();
}
if(rs!=null){
rs.close();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
为了简化开发我们可以创建一个工具类
public class DbOperation {
private final String URL="jdbc:oracl:thin:@127.0.0.1:1521:orcl";
private final String UNAME="scott";
private final String PSW="tiger";
protected Connection conn=null;
protected PreparedStatement ps=null;
protected ResultSet rs=null;
public  void  getConn(){
try {
//1加载驱动(反射)
Class.forName("oracle.jdbc.driver.OracleDriver");
//2获得oracle链接
conn=DriverManager.getConnection(URL, UNAME, PSW);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}

public void extUpdate(String sql,Object... obj){
try {
ps=conn.prepareStatement(sql);
for(int i=0;i<obj.length;i++){
ps.setObject(i+1, obj[i]);
}
ps.executeUpdate();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}

public void extQuery(String sql,Object... obj){
try {
ps=conn.prepareStatement(sql);
for(int i=0;i<obj.length;i++){
ps.setObject(i+1, obj[i]);
}
rs=ps.executeQuery();
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}

}


public void closeAll(){
try {
if(conn!=null){
conn.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
rs.close();
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}


事务处理
事务的基本概念:
事务指的是数据库工作的一个基本单元,他由一条或多条SQL语句组成。对于数据库而言,事务是不可分割的基本单元,一个事务中的SQL语句要么全部执行,要么全部都不执行。


事务是用来保证数据的一致性。(例如:银行转账,火车票购买,网上支付....)
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获得连接
conn = DriverManager.getConnection("jdbc:oracl:thin:@127.0.0.1:1521:orcl","scott","tiger");
//设置事务不要自动提交
conn.setAutoCommit(false);
//手动提交事务
conn.commit();
//事物回滚
conn.rollback();
转账操作    小明 转给 李磊 500元钱
检查是否有小明和李磊
检查小明账户上是否有足够余额
小明  账户-500元
李磊  账户+500元


public  void zhuanzhang(){
//获取链接
getConn();
//处理数据
try {
//设置事务不要自动提交
conn.setAutoCommit(false);
String sql="update user_t set money=? where username=?";
extUpdate(sql,250,"zhangsan");//张三账户扣了50
int i=1/0;//抛出异常 (模拟停电)
String sql2="update user_t set money=650 where username='lisi'";
extUpdate(sql2);//李四账户增加了50
//提交事物
conn.commit();
} catch (Exception e) {
// TODO 自动生成的 catch 块
try {
//事物回滚
conn.rollback();
} catch (SQLException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}

e.printStackTrace();
}
//关闭链接
closeAll();
}
原创粉丝点击