java面向对象第八章
一、什么是JDBC?
java中连接数据库的一种技术
是java各种应用程序和数据库之间的桥梁
由一组使用java语言编写的类和接口组成
二、JDBC中常用的API?
DriverManager类:管理不同数据库的jdbc驱动
Connection接口:负责连接数据库并担任传递数据的任务
Statement接口:由Connection产生,负责执行sql语句
PreparedStatement是Statement的子接口
除了具备父接口Statement的能力外,还具有4高(安全性、性能、可读性、可维护性)功能
ResultSet接口:负责保存和处理Statement返回的查询结果
三、使用JDBC如何连接sqlserver数据库?
1、加载驱动
编码前的准备工作
1.将sqljdbc2008.jar文件复制粘贴到项目的文件夹中
2.将项目和jdbc驱动关联
编码,加载驱动
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);//处理异常try…catch
2、编写数据库连接字符串、设置登录名、密码
2.1 final String url = ”jdbc:sqlserver://localhost:1433;
databasename=存在的数据库名”;
2.2 final String name = ”sqlserver身份验证的登录名”;
2.3 final String pwd = ”登录名对应的密码”;
3、使用DriverManger类的getConnection()方法,
关联url、name、pwd,返回一个Connection接口
Connection conn=DriverManger.getConnection(url,name,pwd);
public class BaseDAO { private Connection con=null; private PreparedStatement pre=null; private ResultSet re=null; //驱动路径 private final String qd= "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //数据库连接字符串 private final String url = "jdbc:sqlserver://localhost:1433;" + "databasename=epet2"; private final String user = "sa";//登录名 private final String password = "sasa";//密码 //加载路径建立链接 public void openDB(){ try { Class.forName(qd); con=DriverManager.getConnection(url,user,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } JDBC
四、使用Statement接口对表的数据执行[增、删、改]操作
1、加载驱动连接数据库
2、 在try…catch外面,声明Statement变量并赋初值null
(或用PreparedStatement代替Statement)
3、 定义变量,保存sql语句(insert、delete、update语句)
使用PreparedStatement接口,sql语句中values()中的值,使用?
4、 DriverManager.getConnection()的下一行编写代码
Statement变量=Connection变量.createStatement();
PreparedStatement变量= Connection变量. prepareStatement(sql);
5、调用Statement变量的executeUpdate(sql)执行sql语句
int rows=executeUpdate(sql);//返回受影响的行数
为sql语句中的?赋值
PreparedStatement变量.set数据类型(数字,值);
调用PreparedStatement变量的executeUpdate()执行sql语句
int rows=executeUpdate();//返回受影响的行数
6、根据受影响的行数,判断sql语句执行是否成功
7、释放相关的资源
finally{
try{
if(Statement变量或PreparedStatement变量!=null)
Statement变量(或PreparedStatement变量).close();
if(Connection变量!=null)
Connection变量.close();
}catch(SQLException e){
e.printStackTrace();
}
}
public class BaseDAO { private Connection con=null; private PreparedStatement pre=null; private ResultSet re=null; //驱动路径 private final String qd= "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //数据库连接字符串 private final String url = "jdbc:sqlserver://localhost:1433;" + "databasename=epet2"; private final String user = "sa";//登录名 private final String password = "sasa";//密码 //加载路径建立链接 public void openDB(){ try { Class.forName(qd); con=DriverManager.getConnection(url,user,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //实现增删改功能 public int changData(String sql,ArrayList list){ openDB(); int r=0; try { pre = con.prepareStatement(sql); if(list!=null){//说明sql语句中有?参数 //使用循环,为sql语句中的?参数赋值 for(int i=0;i<list.size();i++){ pre.setObject(i+1, list.get(i)); } } r=pre.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally{ close();//2、关闭数据库,释放相关的资源 } return r; } //关闭数据,释放相关资源 public void close(){ try { if(re!=null){ re.close(); } if(pre!=null){ pre.close(); } if(con!=null){ con.close(); } }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //实现查询的方法 public ResultSet inquiry(String sql,ArrayList list){ openDB(); try { pre=con.prepareStatement(sql); if(list!=null){//说明sql语句中有?参数 //使用循环,为sql语句中的?参数赋值 for(int i=0;i<list.size();i++){ pre.setObject(i+1, list.get(i)); } } re=pre.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return re; } //检查是否含有正确id public int checkPetId(int id){ int r=0; String sql="select count(*) from pet where id=?"; ArrayList list=new ArrayList(); list.add(id); ResultSet re=inquiry(sql, list); try { while(re.next()){ r=re.getInt(1); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return r; } } BaseDao
五、使用JDBC查询表中的数据(ResultSet接口)
1、加载sql2008 jdbc驱动包
(自动添加try…catch,手动添加finally语句块
用于释放资源)
1、 在try…catch…finally语句块的外面,
a) 声明3个接口(Connection、Statement或PreparedStatement、ResultSet的变量且赋值null
b) 在finally块中,调用这3个接口的close()释放资源
2、 编写数据库连接字符串url
3、 使用DriverManager.getConnection(url,”登录名”,”登录密码”);
获取Connection接口的对象
4、 编写sql查询语句,保存到字符串的变量中
5、 获取发送并执行sql查询语句的接口对象
a) 父接口Statement对象
Connection接口变量.createStatement();
b) 子接口PreparedStatement对象
Connection接口变量. prepareStatement(sql);
8、 调用Statement或PreparedStatement接口的方法,
执行sql查询语句,返回ResultSet
a) 父接口Statement对象
ResultSet变量=Statement接口变量.executeQuery(sql);
b) 子接口PreparedStatement对象
ResultSet变量=Statement接口变量.executeQuery();
9、 使用while循环,调用ResultSet接口变量的
get数据类型(数字或列名)方法,来获取表中列的值
while(ResultSet接口变量.next()){
ResultSet接口变量.get数据类型(数字或列名);
get数据类型(数字);//数字从1开始
get数据类型(“列名”);
}
public class BaseDao { private Connection con=null; private PreparedStatement pre=null; private ResultSet re=null; //驱动路径 private final String qd= "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //数据库连接字符串 private final String url = "jdbc:sqlserver://localhost:1433;" + "databasename=epet2"; private final String user = "sa";//登录名 private final String password = "sasa";//密码 //加载路径建立链接 public void openDB(){ try { Class.forName(qd); con=DriverManager.getConnection(url,user,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //实现增删改功能 public int changData(String sql,ArrayList list){ openDB(); int r=0; try { pre = con.prepareStatement(sql); if(list!=null){//说明sql语句中有?参数 //使用循环,为sql语句中的?参数赋值 for(int i=0;i<list.size();i++){ pre.setObject(i+1, list.get(i)); } } r=pre.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally{ close();//2、关闭数据库,释放相关的资源 } return r; } //关闭数据,释放相关资源 public void close(){ try { if(re!=null){ re.close(); } if(pre!=null){ pre.close(); } if(con!=null){ con.close(); } }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } BaseDao
public interface CarDao { public int newCar(Car c); }
public class Car implements Serializable{ private static final long SerialVersionUID=2070056025956126480L; private String userid; private String carno; private int price; private int discountprice; private int purchasetax; public Car(String userid,String carno,int price2,int discountprice2,int money2){ this.userid=userid; this.carno=carno; this.price=price2; this.discountprice=discountprice2; this.purchasetax=money2; } public String getUserid() { return userid; } public String getCarno() { return carno; } public int getPrice() { return price; } public int getDiscountprice() { return discountprice; } public int getPurchasetax() { return purchasetax; } } Car类
public class CarDaoImpl extends BaseDao implements CarDao { @Override public int newCar(Car c) { int r=0; String sql="insert into car(userId, carno, price, discountprice, purchasetax)values(?,?,?,?,?)"; ArrayList list=new ArrayList(); list.add(c.getUserid()); list.add(c.getCarno()); list.add(c.getPrice()); list.add(c.getDiscountprice()); list.add(c.getPurchasetax()); r=super.changData(sql, list); return r; } } 实体类
public static void main(String [] args){ //计算车辆的购置税 Scanner input=new Scanner(System.in); System.out.println("记录车辆购置税,请按提示录入相关信息:"); System.out.print("请输入车主的身份证号码(18位):"); String userId=input.next(); System.out.print("请输入车辆的识别码(17位):"); String carNo=input.next(); System.out.print("请输入车辆的排放量:"); double pai=input.nextDouble(); System.out.print("请输入官方指导价:"); int price=input.nextInt(); System.out.print("请输入发票价格:"); int discountprice=input.nextInt(); //计税价格 double money=discountprice/1.17; //车辆购置税 double money2=0; //计算车辆购置税 if(pai<=1.6){ money2=money*0.075; }else{ money2=money*0.1; } Car c=new Car(userId,carNo,price,discountprice,(int)money2); int r=CarManager.newCar(c); if(r>0){ System.out.println("数据保存成功,车辆购置税为:"+(int)money2); }else{ System.out.println("输入数据有误,数据保存失败!"); } } 测试类