前面已经学习了什么是数据库和对数据的一些操作方法,那么,我们应该如何在java程序中操作sql server数据库呢?
一、期望目标
1.掌握sql server数据库的备份和恢复技巧
2.掌握java对表的crud(增删改查)操作
3.掌握 Statement 和 PreparedStatement 类
4.能完成一般的java数据库编程任务
二、数据库的备份与恢复
1. 简单直观的方式:企业管理器
2. 使用sql server语句进行数据库的备份和恢复:查询分析器
--如何备份数据库
--语法:backup database 你要备份的数据库名 to disk='路径'
backup database WXY to disk='f:/sp.bak'
--删除数据库
drop database WXY
--如何恢复数据库
--语法:
restore database 你的数据库名 from disk='备份文件路径'
restore database WXY from disk='f:/sp.bak'
--有时可能不需要备份整个数据库,而是数据库中国的某些表(自己查)
三、java程序操作sql server
1. crud介绍:即增、删、改、查(增加create,查询retrieve,更新update,删除delete)。
2. jdbc的基本概念
(1)ODBC(Open Data Base Connectivity,开放的数据库接口)
其实就是一系列函数,可以被调用,函数里实现了想要对数据库执行的操作,调用者只需要给函数传递参数就行。
(2)JDBC(Java Data Base Connectivity,java数据库连接):java ---> jdbc ---> 数据库
① 是一种用于执行SQL语句的Java API,由一组用java语言编写的类和接口组成;
② 使数据库开发人员可以用纯Java API编写数据库应用程序;
③ JDBC API可实现对不同类型数据库的访问,“编写一次,处处运行”
3. 两种常用的操作方式(jdbc-odbc和jdbc)
(1)jdbc-odbc桥连的方式操作数据库
首先需要配置数据源(这里省略),然后在程序中连接数据源。需要注意的是,win64系统下使用这种方式会报错!
/*
* 演示使用jdbc-odbc桥连的方式,来操作数据库 WXY(emp,dept)
* 1.配置数据源
* 2.在程序中去连接数据源
* */
package com.test1;
import java.sql.*;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection ct = null;
Statement sm = null;
try{
/*------------------------------下面是固定写法!!------------------------------*/
// 1. 加载驱动 (作用是把需要的驱动程序加入内存)
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// 2.得到连接 (指定连接到哪个数据源)
//如果你配置数据源的时候,选择的是windows nt验证,则不需要“sa”和“3317”
//即,Connection ct = DriverManager.getConnection("jdbc:odbc:hello");
ct = DriverManager.getConnection("jdbc:odbc:hello","sa","3317");
//3. 创建Statement 或PreparedStatement
//Statement:主要用于发送sql语句,到数据库
sm = ct.createStatement();
//4. 执行crud,创建、删除、备份数据...
// (1) 演示添加一条数据到dept表(executeUpdate可以执行cud操作)
// 返回值 i:表示成功加入的数据的条数
int i = sm.executeUpdate("insert into Hero values(3,'保安部','西永','男',20000)");
if(i==1)
System.out.println("添加ok");
else
System.out.println("添加error");
} catch (Exception e){
e.printStackTrace();
}finally{
//关闭资源的地方:谁后创建,则先关闭
try {
if(sm!=null)
{
sm.close();
}
if(ct!=null)
{
ct.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
(2)jdbc方式操作数据库
注意:需要自行添加额外的三个数据库驱动jar包(msbase.jar, mssqlserver.jar, msutil.jar)
/**
* JDBC方式操作数据库
* 1. 把包java.sql.*引入
* 2. 需要引入三个jar包
*/
package com.test2;
import java.sql.*;
public class Test2 {
public static void main(String[] args) {
//定义需要的对象
PreparedStatement ps = null;
Connection ct = null;
ResultSet rs = null;
try{
//初始化各个对象
// 1. 加载JDBC的驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// 2. 得到连接
ct = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=WXY","sa","3317");
// 3. 创建火箭车
/* ps = ct.prepareStatement("select * from emp");
// 4. 执行(如果是增加、删除、修改 executeUpdate(), 如果是查询 executeQuery() )
rs = ps.executeQuery();
//循环取出每一行的数据:雇员的名字、雇员的薪水、部门的编号
while(rs.next()){
String name = rs.getString(2);
float sal = rs.getFloat(6);
int depno = rs.getInt(8);
System.out.println(name+" "+sal+" "+depno);
} */
//插入数据
ps = ct.prepareStatement("insert into dept values(?,?,?)");
ps.setInt(1, 100);
ps.setString(2, "财务部");
ps.setString(3, "大学城");
int i =ps.executeUpdate();
if(i==1){
System.out.println("添加成功!");
}else{
System.out.println("失败!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(ct!=null){
ct.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
(3)比较
Statement和PreparedStatement
①相同点
二者都可以用于把sql语句从java程序中发送到指定数据库,并执行sql语句。
②不同点
- 直接使用Statement,驱动程序一般不会对sql语句作处理而直接交给数据库;使用PreparedStatement,形成预编译的过程,并且会对语句作字符集的转换。(在java程序中先预编译成二进制文件,再发送给sqlserver。这样缓解了服务器的压力,将压力分散给不同的java程序)。如此,有两个好处:对于多次重复执行的语句,使用PreparedStatement效率会高一点,并且在这种情况下也比较适合使用batch;另外,可以比较好地解决系统的本地化问题。
- PreparedStatement还能有效地防止危险字符的注入,也就是sql注入的问题。
- PreparedStatement可以提高执行效率,因为它有预编译的功能;
- PreparedStatement可以防止sql注入,但是要求用?赋值的方式才可以。
④使用PreparedStatement的代码
/*----------------------------使用PreparedStatement-------------------------------*/
//(1)查询
ps=ct.prepareStatement("select * from dept");
rs=ps.executeQuery(); //rs指向第一条数据的上一行,因此必须要通过next()才能获取第一行数据
while(rs.next()){
System.out.println("ok");
//分别获取某一行的第1、2、3个字段的内容:
int i = rs.getInt(1);
String s1 = rs.getString(2);
String s2 = rs.getString(3);
}
//(2)插入数据
ps=ct.prepareStatement("insert into dept values(?,?,?)");
ps.setInt(1,50);
ps.setString(2,"安全部");
ps.setString(3,"北京");
int i = ps.executeUpdate();
/*----------------------------------------------------------------------------------*/