声明是没有内存空间的

定义是有内存空间的

数据库中 = 是判断的意思  赋值是 := 

数据库不能用++  只能用  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 事务的四大特性
原子性: 事务中语句 是一个完整的不可分割整体。这些语句要求一起成功
或者 同时 失败。
一致性: 事务中语句的状态 切换到 另一个状态 要保持一致
持久性: 事务中的状态如果已经 确认改变 则 数据库管理系统无论发生什么错误
可以保证 状态不再改变。
隔离性: 事务中的语句 再没有提交 之前 数据的变化 不能被其它事务获取到
这种特性叫隔离性。


















 

 posted on 2019-04-26 11:09  哦吼厉害哟  阅读(84)  评论(0编辑  收藏  举报