版权声明:转载请指明出处 https://blog.csdn.net/weixin_42321963/article/details/82053187
.net
ado.net
ado
odbc
php
pdo
java
jdbc
java JDBC是什么?
Java DataBase Connectivity,java数据库连接 java 操作数据库的API
1)下载 mysql 的 jdbc驱动包 mysql.jar
https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.11.zip
mysql-connector-java-8.0.11.zip
解压 打开 mysql-connector-java-8.0.11.jar
2)eclipse 建立java项目 复制mysql-connector-java-8.0.11.jar 建立classpath
3)测试代码
package com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
public static void main(String[] args) {
try {
//加载mysql8.0.11 官方jdbc 驱动jar文件
Class.forName("com.mysql.cj.jdbc.Driver");
//建立数据库连接
String url = "jdbc:mysql://localhost:3306/db?user=root&serverTimezone=PRC&useSSL=false";
Connection conn = DriverManager.getConnection(url);
//建立预处理语句对象
PreparedStatement pst = conn.prepareStatement("select id,name,score from student");
ResultSet rs = pst.executeQuery();
while(rs.next()) {
System.out.printf("学号:%d,姓名:%s,成绩:%d分。\n",rs.getInt("id"),rs.getString("name"),rs.getInt(3));
}
rs.close();
pst.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC java API
DriverManager 驱动管理器类
Connection 接口
Statement 接口 基本语句对象,简单快速,但没有参数替换功能,不能防SQL注入,建立不使用
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select count(*) from stu");// select
double money = 2000;
int id = 201604;
String name = "李强";
String sql = "update stu set name='" + name + "', money=" + money + " where id=" + id;
System.out.println(sql);
st.executeUpdate(sql);
//st.executeUpdate("delete from stu where false");
// st.execute(sql) ddl
// st.executeUpdate(sql) insert delete update
// while(rs.next()) {
// System.out.println(rs.getString("name"));
// }
// rs.last();
// System.out.println(rs.getRow()); //返回记录总数
// System.out.println(rs.isFirst()); //false
// System.out.println(rs.isBeforeFirst());//true
// System.out.println(rs.isLast());//false
// System.out.println(rs.isAfterLast());//false
// if(rs.isBeforeFirst()) {
// System.out.println("有查询结果");
// }
// if(rs.isBeforeFirst()) {
// rs.next();
// System.out.println(rs.getInt(1));
// }
// rs.next();
// rs.next();
// rs.next();
// rs.last(); //游标调到最后
// rs.previous();//游标上移一条
// rs.absolute(3);//游标绝对定位到第三行
// rs.first();//游标移第一条
// rs.next();//游标下移一条
// 判断位置,返回boolean 类型
// rs.isAfterLast(); //判断游标是不是在最后一条记录之后
// rs.isBeforeFirst();//第一条之前
// rs.isFirst();//是不是第一条位置
// rs.isLast();//是不是后一条位置
// System.out.println(rs.getString("name"));
// System.out.println(rs.getInt("id"));
st.execute("create table tttt555(t int)");
rs.close();
PreparedStatement 接口 预处理语句对象,可以参数替换,有效防止SQL注入 执行sql语句
//String sql = "select count(*) from stu";
//PreparedStatement pst = conn.prepareStatement(sql);
//ResultSet rs = pst.executeQuery();
//rs = pst.executeQuery("select * from stu");
//if(rs.next()) {
// System.out.println(rs.getInt(1));
//}
//while(rs.next()) {
// System.out.println(rs.getString("name"));
//}
//rs.close();
//pst.close();
//String sql = "update stu set money=money+?";
//PreparedStatement pst = conn.prepareStatement(sql);
//pst.setString(1,"李四四");
//pst.setDouble(2, 6000d);
//pst.setInt(3,201607);
//pst.setDouble(1,10d);
//int r = pst.executeUpdate(); //插入或修改 或删除影响的行数
//System.out.println(r);
String sql = "insert into stu values(null,?,?,?,?,?)";//位置从1开始
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(2,99);
pst.setString(1,"赵五");
//pst.setString(3, "1985-10-20"); //对日期操作,可以当成字符串
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//Date dd = new Date(sdf.parse("1985-1-1 08:30:20").getTime());
//pst.setDate(3, dd);
//Timestamp t = new Timestamp(System.currentTimeMillis());
//pst.setTimestamp(3, t);
//setTimestamp() 时间戳
//setDate() 不包含时分秒
//pst.setTimestamp(3,new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("1985-2-3 10:20:30").getTime()));
//pst.setString(3,"1988-3-5 10:50:30");
java.util.Date ddd = new java.util.Date();
//pst.setString(3,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(ddd));
pst.setTimestamp(3,new Timestamp(ddd.getTime()));
pst.setString(5,"英语");
pst.setBigDecimal(4, new BigDecimal(5000));
System.out.println(pst.executeUpdate());
实现插入数据,取得自增id值?
localhost
root
123
3308
db
book
mysql> desc book;
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| price | decimal(6,1) | YES | | NULL | |
| pdatetime | datetime | YES | | NULL | |
| intro | text | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
package com;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
public class Demo {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3308/db?useUnicode=true&characterEncoding=utf8&useSSL=false";
String user = "root";
String password = "123";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "insert into book values(null,?,?,?,?)";
PreparedStatement pst = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);// 返回获取自增主键的方式
pst.setString(1, "《mysql实战技术》");
pst.setString(4, "这是一个SQL入门的书籍...");
pst.setBigDecimal(2, new BigDecimal(120));
pst.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
int i = pst.executeUpdate();
System.out.println(i);
System.out.println("--------------------------------------");
ResultSet rs = pst.getGeneratedKeys();
rs.next();
int kv = rs.getInt(1); // 就是返回生成主键的值
System.out.println(kv);
} catch (Exception e) {
e.printStackTrace();
}
}
}
CallableStatement 接口 操作存储过程 来调用关系数据库的存储过程
delimiter $$
create procedure sss()
begin
select id,name,ifnull(score,0) score from student order by score desc;
end $$
delimiter ;
call sss;
call sss();
delimiter $$
create procedure querybyid(in sid int,out sname varchar(30),out sscore int)
begin
select name,score into sname,sscore from student where id = sid;
end $$
delimiter ;
-- sqlyog 调用测试存储过程
call querybyid(5,@sn,@ss);
select @sn,@ss;
`information_schema`
use db;
show create database db;
select version();
select user();
show tables;
desc student;
show create table student;
show full columns from student;
DbUtil du = new DbUtil();
Connection conn = du.getConn();
//CallableStatement cst = conn.prepareCall("{call sss()}");
// CallableStatement cst = conn.prepareCall("{call sss}");
// CallableStatement cst = conn.prepareCall("call sss");
//ResultSet rs = cst.executeQuery();
//while (rs.next()) {
// System.out.printf("id=%d,name=%s,score=%d \n", rs.getInt(1), rs.getString("name"), rs.getInt("score"));
//}
//rs.close();
//cst.close();
CallableStatement cst = conn.prepareCall("{call querybyid(?,?,?)}");
cst.setInt(1, 5);
cst.registerOutParameter(2, Types.VARCHAR);// 注册输入参数位置及类型
cst.registerOutParameter(3, Types.INTEGER);
cst.execute();
/*
* 建立存储sql代码
* delimiter $$ create procedure querybyid(in sid int,out sname varchar(30),out
* sscore int) begin select name,score into sname,sscore from student where id =
* sid; end $$ delimiter ;
*/
String name = cst.getString("sname"); // 过程 out参数名称
System.out.println(name);
int score = cst.getInt("sscore");
System.out.println(score);
System.out.println(cst.getString(2));// 第二个? 调用 {call querybyid(?,?,?)} 第一个? 是in
System.out.println(cst.getInt(3));// 第三个?
conn.close();
DatabaseMetaData
DbUtil du = new DbUtil();
Connection conn = du.getConn();
DatabaseMetaData dbmd = conn.getMetaData();
System.out.println(dbmd.getDatabaseProductName());
System.out.println(dbmd.getDatabaseProductVersion());
System.out.println(dbmd.getDriverName());
System.out.println(dbmd.getDriverVersion());
System.out.println(dbmd.getURL());
System.out.println(dbmd.getUserName()); // root@localhost
System.out.println(dbmd.getDriverMajorVersion());// 8
System.out.println(dbmd.getDriverMinorVersion());// 0
// 取得数据库中的表名
//ResultSet rs = conn.prepareStatement("show tables").executeQuery();
//while (rs.next()) {
// System.out.println(rs.getString(1));
//System.out.println(rs.getString("tables_in_db"));
//}
//show create database db;
//select version();
//select user();
//show tables;
//desc student;
//show create table student;
//show full columns from student;
//取得数据库db中的所有
ResultSet rs = dbmd.getTables("db", "",null,null);
while(rs.next()) {
String tn = rs.getString(3);//表名
System.out.println("表名:"+tn);
//取得主键
ResultSet rk = dbmd.getPrimaryKeys(null,"",tn);
if(rk.next()) {
System.out.println("主键="+rk.getString(4));
}
//取得表结构字段名称
ResultSet rt = dbmd.getColumns(null, "", tn, null);
while(rt.next()) {
System.out.println("\t 字段:"+rt.getString(4));
}
}
ResultSet 接口 处理结果集(查询结果) 处理查询的结果集
ResultSetMetaData
public static void main(String[] args) throws SQLException {
DbUtil du = new DbUtil();
Connection conn = du.getConn();
PreparedStatement pst = conn.prepareStatement("select id sid,name sname,score from student");
ResultSet rs = pst.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println(rsmd.getColumnCount());
rs.next();
System.out.println(rs.getString("sid"));
System.out.println(rs.getString(1));
for(int i=1;i<=rsmd.getColumnCount();i++) {
System.out.println(rsmd.getColumnLabel(i));//查询语句时的别名
System.out.println(rsmd.getColumnName(i)); //列名,表中的字段名称
System.out.println(rsmd.getColumnDisplaySize(i));
System.out.println(rsmd.getColumnTypeName(i));
}
//Types.VARCHAR 12
//Types.INTEGER 4
//Types.TINYINT -6
}
Class.forName("");
DriverManager.getConnection(url,user,password);
Connection
DatabaseMetaData
Statement
PrepareStatement
CallableStatement
ResultSet
ResultSetMetaData
实现功能:
1)批量语句执行
DbUtil du = new DbUtil();
Connection conn = du.getConn();
Statement stmt = conn.createStatement();
BufferedReader br = new BufferedReader(new FileReader("c:/dddd.sql"));
StringBuilder ss = new StringBuilder();
while (br.ready()) {
String temp = br.readLine();
ss.append(temp);
}
String[] sqls = ss.toString().split(";");
for (String sql : sqls) {
stmt.addBatch(sql);
//System.out.println(sql);
}
stmt.executeBatch();
stmt.close();
br.close();
conn.close();
2)数据分页
DbUtil du = new DbUtil();
Connection conn = du.getConn();
// 先统计总数
String sql = "select count(*) from stu where 1=1";
PreparedStatement pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
rs.next();
int recordcount = rs.getInt(1);// 总记录数
int pagesize = 5;// 每页多少条
int pagecount = recordcount % pagesize == 0 ? recordcount / pagesize : recordcount / pagesize + 1;//总页数
int currpage = 3;// 显示第几页
if(currpage<1) currpage = 1;
if(currpage>pagecount) currpage= pagecount;
System.out.printf("[第%d页/共%d页][每页%d条,共%d条]",currpage,pagecount,pagesize,recordcount);
System.out.println();
sql = "select id,name,score from stu limit ?,?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, currpage * pagesize - pagesize);
ps.setInt(2, pagesize);
rs = ps.executeQuery();
while (rs.next()) {
System.out.printf("id=%d,name=%s,score=%d\r\n", rs.getInt(1), rs.getString("name"), rs.getInt(3));
}
rs.close();
pst.close();
ps.close();
select * from student limit m,n;
select * from student limit m,n;
select * from student limit m,n;