JDBC
java数据库连接技术
是java提供的一组连接各种数据库的通用api(接口)
具体是由各数据库的厂商实现的
驱动jar包就是实现jdbcapi的一组实现类
常用接口:
1.connection
与特定数据库的连接,执行sql语句并在连接的上下文中返回结果
2.statement
用于执行静态sql语句并返回其生成的结果的对象
3.preparestatement
表示预编译的sql语句的对象
4.callablestatement
用于执行sql存储过程的界面
5.resultset
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成
连接数据库
1.连接oracle数据库
首先找到oracle的驱动,在oracle安装目录下找到jdbc
下的lib下的ojdbc6.jar
复制到新建的lib文件夹下,右键build path
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import oracle.jdbc.driver.OracleDriver;
public class ConnectOracle {
public static void main(String[] args) throws SQLException {
/*连接方法1(不常用,但易于理解)
* Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@//localhost:1521/ORCL";
String user="scott";
String password="123";
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
*/
//连接方法2,用反射来实现(常用)
OracleDriver driver=new OracleDriver();
Properties pro=new Properties();
pro.put("user", "scott");
pro.put("password", "123");
Connection conn=driver.connect("jdbc:oracle:thin:@//localhost:1521/ORCL", pro);
System.out.println(conn);
//执行mysql命令获取执行结果
//添加一个员工
String sql="insert into emp values(9990,'xiaoming','CLERK',7782,SYSDATE,3000,NULL,10)";
//由连接对象去创建用于执行sql语句的statement
Statement smt=conn.createStatement();
//statement有一系列的execute方法,execute返回布尔类型,true表示有查询结果
//executeBatch返回int类型的数组,用于批量执行多条sql语句
//executeUpdate返回int,表示受影响的行数,专用于执行insert delete update语句
//executeQuery返回resultSet结果集,专用于执行select语句
int ret=smt.executeUpdate(sql);
if(ret>0)
{
System.out.println("添加成功");
}
smt.close();
conn.close();
}
}
2.连接mysql数据库
下载对应版本的驱动,如mysql-connector-java-8.0.13.jar
同样添加到lib下,build path
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Driver;
public class ConnectMysql {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/ljj?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL";
String user="root";
String password="123";
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
}
}
oracle数据库中的查询
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;
import java.util.Scanner;
public class ExcuteSelect {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@//localhost:1521/ORCL";
String user="scott";
String password="123";
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
//查询某个职位的所有员工的工号,姓名,职位,工资,入职日期
Scanner input=new Scanner(System.in);
String sql="select empno,ename,job,sal,hiredate from emp where job='"+input.next()+"'";
//执行sql语句
Statement smt=conn.createStatement();
//读取结果,ResultSet结果集相当于游标
ResultSet rs=smt.executeQuery(sql);
//next方法跟游标中的notfound类似,若返回true,就表示下一行是有数据的,并且读完一行后自动移动到下一行
while(rs.next())
{
int empno=rs.getInt("empno");
String ename=rs.getString("ename");
String job=rs.getString("job");
Date hiredate=rs.getDate("hiredate");
double sal=rs.getDouble("sal");
System.out.println(empno+"\t"+ename+"\t"+job+"\t"+hiredate+"\t"+sal);
}
smt.close();
conn.close();
}
}
oracle数据库实现登录功能
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
public class Conn {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url="jdbc:oracle:thin:@//localhost:1521/ORCL";
String user="scott";
String password="123";
Connection conn=DriverManager.getConnection(url,user,password);
System.out.println(conn);
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
String uname=input.nextLine();
System.out.println("请输入密码:");
String upwd=input.nextLine();
// 不使用预编译
// String sql="select * from user_info where uname='"+uname+"' and upwd='"+upwd+"'";
// Statement smt=conn.createStatement();
// ResultSet rs=smt.executeQuery(sql);
// boolean flag=rs.next();
// rs.close();
// smt.close();
// conn.close();
// if(flag)
// {
// System.out.println("登录成功");
// }
// else
// {
// System.out.println("用户名或密码错误");
//
// }
//使用预编译 执行效率提升 更加安全 防止sql注入
String sql="select * from user_info where uname=? and upwd=?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, uname);
ps.setString(2, upwd);
ResultSet rs=ps.executeQuery();
boolean flag=rs.next();
rs.close();
conn.close();
if(flag)
{
System.out.println("登录成功");
}
else
{
System.out.println("用户名或密码错误");
}
}
}
oracle数据库批处理
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import oracle.jdbc.driver.OracleDriver;
public class AddSal {
public static void main(String[] args) throws Exception {
OracleDriver driver=new OracleDriver();
Properties pro=new Properties();
pro.put("user", "scott");
pro.put("password", "123");
Connection conn=driver.connect("jdbc:oracle:thin:@//localhost:1521/ORCL", pro);
//使用批处理给每某些员工工资加100
String sql="update emp set sal=sal+100 where empno=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 7788);
//添加批处理
ps.addBatch();
ps.setInt(1, 7369);
ps.addBatch();
ps.setInt(1, 7782);
ps.addBatch();
//把三条语句一起执行
ps.executeBatch();
System.out.println("修改成功");
ps.close();
conn.close();
}
}