JDBC是java中用来连接DB的API接口集,现在由数据库提供商自己实现。我们直接使用java中的抽象父类。
一、JDBC的4种驱动
第一种:最开始的ODBC,基本不用了
第二种:后来的需要在客户端安装二进制代码的驱动
第三种:用纯java编写的驱动,需要使用中间件来转换命令,能访问不同类型的数据库,一般用在网络的分布式系统中使用。
第四种:也是用纯java编写的,但是不需要使用中间,在本地直接转换命令,速度很快,但是只能访问一种类型的数据库。
二、JDBC使用流程
1.加载驱动
首先根据需求和条件选择驱动,
再将驱动拷贝到工程中的lib文件夹中,加载驱动到工程。
并使用Class.forName("Driver类的完整名字") 来加载驱动。
2.获得与数据库的联接
通过java中的DriverManager来获得COnnection对象。
Connection con = null;
con = DriverManager.getConnection(url,user,password)其中使用不同的数据库需要用到的url不一样,user是用户名,后面是密码
3种数据库的url使用
ORCALE数据库:jdbc:oracle:thin:@host:port:dbName
SqlServer数据库:jdbc:sqlserver://host:port;dataName=dbName
mysql数据库:jdbc:mysql://host:port/dbName
3.通过联接获得语句Statement对象
如果使用普通的Statement对象,需要拼接字符串,容易导致sql注入风险。con.createStatement(sql)来产生普通对象,但是很少使用
一般使用预编译的Statement对象,它经过预编译,执行的效率很高,而且可以反复使用,只需要在使用之前设置条件的值就行。而且还能防止sql注入风险。
con.prepareStatement(sql,type,concurrency,holdablity)来设置结果集的属性产生对象。
还有一种是用作存储过的的con.preareCall(sql)来产生一个存储过程的Statement对象。
create produce add(int a , int b, out int sum)
begin
set sum = a+b;
end;
CallableStatement cst = new prepareCall("{call add(?,?,?)}");
cst.setInt(1,2);
cst.setInt(2,3);
cst.registerOutParameter(3,Type.INTEGER);
cst.execute();
4.通过Statement对象执行sql语句
Statement st = con.prepareStatement(sql);
st.setString(index,"string");
st.executeQuery();用于查询,返回结果集
st.executeUpdate();用于增加,删除,更新
5.操作结果集
ResultSet rs = st.executeQuery();
while(rs.next()){//获取下一行,如果有效的话
rs.getXXX(index);
rs.getXXX("列名");
}
6.关闭资源
if(rs != null){
rs.close();
}
if(st != null){
st.close();
}
if(con != null){
con.close();
}
三、结果集的操作和大数据的操作
1.在构造Statement对象时
可以设置结果集的遍历方式,一次性向前,自由移动(DB改变是否会影响结果集的内容)
可以设置结果集是否可以更改DB里面的内容,
还可以设置结果集的事件提交时,对象的开发性。
2.结果集的查询一般都可以使用get方法来,参数有索引从1开始,和列名2种方式。
3.更新结果集
upadate(index,"值")只能更新结果的内容,不能改变DB中内容。
updateRow(),更新改变到DB中
deleteRow(),删除行
insertRow(),插入行,当前行必须在可插入的行,rs.moverToInsertRow()移动导航指针到插入行
refreshRow()刷新结果集的当前行。
4.文本和图片等大数据的写入到DB中
使用CLOB文本对象 和 BLOB二进制数据对象
或者使用流来处理。
ps.setAsciiStream(index,OutputStream,len)文本输出流
ps.setBinaryStream(index,OutputStream,len)二进制输出流
ps.getAsciiStream(index)获得文本输入流,还可以通过列名获得
ps.getBinaryStream(index)获得二进制输入流,还可以通过列名获得
获得文本或二进制数据对象
Clob clob = ps.getClob(index);
Blob blob = ps.getBlob(index);
列子:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DBOperation {
public DBOperation(){
}
private static Connection loadDB(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection con = null;
try {
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/data_user",
"root", "123");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(con != null){
Atm.getFather().getMsgAre().setText("数据库连接成功!");
}
return con;
}
public static User loginUser(String username,String password){
User theUser = null;
Connection con = null;
try {
con = DBOperation.loadDB();
String sql = "select * from t_user where u_name = ? " +
"and u_password = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
ResultSet rs = ps.executeQuery();
if(rs.next()){
theUser = new User();
theUser.setPk_id(rs.getInt("pk_id"));
theUser.setName(username);
theUser.setPassword(password);
theUser.setAccount(rs.getFloat("u_account"));
theUser.setLastDate(rs.getString("u_lastDate"));
System.out.println("用户:"+username+"登录成功!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return theUser;
}
public static void updateUser(User theUser){
Connection con = null;
try {
con = DBOperation.loadDB();
String sql = "update t_user set u_password = ? , u_account = ? , u_lastDate = ? where pk_id = ?";
if(theUser != null){
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,theUser.getPassword());
ps.setFloat(2,theUser.getAccount());
ps.setString(3,sdf.format(now));
ps.setInt(4, theUser.getPk_id());
int columns = ps.executeUpdate();
System.out.println("这次更新了:"+columns+"个用户!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static boolean addUser(){
Connection con = null;
boolean addsuccessful = false;
try {
con = DBOperation.loadDB();
String sql = "insert into t_user values(null,?,?,?,?)";
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
User theUser = User.add();
PreparedStatement ps = con.prepareStatement(sql);
//如果返回的用户不是null
//判断是否有名字和密码都相同的账户存在,如果没有则添加用户
if(theUser != null && DBOperation.loginUser(theUser.getName(), theUser.getPassword()) == null){
ps.setString(1, theUser.getName());
ps.setString(2,theUser.getPassword());
ps.setFloat(3,theUser.getAccount());
ps.setString(4,sdf.format(now));
int columns = ps.executeUpdate();
if(columns > 0 ){
System.out.println("这次添加了:"+columns+"个用户!");
addsuccessful = true;
Atm.getFather().getAtm().setTheUser(DBOperation.loginUser(theUser.getName(), theUser.getPassword()));
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return addsuccessful;
}
public static void deleteUser(User theUser){
Connection con = null;
try {
con = DBOperation.loadDB();
String sql = "delete from t_user where pk_id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setInt(1, theUser.getPk_id());
int columns = ps.executeUpdate();
System.out.println("这次删除了:"+columns+"个用户!"+theUser.getName());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(con != null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}