您的位置:首页 > 编程语言 > Java开发

java数据库连接JDBC

2016-01-23 16:56 375 查看
JDBC是由java提供的一套接口,里面规定了连接数据库的标准执行流程以及涉及到的方法功能定义。但是没有具体实现。不同的数据库厂商负责编写一套实现类,用于操作他们的数据库管理系统。

连接数据库的标准流程:

1. 加载驱动  Class.forName("xxx")  不同的数据库中间的字符串不一样

2. 建立连接  DriverManager.getConnection()  其中要求三个参数:

         a)数据库连接地址(不同数据库格式不一样)

         b)数据库用户名

c) 数据库密码

3.创建执行语句对象   connection.createStatement()

4.执行SQL语句

a) boolean statement.execute()          DDL

         b)int statement.executeUpdate()         DML

         c)ResultSet  statement.executeQuery()   DQL

5.若执行查询,会得到结果集ResultSet, 处理结果集获取查询的数据

ResultSet rs = state.executeQuery(sql);

ResultSetMetaData rsmd = rs.getMetaData();通过结果集获取元数据

         intcount = rsmd.getColumnCount(); 查看结果集中总共有多少个列(字段)

         Stringname = rsmd.getColumnName(i); 获取指定下标对应的列的列名 

6.与数据库断开连接

实例:

public class JDBCDemo1 {

public static void main(String[] args) {

         Connectionconn = null;

           try {

                   Class.forName("oracle.jdbc.driver.OracleDriver");

                     conn = DriverManager.getConnection(

                            "jdbc:oracle:thin:@192.168.1.5:1521:orcl",

                            "username",

                            "password"

                     );

                     Statement state = conn.createStatement();

                     String sql = "SELECT e_no,e_name,sal,job,deptnoFROM emp";

                     ResultSet rs = state.executeQuery(sql);

                     while(rs.next()){

                           
a89d
intempno = rs.getInt("e_no");

                            Stringename = rs.getString("e_name");

                            intsal = rs.getInt("sal");

                            Stringjob = rs.getString(4);

                            intdeptno = rs.getInt(5);

                            System.out.println(e_no+","+e_name+","+sal+","+job+","+deptno);

                     }

                   }catch (Exception e) {

                                      
e.printStackTrace();

                   }finally{

                            if(conn!= null){

                                     try{

                                               conn.close();

                                     }catch (SQLException e) {

                                              e.printStackTrace();

                                     }

                            }

                   }

         }

}

 

分页查询

分三步实现:

  1)查询出全部记录 2)根据结果再次查询添加ROWNUM列 3)再根据ROWNUM条件查询

int pageSize 每页的条数

int page   要显示的页码

int start = (page-1)*pageSize+1; 起始记录

int end = page*pageSize;      结束记录

String sql = "SELECT * FROM( "+

                        "SELECT ROWNUM rn,t.*  FROM( "+

                          "SELECT e_no,e_name,sal,job,deptno"+

                               " FROM emp ORDER BY sal DESC ) t )"+

                               "WHERE rn BETWEEN "+start+"AND "+end;

 

动态SQL的执行

Statement通常只用来执行"静态SQL"。就是SQL语句 中没有任何会变化的部分。

静态拼接SQL的缺点1)提高编码复杂度,也导致源码不易读2)可能会出现SQL注入攻击 3)批量执行语义相同内容不同的SQL时效率差

PreparedStatement执行预编译SQL语句的Statement,PreparedStatement继承自Statement 当需要执行动态SQL,就应当使用它。 使用它来执行预编译SQL,预编译SQL中只不过将需要变化的数据以"?"代替。在后期在针对?设置不同的值即可。这样也可以简化拼接SQL语句的复杂度。

String sql ="INSERT INTO userinfo (id,name,password,email) VALUES(seq_userinfo_id.NEXTVAL,?,?,?)";

PreparedStatement ps =conn.prepareStatement(sql);

在执行SQL时,要先将"?"对应的具体值设置好PreparedStatement提供了若干SetXXX方法,用来针对?设置值,例如:  setInt(int index,int value) 对第index个问号设置给定的值value,下标从1开始。

int n = ps.executeUpdate();

 

批量更新数据

如要批量执行更新操作用ps .executeUpdate()就不太合适,因为每当我们执行一次executeUpdate() 方法时,都会将?对应的值发送到服务端执行,这样会增加网络访问次数,降低访问效率,此时可执行

ps. SetXXX    ps. .addBatch()    ps.executeBatch()

 

PreparedStatement允许我们在更新数据时感知 这条数据中给定字段对应的值。通常用于返回主键并用于关联插入从表的外键中

String sql = "INSERT INTO dept (deptno,dname,manager)VALUES (seq_dept_deptno.NEXTVAL,?,?)";

PreparedStatement ps = conn.prepareStatement(sql,newString[]{"deptno"});

ps.setString(1, "dev");

ps.setString(2, "Tom");

ps.executeUpdate();

ResultSet rs = ps.getGeneratedKeys();

rs.next();

int deptno = rs.getInt(1);得到deptno的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdbc 数据库