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的值
连接数据库的标准流程:
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中的Statement和PreparedStatement接口对象
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle数据库执行脚本常用命令小结
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马