1.学习并实现了通过JDBC的数据库连接。
2.学习并实现了通过JDBC创建数据库创建表。
3.学习并实现了通过JDBC对数据库进行增删改查。
4.初步完成了任务:
(1)创建了两张表(persion, parent)并用外连接等连接方式进行连接操作。
(2)向表persion中插入十条数据。
(3)检索出persion表中的数据并打印。
方法executeQuery
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。
这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。
方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,
例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是
修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,
指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,
executeUpdate 的返回值总为零。
使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL
(数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,
要用 executeUpdate 方法来执行。你也可以从它的名字里看出,
方法 executeUpdate 也被用于执行更新表 SQL 语句。
实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,
因为表只需要创建一次,但经常被更新。
方法execute:
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
import java.sql.*;
public class JdbcPerTran {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/samp_db?serverTimezone=GMT";
// Database credentials
static final String USER = "root";
static final String PASS = "zyl123";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.cj.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to a selected database...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
//conn = getConn();
System.out.println("Connected database successfully...");
//STEP 4: Execute a query
System.out.println("Creating table in given database...");
stmt = conn.createStatement();
String sql = "CREATE TABLE person " +
"(id INTEGER not NULL, " +
" name VARCHAR(255), " +
" pid VARCHAR(255), " +
" createtime VARCHAR(255), " +
" PRIMARY KEY ( id ))";
String sql2 = "CREATE TABLE person2 " +
"(id INTEGER not NULL, " +
" name VARCHAR(255), " +
" pid VARCHAR(255), " +
" createtime VARCHAR(255), " +
" PRIMARY KEY ( id ))";
String sql3 = "Select * from person a left outer join person2 b on a.pid = b.id";
stmt.executeUpdate(sql);
stmt.executeUpdate(sql2);
//先对两个表进行插入并查看
System.out.println("Inserting table in given database...");
System.out.println("*********************************");
JdbcPerTran.insert(conn, new Test627("1","Ach", "1", "14"));
JdbcPerTran.insert(conn, new Test627("2","Bch", "2", "15"));
JdbcPerTran.insert(conn, new Test627("3","Cch", "3", "16"));
JdbcPerTran.insert(conn, new Test627("4","Dch", "4", "17"));
JdbcPerTran.insert(conn, new Test627("5","Ech", "5", "19"));
//表二
JdbcPerTran.insertP(conn, new Test627("1","Fch", "1", "17"));
JdbcPerTran.insertP(conn, new Test627("2","Gch", "2", "19"));
System.out.println("Inserted");
JdbcPerTran.getAll();
//进行外连接然后查看
System.out.println("Created table in given database...");
stmt.executeQuery(sql3);
System.out.println("外连接");
JdbcPerTran.getAllP();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
conn.close();
}catch(SQLException se){
}// do nothing
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
private static Connection getConn() {
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/samp_db?serverTimezone=GMT";
String username = "root";
String password = "zyl123";
Connection conn = null;
try {
Class.forName(driver); //classLoader,加载对应驱动
conn = (Connection) DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
private static int insert(Connection conn, Test627 test627) throws SQLException {
//Connection conn = getConn();
int i = 0;
String sql = "insert into person (id,name,pid,createtime) values(?,?,?,?)";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, test627.getId());
pstmt.setString(2, test627.getName());
pstmt.setString(3, test627.getPid());
pstmt.setString(4, test627.getCreate());
i = pstmt.executeUpdate();
//pstmt.close();
//conn.close();
} catch (SQLException e) {
throw e;
} finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return i;
}
private static int insertP(Connection conn, Test627 test627) throws SQLException {
//Connection conn = getConn();
int i = 0;
String sql = "insert into person2 (id,name,pid,createtime) values(?,?,?,?)";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, test627.getId());
pstmt.setString(2, test627.getName());
pstmt.setString(3, test627.getPid());
pstmt.setString(4, test627.getCreate());
i = pstmt.executeUpdate();
//pstmt.close();
//conn.close();
} catch (SQLException e) {
throw e;
} finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return i;
}
static class Test627 {
//id,name,pid,createtime
private String id;
private String name;
private String pid;
private String createtime;
Test627(String id, String name, String pid, String createtime) {
this.id = id; //default
this.name = name;
this.pid = pid;
this.createtime = createtime;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getCreate() {
return createtime;
}
public void setCreate(String createtime) {
this.createtime = createtime;
}
}
//select
private static Integer getAll() {
Connection conn = getConn();
String sql = "select * from person";
//String sql = "SELECT * from person LEFT OUTER JOIN person2 ON person.pid = person2.id; ";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement)conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int col = rs.getMetaData().getColumnCount();
System.out.println("=====================================================================");
while (rs.next()) {
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");
if ((i == 2) && (rs.getString(i).length() < 8)) {
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("=====================================================================");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
private static Integer getAllP() {
Connection conn = getConn();
//String sql = "select * from person";
String sql = "SELECT * from person LEFT OUTER JOIN person2 ON person.pid = person2.id; ";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement)conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int col = rs.getMetaData().getColumnCount();
System.out.println("=====================================================================");
while (rs.next()) {
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");
if ((i == 2) && (rs.getString(i).length() < 8)) {
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("=====================================================================");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}//end JDBCExample
内连接:
内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
内连接的语法如下:
select fieldlist from table1 [inner] join table2 on table1.column=table2.column
外连接:左连接,右连接,全连接
左连接:
left join是以左表的记录为基础的,示例中person可以看成左表,person2可以看成右表,它的结果集是1表中的数据,再加上1和2表匹配的数据。换句话说,左表(person)的记录将会全部表示出来,而右表(person2)只会显示符合搜索条件的记录。2表记录不足的地方均为NULL。
Select * from person a left outer join person2 b on a.pid = b.id
右连接:
和left join的结果刚好相反,是以右表为基础的, 显示右表的所有记录,在加上person1和person2匹配的结果。person表不足的地方用NULL填充.
Select * from person a right outer join person2 b on a.pid = b.id
全连接:
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充
select * from parent a full join son b on a.pid = b.pid;
mysql中不支持全连接
但可以通过如下方式解决:
Select * from person a left outer join person2 b on a.pid = b.id
union
Select * from person a right outer join person2 b on a.pid = b.id