第十九章 JDBC

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();
				}
			}
		}
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值