JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。
在Windows的IDEA工程里连接虚拟机里的MySQL.
一、进行查询操作
class App:
package cn.kb10.jdbc;
import java.sql.*;
public class App
{
public static void main( String[] args ) throws Exception {
//驱动
final String DRIVER = "com.mysql.jdbc.Driver";
//连接字符串(用jdbc连接MySQL服务、mysql默认端口号3306、)
final String URL = "jdbc:mysql://192.168.95.138:3306/kb06mysqltestdb?useUnicode=true&characterEncoding=utf8&useSSL=true";
//如不写这一行,可以运行,但会报警告。Unicode:编码;characterEncoding:字符集; SSL:安全连接
//账号密码
final String USERNAME = "root";
final String PASSWORD = "javakb10";
//注册驱动
Class.forName(DRIVER);
//连接数据库
Connection con = DriverManager.getConnection(URL,USERNAME,PASSWORD);
//创建sql指令
String sql = "select* from class";
//创建执行对象(这条命令执行到数据库里,需要一个执行对象。执行对象是挂在连接上带过去的con)
Statement sta = con.createStatement();
//执行SQL查询指令返回结果集(带着数据库查询的集合回来的)
ResultSet rst = sta.executeQuery(sql);
//********************************
//通过结果集获取列数(可以通过实际查询得到的结果集,去解析表结构,再通过表结构,去解析它的对应结构信息)
ResultSetMetaData md = rst.getMetaData();
// int columnCount = md.getColumnCount(); columnCount:列数(列的编号从1开始)
// for (int i = 1; i <columnCount ; i++) {
// System.out.println(md.getCatalogName(i)); 库名
// System.out.println(md.getTableName(i)); 表名
// System.out.println(md.getColumnClassName(i)); 数据库里面的这一列对应的java类型
// System.out.println(md.getColumnDisplaySize(i)); 最大长度(展示长度)
// System.out.println(md.getColumnLabel(i)); 别名
// System.out.println(md.getColumnName(1)); 数据库表中原本的名称
// System.out.println(md.getColumnType(i)); java.sql.Types
//
// }
//提取结果集中的数据信息(有点像迭代器、)
while(rst.next()){
for(int i = 1; i<=md.getColumnCount() ; i++){
System.out.print(rst.getString(i)+"\t");
}
System.out.println();
}
//先开的先释放
rst.close();
sta.close();
con.close();
}
}
二、进行增删改操作
class BaseDao
package cn.kb10.jdbc;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//被调用的属性
public class BaseDao {
private String driver;
private String url;
private String username;
private String password;
//BaseDao的构造方法为了加载驱动Class.forName(driver)、
public BaseDao(String driver, String url, String username, String password)
throws ClassNotFoundException {
this.driver = driver;
Class.forName(driver);
this.url = url;
this.username = username;
this.password = password;
}
//获取连接对象
private Connection getCon() throws SQLException {
return DriverManager.getConnection(url,username,password);
}
//PreparedStatement预编译执行器(是executeQuery普通执行器的升级版,普通执行器里有sql注入的本身风险。PreparedStatement传进来来的只能是参数,当成字符串来看待)
//创建执行对象要有连接对象Connection con,因为要松耦合,所提创建Connection con
//Object...params:因参数类型数量未知,所以用可以向下兼容的Object的动态参数
private PreparedStatement getPst(Connection con,String sql,Object...params) throws SQLException {
PreparedStatement pst = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
//setObject的第一个参数parameterIndex就是参数的位置从1开始的,i从0开始的,所以是i+1
//setObject的第二个参数是参数的值,值在数组里,数组的下标从0开始的,所以是params[i]
pst.setObject(i+1,params[i]);
}
return pst;
}
private void close(AutoCloseable...acs) {
for (AutoCloseable ac : acs) {
if(null != ac){
try {
ac.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public int exeNonQuery(String sql,Object...params){
Connection con = null;
PreparedStatement pst = null;
try {
con = getCon();
pst = getPst(con,sql,params);
return pst.executeUpdate();
} catch (SQLException e) {
return -1;
}finally {
close(pst,con);
}
}
public List<List<String>> exeQuery(String sql,Object...params){
Connection con = null;
PreparedStatement pst = null;
ResultSet rst = null;
try{
con = getCon();
pst = getPst(con,sql,params);
rst = pst.executeQuery();
final int COL_COUNT = rst.getMetaData().getColumnCount();
List<List<String>> result = new ArrayList<>();
while(rst.next()){
List<String> row = new ArrayList<>(COL_COUNT);
for (int i = 1; i <COL_COUNT ; i++) {
row.add(rst.getString(i));
}
result.add(row);
}
return result;
}catch(Exception e){
return null;
}finally {
close(rst,pst,con);
}
}
}
class AppTest
public class AppTest
{
/**
* Rigorous Test :-)
*/
@Test
public void shouldAnswerWithTrue()
{
assertTrue( true );
}
@Test
public void seal() throws ClassNotFoundException {
//驱动
final String DRIVER = "com.mysql.jdbc.Driver";
//连接字符串
final String URL = "jdbc:mysql://192.168.95.138:3306/kb06mysqltestdb?useUnicode=true&characterEncoding=utf8&useSSL=true";
//账号密码
final String USERNAME = "root";
final String PASSWORD = "javakb10";
BaseDao dao = new BaseDao(DRIVER,URL,USERNAME,PASSWORD);
//非查询操作(增、删、改)
String sql ="";
System.out.println(dao.exeNonQuery(sql));
//查询操作
// String sql = "select * from class";
// List<List<String>> rows = dao.exeQuery(sql);
// for (List<String> item : rows) {
// System.out.println(item+"\t");
// }
// System.out.println();
}
@Test
public void jdbcReflect() throws Exception{
BaseDao2 dao = new BaseDao2();
String sql = "select sid id, sname name, gender,class_id classId from student";
List<Student> stus = dao.exeQuery(Student.class, sql);
for (Student stu : stus) {
System.out.println(stu);
}
}
}