JDBC基础知识
建立数据库 建立几个表:
使用JDBC连接数据库的步骤
1,导入驱动包
mysql-connector-java-5.1.13.jar
2,加载驱动
Class.forName("com.mysql.jdbc.Driver");
3,通过驱动管理器得到数据库连接对象
得到数据库连接之前,我们需要知道数据库的网络
地址,登陆账号,密码。
String url="jdbc:mysql://127.0.0.1:3306/test";
String user="root";
String password="root";
Connection conn=DriverManager.getConnection(url,user,password);
4, 得到数据库连接后就可以发送sql命令进行增删改查的操作,这个时
候需要得到Statement对象来实现这些功能
Statement stmt=conn.createStatement();
5,通过调用Statement的executeUpdate方法来实现增加,删
除,修改的功能,首先我们实现插入功能。
String sql="insert into
grade(gradename,createdate,course_teacher,teacher)
values('423脱产班','2013-05-27 21:45:31','afei',‘lsp')";
int count=stmt.executeUpdate(sql);
注意:executeUpdate方法返回受影响行数;
在插入日期数据时,可以传入标准的19位日期字符串;
6,关闭statement(sql执行对象) 和Connection(数据库
连接对象)
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
删除操作
Stringsql="delete from grade where toid= 19 ";
intcount=stmt.executeUpdate(sql);
修改操作
String sql="update grade set gradename = '0423脱产班' wheretoid='18' ";
stmt.executeUpdate(sql);
查询操作
在得到了Statement对象后,调用其executeQuery方法即可发送查询语句
ResultSet rs=stmt.executeQuery(sql);
此方法会返回结果集对象,它包含了你所查询的所有结果,通过它我们可以得到每条数据
ResultSet对象的next()方法会返回布尔型来表示是否有下一行数据,并且把结果集向前移动一行
while(rs.next()){
int toid=rs.getInt(1);
Stringgradename=rs.getString(2);
System.out.println(toid+""+gradename+" "+createdate+" "+course_teacher+""+teacher);
}
从下标1开始取值,并且你将要取得的数据类型要和
数据表中的数据类型一致,比如第一列数据在数据表中
是int型的,也得用getInt()型来接收。
需要依次关闭ResultSet, Statement, Connection
注意:下标从1开始并且不要越界
ResultSet详细讲解
1,ResultSet是查询后返回的结果集,在ResuultSet内
部有类似指针的结构,在第一次调用next()方法之
前,会把指针指向第一行之前。每次通过循环调用
next()方法,就会把指针往下移动一行。
2,数据表中是什么类型,就用ResultSet的 “get类型”
方法
3,ResultSet对象的"get类型"方法参数可以有两种:
索引和字段名
rs.getString(2)
rs.getString("username")
使用statement增删改查的完整代码
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.text.SimpleDateFormat;
import java.util.Date;
public classTestMain {
public static void main(String[] args) {
//delete();
//update();
select();
}
public static void insert() {
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
// 当驱动包导入失败(或者没导入),就会出现这个异常
System.out.println("数据库驱动加载失败");
}
// 连接mysql的语句,加上characterEncoding是为了避免出现乱码
String url ="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8";
String user = "root";
String password = "root";
Connection conn = null;
Statement stmt = null;
try {
// 通过驱动管理器得到数据库的连接对象
conn =DriverManager.getConnection(url, user, password);
// 通过连接对象创建statement对象(sql的执行对象)
stmt = conn.createStatement();
Date date = new Date();
// String x="ab'"+date+"' c";
SimpleDateFormatsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String mytime = "2013-05-2815:59:29";
// Stringmytime=sdf.format(date);
String sql = "insert into grade(gradename,createdate,course_teacher,master_teacher)values('423脱产班','"+ mytime + "','afei','sara') ";
// 最终执行sql语句的
stmt.executeUpdate(sql);
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
try {
// 关闭执行对象stmt
if (stmt != null) {
stmt.close();
}
// 关闭数据库连接对象conn
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void delete(){
try { Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("数据库驱动加载失败");
}
Stringurl="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8";
String user="root";
String password="root";
Connection conn=null;
Statement stmt=null;
try {
conn=DriverManager.getConnection(url,user,password);
stmt=conn.createStatement();
stmt.executeUpdate(" delete from gradewhere toid='4' ");
}catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}finally{
try {
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void update(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundExceptione) {
throw newRuntimeException("你的驱动包导入错误或者没有导入");
}
Stringurl="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8";
String user="root";
Stringpassword="root";
Connection conn=null;
Statement stmt=null;
try {
conn=DriverManager.getConnection(url,user, password);
stmt=conn.createStatement();
int count=stmt.executeUpdate(" updategrade set gradename='0423脱产班',course_teacher='amao' wheretoid='5' ");
System.out.println("受影响行数"+count);
} catch (SQLException e) {
e.printStackTrace();
}finally{
try{
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException ex){
ex.printStackTrace();
}
}
}
public static void select(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
String url="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8";
String user="root";
String password="root";
try {
conn=DriverManager.getConnection(url, user,password);
stmt=conn.createStatement();
//得到结果集对象,里面包含了所查询的所有数据
rs=stmt.executeQuery("select * from grade ");
while(rs.next()){
int toid=rs.getInt(1);
Stringgradename=rs.getString(2);
Date date=rs.getDate(3);
Stringcourse_teacher=rs.getString(4);
String master_teacher=rs.getString(5);
System.out.println(toid+""+gradename+" "+date+" "+course_teacher+""+master_teacher);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try{
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException ex){
ex.printStackTrace();
}
}
}
}
使用PreparedStatement
1, PreparedStatement是Statement接口的子接口,
拥有后者的所有方法;
它们最大的差别 是:PreparedStatement可以使
用占位符的参数,我们在写sql的时候可以把参数
部 分用?表示,然后在后面赋值。
2 ,PreparedStatement会预编译语句,性能较好,
并且可以避免sql注入的问题(Statement不能
避免),通常我们会使用PreparedStatement来
代替Statement。而Statement需要写完整整个
sql语句。
插入操作:
PreparedStatementps= conn.prepareStatement(sql);
ps.setString(1,"423脱产班");
ps.setString(2,"2013-05-2911:17:33");
ps.setString(3,"afei");
ps.setString(4,"sara");
最后一步执行:
ps.executeUpdate()
查询操作:
String sql="select * from grade where course_teacher = ? ";
ps=conn.prepareStatement(sql);
ps.setString(1,"afei");
rs=ps.executeQuery();
使用preparestatement增查完整代码
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
import java.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Timestamp;
importjava.util.Date;
public classTestMain {
public static void main(String[] args) {
//insert();
select();
}
public static void insert() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
PreparedStatement ps = null;
try {
conn =DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8","root","root");
String sql ="insert into grade(gradename,createdate,course_teacher,master_teacher)values(?,?,?,?) ";
//创建预处理对象
ps = conn.prepareStatement(sql);
//给每个占位符赋值
ps.setString(1, "1001脱产班");
Date date = new Date();
//ps.setDate(2, newjava.sql.Date(date.getTime()));
ps.setString(2,"2013-05-2917:56:39");
ps.setString(3,"afei");
ps.setString(4,"saras");
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try{
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
}catch(SQLException ex){
ex.printStackTrace();
}
}
}
public static void select(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs=null;
try { conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8","root","root");
Stringsql="select * from grade where course_teacher=? and master_teacher=?";
ps=conn.prepareStatement(sql);
ps.setString(1,"afeis");
ps.setString(2,"1=1");
rs=ps.executeQuery();
while(rs.next()){
int toid=rs.getInt(1);
String gradename=rs.getString(2);
Timestamp date=rs.getTimestamp(3);
String course_teacher=rs.getString(4);
String master_teacher=rs.getString(5);
System.out.println(toid+""+gradename+" "+date+" "+course_teacher+""+master_teacher);
}
} catch (SQLException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
}
批处理
有时候我们在实现一个功能时,需要同时执行多条sql语句,这个时候假如每次去单独执行sql语句,就会损耗性能,Statement和PreparedStatement这两个接口就提供了批处理的功能,批处理语句只能是insert,delete,update语句。
Statement的批处理
通过addBatch方法加入一条sql语句
String sql1 =" insert into
grade(gradename,createdate,course_teacher,master_teacher)values('423脱产班',null,'afei','sara') ";
stmt.addBatch(sql1);
String sql2 =" insert into grade(gradename,createdate,course_teacher,master_teacher)values('405脱产班',null,'afei1','sara1') ";
stmt.addBatch(sql2);
String sql3 =" insert into student(stuname,age,telphone,address,gradeid)
values('stu1',18,'13476990909','上海张江','20') ";
stmt.addBatch(sql3);
加完需要执行的sql语句之后,一次性执行
stmt.executeBatch();
PreparedStatement的批处理
String sql = "insert into grade(gradename,createdate,course_teacher,master_teacher)values(?,?,?,?) ";
ps= conn.prepareStatement(sql);
多次加入参数,如下:
加入第一行
ps.setString(1,"423脱产班");
ps.setDate(2,null);
ps.setString(3,"afei");
ps.setString(4,"sara");
ps.addBatch();
statement的批处理
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
importjava.sql.Statement;
public classStatementBatch {
/**
*@param args
*/
public static void main(String[] args) {
statementBatchTest();
}
public static void statementBatchTest() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Stringurl="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8";
String user="root";
String password="root";
Connection conn=null;
Statement stmt=null;
try {
conn=DriverManager.getConnection(url,user,password);
stmt=conn.createStatement();
Stringsql1="insert into student(stuname,age,telphone,address,gradeid)values('afei1','25','19089898989','上海','47')";
//把第一条语句放入批处理
stmt.addBatch(sql1);
String sql2="update student set age='100'where gradeid='48' ";
//把第二条语句放入批处理
stmt.addBatch(sql2);
String sql3=" delete from student ";
//把第二条语句放入批处理
stmt.addBatch(sql3);
//最终执行批处理
int[] counts=stmt.executeBatch();
for(int i=0;i<counts.length;i++){
System.out.println("第"+(i+1)+"句sql,影响了"+counts[i]+"行");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try{
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException ex){
ex.printStackTrace();
}
}
}
}
preparestatement的批处理
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.PreparedStatement;
importjava.sql.SQLException;
public class PreparedStatementBatch{
public static void main(String[] args) {
preparedStatementTest();
}
public static voidpreparedStatementTest(){
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Stringurl="jdbc:mysql://127.0.0.1:3306/school?characterEncoding=utf8";
String user="root";
String password="root";
Connection conn=null;
PreparedStatement ps=null;
try {
conn=DriverManager.getConnection(url,user, password);
String sql=" insertinto student(stuname,age,telphone,address,gradeid) values(?,?,?,?,?) ";
ps=conn.prepareStatement(sql);
//加入第一次参数
ps.setString(1,"angel1");
ps.setInt(2,34);
ps.setString(3,"190876655");
ps.setString(4,"上海");
ps.setInt(5,48);
ps.addBatch();
//加入第二次参数
ps.setString(1,"angel2");
ps.setInt(2,35);
ps.setString(3,"19087fdfd6655");
ps.setString(4,"上海2");
ps.setInt(5,48);
ps.addBatch();
//加入第三次参数
ps.setString(1,"angel4");
ps.setInt(2,39);
ps.setString(3,"fdfdfd");
ps.setString(4,"上海9");
ps.setInt(5,48);
ps.addBatch();
//最终执行批处理语句
ps.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}