`
zgl707216
  • 浏览: 24493 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA JDBC 学习 笔记

    博客分类:
  • java
阅读更多
1、 Day01; 3
a) 了解JDBC; 3
b) JDBC的设计思想; 3
c) JDBC的组成部分; 4
d) 几种常见的数据库连接; 4
i. jdbc-odbc; 4
ii. oracle; 4
iii. mysql; 4
iv. SQL Server; 5
v. DB2; 5
vi. PostgreSQL; 5
e) 使用jdbc的编程步骤; 5
vii. 重要的接口与类; 7
1. connection: 7
2. DatabaseMetaData; 8
3. Statement; 9
4. statement  execute  dml; 10
5. statement  execute  ddl; 11
6. statement  preparedStatement; 12
7. resultSet; 15
8. 通过操作对象的方式来操作数据库的例子吧; 17
9. orm测试: 20
viii. 元数据; 23
ix. 结果集的使用; 23
x. 连接池; 23


1、 Day01;
a) 了解JDBC;
Java Data Base Connention,Java数据库连接;
是一种用于执行SQL语句的java API,可以为多种关系数据库提供统一访问,他是由一组用java语言编写的类和接口组成
JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,同时,JDBC也是一个商标名
b) JDBC的设计思想;
有sun公司提供访问数据库的接口,由各个数据库厂商提供对这些接口的实现,程序员编写时都是针对接口进行编程的。有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问MySql数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问其他数据库再编写另一个程序等等,程序员只需用JDBC API的标准写一个程序就可向各种数据库发送SQL的调用(前提是有各个数据库厂商提供的驱动包)。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。
c) JDBC的组成部分;
JDBC包括一套JDBC的API和一套程序员和数据库厂商都必须去遵守的规范,其主要分两个部分组成,都是包含在java平台里面
java.sql包:  提供访问数据库基本的功能
javax.sql包:提供扩展的功能
d) 几种常见的数据库连接;
i. jdbc-odbc;
驱动:sun.jdbc.odbc.JdbcOdbcDriver
URL:jdbc:odbc:datasource_name
ii. oracle;
驱动:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@<machine_name><:port>:dbname
注:machine_name:数据库所在的机器的名称;
    port:端口号,默认是1521
iii. mysql;
驱动:org.gjt.mm.mysql.Driver
or:com.mysql.jdbc.Driver
URL:jdbc:mysql://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
    port:端口号,默认3306   
DriverManager.getConnection("jdbc:mysql://192.168.1.2:3306/student_manager","root","admin"
iv. SQL Server;
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
注:machine_name:数据库所在的机器的名称;
    port:端口号,默认是1433
v. DB2;
驱动:com.ibm.db2.jdbc.app.DB2Driver
URL:jdbc:db2://<machine_name><:port>/dbname
注:machine_name:数据库所在的机器的名称;
    port:端口号,默认是5000
vi. PostgreSQL;
驱动:org.postgresql.Driver
URL:  jdbc:postgresql://localhost:5432/test
e) 使用jdbc的编程步骤;
1、 注册驱动;
2、 建立驱动;
3、 创建执行SQL的对象;
4、 执行SQL;
5、 如果有结果集返回,则处理结果集;
6、 关闭资源;
那么我们就通过mysql和oracle数据库来做一个简单连接数据库的操作吧,看如下代码;
通过maysql:
package jdbc_p1_mysql_oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcTest1_mysql {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");//注册驱动;
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");//建立连接;
Statement sta = conn.createStatement();
String sql = "select now()";//创建执行SQL对象
ResultSet rset = sta.executeQuery(sql);//执行SQL并返回结果集且处理结果集,将其打印出来
if (rset.first()) {
System.out.println(rset.getTimestamp(1));
}
//关闭连接;
rset.close();
sta.close();
conn.close();
}
}
通过oracle:
package jdbc_p1_mysql_oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcTest2_oracle {

public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");//注册驱动;
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");//建立连接;
Statement sta = conn.createStatement();//创建执行SQL对象
String sql = "select sysdate from dual";
ResultSet rset = sta.executeQuery(sql); //执行SQL并返回结果集且处理结果集,将其打印出来
if (rset.next()) {
System.out.println(rset.getTimestamp(1));
}
rset.close();
sta.close();
conn.close();
}
}





vii. 重要的接口与类;
1、 Driver 接口;
2、 DriverManager 类
3、 Connection 接口;
DatabaseMetadata 接口数据库元数据
4、 Statement接口  用于执行静态SQL语句并返回它所生成的对象据
PreparedStatement 接口  表示预编译的 SQL 语句的对象。
CallableStatement 接口
5、 ResultSet
first();
last();
next();
previous();
getxxx(index);
getxxx(colnumName);

那么我们就一一详细介绍以上的常用接口与类:
1. connection:
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;

public class JdbcTest1_connection {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");

System.out.println(DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin"));
System.out.println(DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin"));
// getConnection方法不是单例方法.每调用一次就会获得一个新的Connection对象.
// connection对象默认是自动提交事务
// 为了方便程序员编写事务代码,需要关闭自动提交
conn.setAutoCommit(false);

conn.close();
}
}
2. DatabaseMetaData;
package jdbc_p2;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;

public class JdbcTest2_databaseMetaData {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");

System.out.println(DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin"));
System.out.println(DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin"));
// getConnection方法不是单例方法.每调用一次就会获得一个新的Connection对象.

DatabaseMetaData dmdata = conn.getMetaData();
System.out.println(dmdata.getDatabaseProductName());
System.out.println(dmdata.getDatabaseProductVersion());
System.out.println(dmdata.getDriverName());
System.out.println(dmdata.getDriverVersion());
System.out.println(dmdata.getURL());
System.out.println(dmdata.getUserName());

/*
* ResultSet rset = dmdata.getTables(null, "root", null, null);
* while(rset.next()){ System.out.print(rset.getString(1)+" ");
* System.out.print(rset.getString(2)+" ");
* System.out.print(rset.getString(3)+" ");
* System.out.print(rset.getString(4)+" ");
* System.out.println(rset.getString(5)+" ");
* System.out.print(rset.getString(6)+" ");
* System.out.print(rset.getString(7)+" ");
* System.out.print(rset.getString(8)+" ");
* System.out.print(rset.getString(9)+" ");
* System.out.println(rset.getString(10)); }
*/
conn.close();
}
}
3. Statement;
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest3_statement {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");
conn.setAutoCommit(false);

// 创建statement对象,用于执行静态SQL
Statement sta = conn.createStatement();
String sql = "select now()"; // 静态SQL
ResultSet rset = sta.executeQuery(sql);
if (rset.next()) {
System.out.println(rset.getTimestamp(1));
}
statementTest(sta, "def");
conn.commit();

rset.close();
conn.close();
}

public static void statementTest(Statement sta, String var)
throws SQLException {
String sql2 = "insert into test2 values(null,'" + var + "')";// 依然是静态SQL
sta.executeUpdate(sql2);
}
}
4. statement  execute  dml;
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcTest4_statement_execute_dml {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root","admin");
conn.setAutoCommit(false);
Statement sta = conn.createStatement();

//定义sql
String sql = "select now()"; //select语句
sql = "insert into test2 (var) values ('def')";

//执行方法1: 返回boolean值,如果返回的是true表示执行的是select语句,需要从sta对象获得一个结果集.如果返回的是false,表示执行的是dml语句,需要从sta对象获得整数
boolean isQuery = sta.execute(sql);
if(isQuery){
System.out.println("执行的是select语句,需要从Statement对象中获得执行完sql返回的结果集");
ResultSet rset = sta.getResultSet();
}else{
System.out.println("执行的是DML语句,需要从Statement对象中获得执行完sql返回的受影响的数据行数");
int updateRowCount = sta.getUpdateCount();
System.out.println("受影响的记录行数: "+ updateRowCount);
}

//执行方法2:  执行SQL,返回一个结果集.  ==>只适合执行select语句.
ResultSet rset = sta.executeQuery("select now()");
//rset = sta.executeQuery("insert into test2 (var) values ('def')"); //Can not issue data manipulation statements with executeQuery()

//执行方法3:  执行DML语句,返回受影响的数据行数. ===> 只适合执行DML语句
int rowCount = sta.executeUpdate("insert into test2 (var) values ('def')");
//rowCount = sta.executeUpdate("select now()"); //Can not issue SELECT via executeUpdate()

//执行方法4: 批处理
sta.addBatch("insert into test2 (var) values ('abc1')");
sta.addBatch("insert into test2 (var) values ('abc2')");
sta.addBatch("delete from test2 where var = 'abc2'");
sta.addBatch("insert into test2 (var) values ('abc3')");
sta.addBatch("insert into test2 (var) values ('abc4')");

sta.executeBatch();

conn.commit();
conn.close();
}
}
5. statement  execute  ddl;
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JdbcTest5_statement_execute_ddl {

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");
conn.setAutoCommit(false);
Statement sta = conn.createStatement();
String createUserTableSQL = "create table user(id int primary key auto_increment,name varchar(20),password varchar(6))";
String createUserInfoTableSQL = "create table user_info(id int primary key references user(id),tel char(11),adds varchar(50),email varchar(30))";
String alterUserInfoTableSql = "alter table user_info add sex char(2)";

sta.addBatch(createUserInfoTableSQL);
sta.addBatch(createUserTableSQL);
sta.addBatch(alterUserInfoTableSql);
sta.executeBatch();

conn.commit();
conn.close();
}
}
6. statement  preparedStatement;
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest6_statement_preparedStatement {

public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");
// 关闭事务自动提交
conn.setAutoCommit(false);

// 调用插入用户数据的业务方法.
// insertUser(conn,"james2","123123","1231231231","guangzhou","a@b.c","男");
insertUser2(conn, "lily", "123123", "1231231231", "guangzhou",
"a@b.c", "女");

// 执行没有异常,提交事务.
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void insertUser(Connection conn, String name,
String password, String tel, String adds, String email, String sex)
throws SQLException {
// Statment
Statement sta = conn.createStatement();

// int id,String name,String password 保存在user 表
String sql1 = "insert into user values(null,'" + name + "','"
+ password + "')";
sta.execute(sql1);

// 检索出之前插入的用户的id,作为子表中外键的值.
String msql = "select id from user where name = '" + name
+ "' and password = '" + password + "'";
ResultSet rset = sta.executeQuery(msql);
int id = -1;
if (rset.first()) {
id = rset.getInt(1);
}

// int uid,String tel,String adds,String email,String sex 保存在user_info表
String sql2 = "insert into user_info values(" + id + ",'" + tel + "','"
+ adds + "','" + email + "','" + sex + "')";
sta.executeUpdate(sql2);
}

public static void insertUser2(Connection conn, String name,
String password, String tel, String adds, String email, String sex)
throws SQLException {
// int id,String name,String password 保存在user 表
String sql1 = "insert into user values(null,?,?)";
// 检索出之前插入的用户的id,作为子表中外键的值.
String msql = "select id from user where name = ? and password = ?";
// int uid,String tel,String adds,String email,String sex 保存在user_info表
String sql2 = "insert into user_info values(?,?,?,?,?)";

// PreparedStatement 表示预编译的 SQL 语句的对象。
PreparedStatement psta1 = conn.prepareStatement(sql1);
// 设置预编译SQL的参数.
psta1.setString(1, name);
psta1.setString(2, password);
// 执行
psta1.executeUpdate();

PreparedStatement psta2 = conn.prepareStatement(msql);
psta2.setString(1, name);
psta2.setString(2, password);
ResultSet rset = psta2.executeQuery();
int id = -1;
if (rset.first()) {
id = rset.getInt(1);
}

PreparedStatement psta3 = conn.prepareStatement(sql2);
psta3.setInt(1, id);
psta3.setString(2, tel);
psta3.setString(3, adds);
psta3.setString(4, email);
psta3.setString(5, sex);
psta3.executeUpdate();
}
}
7. resultSet;
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest8_resultSet {

public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");
Statement sta = conn.createStatement();
String sql = "select * from user where 1=2";

// 执行select语句返回结果集.
ResultSet rset = sta.executeQuery(sql);
// 哪怕select检错不出任何数据行,也会返回一个结果集.
System.out.println(rset == null);

// 有可能返回多条数据行.
sql = "select * from user";
rset = sta.executeQuery(sql);
// 循环操作结果集
while (rset.next()) { // 让结果集的光标下移一行,有数据返回true.
// 从结果集取数据
// getxxx(index), index是只查询出来的数据行中字段的索引位置,从1开始.
int id = rset.getInt(1);
String password = rset.getString(3);
String name = rset.getString(2);
System.out.println(rset.getRow() + " " + id + " " + name + " "
+ password);
}

System.out.println();

sql = "select * from user";
rset = sta.executeQuery(sql);
// 循环操作结果集
while (rset.next()) {
// 从结果集取数据
// getxxx(colnumName),
String name = rset.getString("name");
int id = rset.getInt("id");
String password = rset.getString("password");
System.out.println(id + " " + name + " " + password);
}
// ==============================
// 返回一行的
sql = "select count(*) from user";
rset = sta.executeQuery(sql);
// 如果我们明确结果集返回一行,我们可以用first方法,让光标指向第一行来判断是否有数据
if (rset.first()) {
System.out.println("总共有用户:" + rset.getInt(1));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
8. 通过操作对象的方式来操作数据库的例子吧;
为不同的表来创建一个javabean对象
userbean <> user表:
package jdbc_p2.model;

public class User {
private Integer id;
private String name;
private String password;

// 聚合了用户信息对象.
private UserInfo userInfo;

public UserInfo getUserInfo() {
return userInfo;
}

public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
// 双向关联
userInfo.setUser(this);
}

public User() {
super();
}

public User(String name, String password) {
super();
this.name = name;
this.password = password;
}

public User(Integer id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}

public int getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}
表中有主外键,在javabean中可以通过聚合  双向关联来实现
userInfo bean <> userInfo 表
package jdbc_p2.model;

public class UserInfo {
private Integer id;
private String tel;
private String adds;
private String email;
private String sex;

private User user;

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public UserInfo() {
super();
// TODO Auto-generated constructor stub
}

public UserInfo(String tel, String adds, String email, String sex) {
super();
this.tel = tel;
this.adds = adds;
this.email = email;
this.sex = sex;
}

public UserInfo(Integer id, String tel, String adds, String email,
String sex) {
super();
this.id = id;
this.tel = tel;
this.adds = adds;
this.email = email;
this.sex = sex;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getTel() {
return tel;
}

public void setTel(String tel) {
this.tel = tel;
}

public String getAdds() {
return adds;
}

public void setAdds(String adds) {
this.adds = adds;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}
}
9. orm测试:
对象  关系  映射
package jdbc_p2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import jdbc_p2.model.User;
import jdbc_p2.model.UserInfo;

public class JdbcTest7_orm {

public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "admin");
// 关闭事务自动提交
conn.setAutoCommit(false);

// 调用插入用户数据的业务方法.
// insertUser(conn,"james2","123123","1231231231","guangzhou","a@b.c","男");
// insertUser2(conn,"lily","123123","1231231231","guangzhou","a@b.c","女");

User user = new User("lily2", "123123");
UserInfo userInfo = new UserInfo("1231231231", "guangzhou",
"a@b.c", "女");
user.setUserInfo(userInfo);
insertUser2(conn, user);

// 执行没有异常,提交事务.
conn.commit();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

public static void insertUser(Connection conn, User user)
throws SQLException {
// Statment
Statement sta = conn.createStatement();

// int id,String name,String password 保存在user 表
String sql1 = "insert into user values(null,'" + user.getName() + "','"
+ user.getPassword() + "')";
sta.execute(sql1);

// 检索出之前插入的用户的id,作为子表中外键的值.
String msql = "select id from user where name = '" + user.getName()
+ "' and password = '" + user.getPassword() + "'";
ResultSet rset = sta.executeQuery(msql);
int id = -1;
if (rset.first()) {
id = rset.getInt(1);
}

// int uid,String tel,String adds,String email,String sex 保存在user_info表
String sql2 = "insert into user_info values(" + id + ",'"
+ user.getUserInfo().getTel() + "','"
+ user.getUserInfo().getAdds() + "','"
+ user.getUserInfo().getEmail() + "','"
+ user.getUserInfo().getSex() + "')";
sta.executeUpdate(sql2);
}

public static void insertUser2(Connection conn, User user)
throws SQLException {
// int id,String name,String password 保存在user 表
String sql1 = "insert into user values(null,?,?)";
// 检索出之前插入的用户的id,作为子表中外键的值.
String msql = "select id from user where name = ? and password = ?";
// int uid,String tel,String adds,String email,String sex 保存在user_info表
String sql2 = "insert into user_info values(?,?,?,?,?)";

// PreparedStatement 表示预编译的 SQL 语句的对象。
PreparedStatement psta1 = conn.prepareStatement(sql1);
// 设置预编译SQL的参数.
psta1.setString(1, user.getName());
psta1.setString(2, user.getPassword());
// 执行
psta1.executeUpdate();

PreparedStatement psta2 = conn.prepareStatement(msql);
psta2.setString(1, user.getName());
psta2.setString(2, user.getPassword());
ResultSet rset = psta2.executeQuery();
int id = -1;
if (rset.first()) {
id = rset.getInt(1);
}

PreparedStatement psta3 = conn.prepareStatement(sql2);
psta3.setInt(1, id);
psta3.setString(2, user.getUserInfo().getTel());
psta3.setString(3, user.getUserInfo().getAdds());
psta3.setString(4, user.getUserInfo().getEmail());
psta3.setString(5, user.getUserInfo().getSex());
psta3.executeUpdate();
}
}
viii. 元数据;
数据库元数据
结果集元数据
ix. 结果集的使用;


x. 连接池;
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics