声明是没有内存空间的
定义是有内存空间的
数据库中 = 是判断的意思 赋值是 :=
数据库不能用++ 只能用 v= v+1;
一,连接数据库的具体操作
a 加载驱动(就是创建实例)
Class.forName("/*驱动的名字*/");
b 获取数据库连接 Connection
DriverManager.getConnection(url/*数据库地址的写法*/,uesrname/*登录名字*/,passeworld/*登录密码*/);
如果连接oracle url地址的写法是 /*Oracle SqlServer MySql的方法不一致*/
大体格式 主协议 :子协议:主机:端口号默认1521:实例名
"jdbc:oracle:thin:@localhost:/*端口号*/:xe"
c 使用连接 创建sql的执行环境 Statement
Statement st = conn.createStatement();
d 执行sql ddl dml select 要根据所执行的语句来选择方法
String sql = "/*执行sql语句*/";
如:在数据库中插入用户的信息时 要使用字符串的拼接也可以使用?
String sql = "insert into bank_account values(bank_account_id_seq.nextval,'"+ano+"',"
+ "'"+aname+"','"+apassword+"',"+amoney+",sysdate)";
返回的行数 int rows = st./*方法*/;
返回结果集 ResultSet rs = st.executeQuery(sql);
st./*所需要的方法*/(sql);
DDL /*表的增删该查*/execute(sql)
DML//*数据的增删改*/executeUpdate(sql) 会返回执行成功的行数
select /**/executeQuery(sql) 会返回 结果集ResultSet
e 释放资源 连接 执行环境 结果集ResultSet
1.都使用colse()关闭
2.创建时要从大往小 释放要从小往大释放
3.释放时要进行判断是否为null
4.关闭之后要制空
二 JDBC的查询
返回结果集 ResultSet rs = st.executeQuery(sql);
rs.next() 代表把数据指针向下移动 如果有数据则返回 true 如果没有数据则返回false
rs.getXX XX 代表各种类型
rs.getString
rs.getDouble
rs.getInt rs.getDate 只有年月日 rs.getTimeStamp 年月日时分秒 这些方法都有两种获取数据的手段 可以使用 下标获取(编号从1开始) 也可以使用字段名
三,把jar包 加载到程序中
项目上右键 ---- buildpath--- configbuildpath --- library ---userlibrary --- addLibrary---- new ---- 写入名字 ----- 找到对应的jar add external jar
代码
public class testJdbc{
pubiic static void main(String[] args){
//加载驱动
Class.forName("oracle.jdbc.oracleDriver");
//获取连接、
Connection conn = DrivsrManager,getConnection("jdbc:oracle:thin:@localhost:1521:xe",
“system”,"123456");
//获取执行环境‘’
Statement st = conn.createStatement();
//执行sql语句
/*根据所需的sql语句选择方法完成代码*/
//释放资源
if(st != null){
st.colse();
st = null;
}
if(conn != null){
conn.colse();
conn = null;
}
}
}
四 把代码的中共有的加载驱动 获取连接的代码 以及 释放资源的代码 抽取到工具类中
public class JdbcUtil{
private static String driverClassName="oracle.jdbc.OracleDriver";
private static String url="jdbc:oracle:thin:@localhost:1521:xe";
private static String username="system";
private static String password="123456";
/*外面赋值就回吧变量写死 当使用别的数据库时这个工具类就作废*/
static/*静态代码块*/{
//加载驱动
Class.forName("oracle.jdbc.oracleDriver");
//获取连接、
Connection conn = DrivsrManager,getConnection("jdbc:oracle:thin:@localhost:1521:xe",
“system”,"123456");
//获取执行环境‘’
Statement st = conn.createStatement();
//执行sql语句
/*根据所需的sql语句选择方法完成代码*/
/*设计一个方法完成对数据库连接的获取*/
public static Connection getConnection(){
}
//释放资源的方法
public static void releaseResource(Connection conn,Statement st,ResultSet rs )
if(st != null){
st.colse();
st = null;
}
if(conn != null){
conn.colse();
conn = null;
}
if(re != null){
re.colse();
re = null;
}
}
}
五 对Jdbc 工具类的改进版
1.创建一个配置文件 db.properties
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
username=system
password=123456
2.类加载路径
/*从文件中读取数据 相对于类路径下 加载数据*/
inputStream inputStream = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
/*把这个流交给 Properties类型的对象*/
Properties pro = new Properties();
/*加载完成之后 文件中的数据自动变成一个key value 的结构*/
pro.load(inputStream);
driverClassName=pro.getProperty("driverClassName");
url=pro.getProperty("url");
username=pro.getProperty("username");
password=pro.getProperty("password");
Class.forName(driverClassName);
// 设计一个方法 完成对 数据库连接的获取
public static Connection getConnection(){
Connection conn = null;
conn=DriverManager.getConnection(url, username, password);
return conn;
}
// 设计释放资源的方法
public static void releaseResource(Connection conn,Statement st,ResultSet rs){
if(rs!=null){
rs.close();
finally{
rs = null;
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
}
六 .更高级的执行环境 PreparedStatement
1 PreparedStatement 比 Statement的优势
简化sql语句的拼接 使用 ?占位符 可以避免字符串类型的数据拼接 以及其其它类型的数据
String sql = "insert into "insert into bank_account values(bank_account_id_seq.nextval,?,?,?,?,sysdate)";
st = conn.prepareStatement(sql);
// 把问号 替换成 相应的值
st.setString(1, ano);
st.setString(2, aname);
st.setString(3, apassword);
st.setDouble(4, amoney);
//3.执行sql语句
...........
可以提前生成执行计划 提高了sql执行的效率
可以避免频繁的拼接sql,避免sql的缓冲溢出。(了解)
可以避免sql注入
使用Statement 完成一个 登录的操作
思路:根据用户名 密码 去数据库中查找 看是否有这样的一条数据 如果有就包装成
用户实体对象 通过实体对象 判断 如果不是null则登录成功 否则登录失败。
/*包装用户*/
if(re.next()){
user = BankAccout
}if(user != null){
if(user.getAname().euqals(name)&& ){
}
}
2. PreparedStatement
String sql = "select * from bank_account where aname=? apassword=? ";
//获取执行环境
st = conn.PrepareStatement(sql);
七 批处理
不适用于查询
1.两种方法
(1)一个是Statement 的 addBatch (String sql) 执多条 sql 并且 sql 可以不同的操作 就多用几次 addBatch
最后通过 executeBatch() 执行批处理 返回一个 int[] 代表执行的结果
public static void main(String[] args){
Connection conn = null;
Statement st = null;
conn = JdbUtil2.getConnection();
//准备好执行的sql
String sql1="uppdate s_emp set name='gg' where id = 50";
String sql2="insert into s_dapt values(111,'test',1)";
st.addBatch(sql1);
st.addBatch(sql2);
int [] res = st.executBatch();
for(int t : res){
System.out,println(t);
}
}
(2) 使用PrepareedStatement 来完成
注意这种批处理 合适 语句相同 但是值不同
如 向表中怎加几条数据
String [] ano={"3333","33","22"};
String[] anomes={"aaaa","ffff","dd"};
eg:
........
//1. 获取连接
conn = JdbcUtil2.getConnection();
PreparedStatement ps= null;
ps.conn.prepareStatement("insert into bank_account(id,ano,aname)"
+"values(banck_account_id_sql.next,?,?)");
String [] ano={"3333","33","22"};
String[] anomes={"aaaa","ffff","dd"};
for(int i=0 ; i<3 ; i++) {
ps.setString(1,ano[i]);
ps.setString(2,anames[i]);
ps.addBatch();
}
ps.executBatch();
八 调用存储过程
1.先写一个存储过程 设计三个整数 把前两个参数的和存入第三个参数中
create or repleace procedure getSum(var_x in number , var_y number ,var_z out number);
is
begin
var_z : = var_x+var_y;
end;
/
2.Jdbc 调用 使用CallableStatement/*专门用于调用存储过程的*/接口
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}/*调函数*/ {call/*唤醒调用*/ <procedure-name>/*过程的名字*/[(<arg1>,<arg2>, ...)/*参数列表参数使用?表达*/]}
eg:
public static void main(String[] args){
Connection conn = null;
CallableStatement cs = null;
conn = Jdbcutil.getConnection();
cs = conn.prepareCall("{call getsum(?,?,?)}");
//in 参数 可以直接设置值 也可以设置一个变量
cs.setInt(1,10);
cs.setInt(2,20);
//out 必须使用变量 设置方式如下 叫注册out参数
cs.registerOutParamenter(3,Type.INTEGER);
cs.execute();
//获取执行结果
System.out.println(cs.getInt(3));
//释放
finally{
JdbcUtil2.releaseResource(conn,cs,null);
}
}
小结:CallableStatement 获取通过 prepareCall(String sql)
sql 的格式是 "{call 过程名(参数列表)}" 参数列表使用?表达
in 模式的参数 可以直接设置值或者变量
out 参数不像plsql一样传入一个变量就行了 而是需要注册参数
cs.registerOutParmeter(索引位置,Types.具体的类型);、
执行通过cs.execute()然后通过注册的索引位置 取得值即可
3.先写一个存储过程 设计两个整数参数 把前两个参数的和存入第二个参数中
九 JDBC中的事务
1 如何实现?
jdbc 中的 Connection 默认是自动提交事务的 哪就意味 要完成多个操作的事务时
需要关闭自动提交。
conn.setAutoCommit(false);
以后需要提交的地方写
conn.commit();
需要回滚的地方
conn.rollback();
2 实现转账
3.事务
3.1 事务的四大特性
原子性: 事务中语句 是一个完整的不可分割整体。这些语句要求一起成功
或者 同时 失败。
一致性: 事务中语句的状态 切换到 另一个状态 要保持一致
持久性: 事务中的状态如果已经 确认改变 则 数据库管理系统无论发生什么错误
可以保证 状态不再改变。
隔离性: 事务中的语句 再没有提交 之前 数据的变化 不能被其它事务获取到
这种特性叫隔离性。