►JDBC (Java DatabaseConnectivity) 是用于执行SQL 语句的Java 应用程序接口,由一组用Java 语言编写的类和接口组成。
►JDBC 是一种规范,各数据库厂商为Java 程序员提供标准的数据库访问类和接口,使得独立于DBMS 的Java 应用程序的开发工具和产品成为可能。
►其官方网站为:http://java.sun.com/products/jdbc/index.jsp。
oracle数据库的驱动:oracle.jdbc.oracleDriver
oracle的url:jdbc:oracle:thin:@localhost:1521:安装数据库时的别名 一般都是orcl
mysql数据库的驱动:com.mysql.jdbc.Driver
oracle的url:jdbc:mysql://localhost:3306/数据库名
连接数据库案例
获取Connection对象
第一种
Connection conn=DriverManager.getConnection(url, name, paw);
Class.forName("数据的驱动");
第二种 封装一个工具类来获取Connection对象
创建一个 资源文件====== properties文件 以oracle为例
url=jdbc:oracle:thin:@localhost:1521:orcl
driverClass=oracle.jdbc.OracleDriver
username=scott
password=tiger
创建一个工具类 可以获取connection对象
package cn.et;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
public class OracleDbUtil {
static Properties p=new Properties();
static{
//读取资源文件
InputStream is=OracleDbUtil.class.getResourceAsStream("/oracle.properties");
try {
//将properties文件的键值对加载到内存中
p.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws Exception{
String url=p.getProperty("url");//获取连接服务器的ip地址 端口 和数据库
String driverClass=p.getProperty("driverClass");//告诉jdbc使用的是什么数据库
String uname=p.getProperty("username");//使用哪个账号登录
String pwd=p.getProperty("password");//登录密码
Class.forName(driverClass);//加载该类
Connection conn=DriverManager.getConnection(url,uname,pwd);//获取连接数据库的对象
return conn;
}
}
测试类(执行静态的sql语句)
Statement st=conn.createStatement() 获取执行静态sql
package jdbcCURD;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
import java.sql.DatabaseMetaData;
public class MysqlCURD {
public static void main(String[] args) throws Exception {
}
//查询
@Test
public void select() throws Exception{
Connection conn=MysqlDbUtils.getConnection();
Statement st=conn.createStatement();
//Statement用于执行静态的sql语句
ResultSet re=st.executeQuery("select * from dept");
//ResultSet游标遍历数据行 next()
while(re.next()){
String deptno=re.getString("deptno");//通过列明获取数据
String dname=re.getString("dname");
String loc=re.getString(3);//通过索引获取数据
System.out.println(deptno+"--"+dname+"--"+loc);
}
st.close();
conn.close();
}
//增加
@Test
public void insert() throws Exception{
Connection conn=MysqlDbUtils.getConnection();
Statement st=conn.createStatement();
int re=st.executeUpdate("insert into teacher values(5,'老廖')");
System.out.println(re);
st.close();
conn.close();
}
//删除
@Test
public void delete() throws Exception{
Connection conn=MysqlDbUtils.getConnection();
Statement st=conn.createStatement();
int re=st.executeUpdate("delete from teacher where t=5");
System.out.println(re);
st.close();
conn.close();
}
//修改
@Test
public void update() throws Exception{
Connection conn=MysqlDbUtils.getConnection();
Statement st=conn.createStatement();
int re=st.executeUpdate("update teacher set tname='廖廖' where t=5");
System.out.println(re);
st.close();
conn.close();
}
}
测试类1(执行动态的sql语句)
预编译SQL语句:PreparedStatement pscolumn=conn.prepareStatement(sql);
package cn.et;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test_2 {
/*
* 3 写出一个分页的方法
* 定义如下
* tablePager(tableName,curPage,pageSize)
* 调用
* tablePager('Emp',2,10)
* 查询emp表中 第二页的数据(每页显示10条 第二页就是 10-20条)
* 5
*
* 1 1--5 curPage*pageSize-(pageSize-1) curPage*pageSize
* 2 6---10 curPage*pageSize-oageSize*1+1=pageSize*(curPage-1)+1
* 3 11---15
*
*
*/
public static void main(String[] args) throws Exception {
tablePager("EMP",1,100);
}
public static void tablePager(String tableName,int curPage,int pageSize) throws Exception{
int start=pageSize*(curPage-1)+1;
int end=curPage*pageSize;
//连接数据库
Connection conn=OracleDbutil.getConnection();
//获取所有的列明
String count="select wm_concat(column_name) from user_tab_cols where table_name=?";
//System.out.println(count);
//预编译获取所有的列明语句
PreparedStatement pscolumn=conn.prepareStatement(count);
//设值
pscolumn.setString(1,tableName);
//游标抓取数据
ResultSet rs=pscolumn.executeQuery();
rs.next();
//获取一行数据
String column=rs.getString(1);
//按逗号分隔 把所有的列名放在s数组中
String[] s=column.split(",");
//分页查询语句
String sql="select "+column+" from (select t.*,rownum rn from "+tableName+" t) where rn>=? and rn<=?";
//System.out.println(sql);
//预编译分页查询语句
PreparedStatement ps=conn.prepareStatement(sql);
//设值
ps.setInt(1,start);
ps.setInt(2, end);
//游标抓取数据
ResultSet rt=ps.executeQuery();
while(rt.next()){
//遍历数组可以获取下标
for(int i=1;i<=s.length;i++){
System.out.print(rt.getString(i)+" ");
}
System.out.println();
}
}
}
测试类2(动态sql语句)
package cn.et;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/*定义一个存储过程 传入表名
删除该表中的重复记录
比如 deleteMul(tableName)
调用 deleteMul('emp'); 必须删除表emp的重复数据 (execute immediate using )*/
public class Test_3 {
public static void main(String[] args) throws Exception {
deleteMul("EMP");
}
public static void deleteMul(String tableName) throws Exception{
//连接数据库
Connection cn=OracleDbutil.getConnection();
//获取列明语句
String count="select wm_concat(column_name) from user_tab_cols where table_name=?";
//预编译获取列明语句
PreparedStatement pscount=cn.prepareStatement(count);
//设值
pscount.setString(1, tableName);
//获取所有的列明
ResultSet rs=pscount.executeQuery();
rs.next();//必须调用该方法
String columns=rs.getString(1);
System.out.println(columns);
//删除重复记录语句
String delete="delete from "+tableName+" where rowid not in (select min(rowid) from "+tableName+" group by "+columns+ ")";
System.out.println(delete);
Statement stat=cn.createStatement();
stat.executeQuery(delete);
//关闭连接
stat.close();
rs.close();
pscount.close();
cn.close();
}
}