1.注册驱动,用来让虚拟机和数据库进行交流,jdbc中会有一个池,里面存放所有的驱动,但是默认池中是空的,所以需要先注册一个关于oracle的驱动放置到池中,然后才能得到这个驱动来完成虚拟机与数据库的交流,注册驱动有三种方法:
a,在oracle.jdbc.driver.OracleDriver
静态代码块 能完成注册驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
b,在这个类中的构造器中也完成了注册驱动的代码
所以也可以调用构造器完成注册驱动
new oracle.jdbc.driver.OracleDriver();
c,会从一个Properties
key是jdbc.driver
拿到value后 通过value的值注册驱动
System.setProperty("jdbc.driver", "oracle.jdbc.driver.OracleDriver");
我对这三种方式的理解是第三种是基层的方式,即第一种第二种都是在内部调用了这种方式,将关于oracle的驱动成功放到了jdbc放置驱动的池中
2.获取Connection
当第一步成功注册了驱动,就可以成功从池中获取这个驱动,并写入你的数据库的url和账号密码,与数据库建立连接。
url的形式为:协议:子协议:别名:@ip:端口号(port):数据库名
我的数据库是oracle的,数据库名为orcl,端口为1521,所以我的url为jdbc:oracle:thin:@localhost:1521:orcl,具体方式为下
String url ="jdbc:oracle:thin:@localhost:1521:orcl";
String user ="user";
String password ="password";
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", user, password);
可以使用System.out.println(conn);来测试连接是否成功,只要连接对象部位空就代表数据库连接成功了
3.获得Statement对象,用来执行sql语句
Statement对象分为Statement,PrepareStatement, CallableStatement。目前我只学到了前两种,所以也只会记录前两种的用法。
其中Statement对象直接创建,然后直接执行sql语句
而PrepareStatement是一种支持缓冲的statement对象,需要先创建sql语句,将想要变换的属性或列名设为?,然后设置每个?,最后执行sql语句
形式如下
//获取普通statement对象
Statement sta =conn.createStatement();
//建立String形的sql语句
String sql ="insert into emp1(id,last_name) values(101,'Tom')";
//执行sql语句,执行后会返回一个布尔类型的值,提示是否执行成功了
boolean flag =sta.execute(sql);
//对于prapareStatement要先建立sql语句
String sql ="insert into emp1(id,last_name) values(?,?)";
//获取PrepareStatement对象
PreparedStatement prepareStatement = conn.prepareStatement(sql);
//设置sql语句中的?值,来得到我们想要的效果,对于?的设置从开始,且要与数据库中表的要求格式相符
prepareStatement.setInt(1, 999);
prepareStatement.setString(2, "Jack");
//执行sql语句,注意不需要在execute中添加参数,因为在建立PreparedStatement时已经将sql语句缓存到了对象中。
prepareStatement.execute();
PreparedStatement:
* 优点:大批量同构语句速度快
* 1.预处理sql(可变的sql)
* 使用?号代替值,然后通过set添加数据,从而实现所想要的sql语句
* 2.批处理sql
* oracle数据库支持批处理
* mySQL不支持批处理,使用批处理与逐行插入效果一样
4.如果有返回结果集,对结果集进行处理,比如select时
String sql = "select id,last_name,start_date from s_emp";
ResultSet rs = stat.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("last_name");
try {
Date date = rs.getDate("start_date");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
//format方法需要util.date类型的参数
//由于sql.date是util.date的子类,所以可以直接传入到format方法中
simpleDateFormat.format(date);
//通过下标取值,从1开始
// int id = rs.getInt(1);
// String name = rs.getString(2);
// Date date = rs.getDate(3);
System.out.println(id+" "+name+" "+date);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
5.关闭资源
sta.close();
conn.close();