JDBC
JDBC是java用于统一连接数据库并操作数据库的一组通用接口。
定义:它是来凝结数据库的规范。不同的数据库厂商若想让java语言可以对其操作,就需要实现一组类,这组类需要实现java提供的这组用于连接数据库的接口,并实现其中定义的相关方法。那么数据库厂商实现的一组类,就是该数据库的驱动包了。我们要想使用java连接某种数据库,需要两部分。
1:使用JDBC连接数据库
2:提供对还数据库的驱动包
连接数据库并操作的步骤:1:打开与数据库的链接
2:执行SQL语句
3:得到结果
连接数据库时常见的错误:报错:ClassNotFoundException
两种情况:
1:驱动包没有导入
2:Class.forName()中的字符串拼写有误
报错:port number
连接数据库时输入数据库路径时没有添加端口号
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* java连接数据库
* JDBC
* @author Administrator
*
*/
public class TestJDBC {
public static void main(String[] args) {
/*
* 连接数据库一定要捕获异常
*/
Connection conn = null;//定义在try外面是用于在finally中关闭它
try{
/**
* 与数据库进行连接
* 分为两步:
* 1:注册驱动:不同的数据库实现不尽相同,所以要使用不同数据库厂商
* 提供的驱动。
* 2:指定数据库位置以及用户名和密码进行连接
*/
//1 提供驱动包路径
/*
*连接不同数据库,传入的字符串不尽相同,但是目的相同,注册驱动
*/
Class.forName("oracle.jdbc.driver.OracleDriver");
//2 根据路径,用户名,密码连接数据库
/*
* 路径:不同数据库连接的路径写法不尽相同
* jdbc:oracle:thin:@HOST:DB_NAME
*/
//java.sql.Connection 代表数据库的链接
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.26:1521:tarena"
,"name"
,"passward");
/**
* 使用Sql语句来操作数据库
* 若想执行sql语句,我们需要使用一个专门处理sql语句的类,这个
* 类叫做Statement
*/
//java.sql.Statement 用于执行Sql语句的类。
Statement state = conn.createStatement();
/**
* user_tables是Oracle用于存储当前用户创建的所有表的信息
* 其中一个字段叫做table_name用户保存表名
* 良好的编码习惯:
* sql中的关键字使用纯大写字母
* 其余内容使用小写
*/
String sql = "SELECT table_name FROM user_tables";
//通过statement执行查询语句
/*
* 当查询完毕后,数据库会将查询结果返回,Statement会将查询结果
* 存储到ResultSet中,ResultSet是结果集,很像一个集合
* ResultSet特点:
* 按行遍历,按字段取值
*/
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
//按字段取值
/*
* 整数参数:结果集的第一列
* 注意,这里从1开始,和java对索引的习惯不同
*/
String tableName = rs.getString(1);
System.out.println(tableName);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/*
* 通过jdbc创建表
*/
public class TestCreateTable {
public static void main(String[] args) {
Connection conn = null;
try{
//1 注册驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2 打开连接 import java.sql.*
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.26:1521:taren",
"Username",
"Password");
//3 创建用于执行SQL语句的Statement
Statement state = conn.createStatement();
//创建建表语句
String sql = "CREATE TABLE emp ("
+ "id varchar(36) PRIMARY KEY,"
+ "name varchar(30),"
+ "age number(2),"
+ "sex varchar(2)"
+ ")";
/**
* execute方法返回结果为true false
* 常用语执行表级操作的sql语句,如建表,删表等
* 创建表若失败实际上是会直接抛出异常的
*
* execute方法:
* false:为建表成功的标志
* execute方法原则上可以执行任意sql语句。
* 返回true:若执行结果为一个结果集(ResultSet)
* 返回false:为其他信息(如影响表数据总条数等)
* 所以我们通常不会使用execute去执行查询语句
*/
if(state.execute(sql)){
System.out.println("创建表成功");
}else{
System.out.println("创建失败");
}
}catch (Exception e){
e.printStackTrace();
}finally{
if(conn != null){
try{
conn.close();
}catch (Exception e){
}
}
}
}
}
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.UUID;
/**
* 使用jdbc向表中插入数据
* @author Administrator
*
*/
public class TestInsert {
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.26:1521:tarena",
"name",
"password");
Statement state = conn.createStatement();
/**
* UUID:对于大数据量的表来说,UUID是存放ID最好的方式
* 通用唯一标识码 Universally Unique Indentifier
* java提供了支持:
* UUID.randomUUID().toString()
* 获取一个36位不重复字符串
* oracle提供的支持:
* 函数sys_guid()
* 获取一个32位不重复字符串
*/
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
// String sql = "INSERT INTO student VALUES(' "+uuid +"','jak',22,'1')";
// oracle
String sql = "INSERT INTO student VALUES(sys_guid(),'jak',22,'1')";
/**
* executeUpdate()方法,返回值:int
* 该返回值为当前执行的sql语句影响了数据库数据的总条数
* 该方法常用语执行insert update delete语句
*/
//判断insert语句是否成功看返回值是否大于0
if(state.executeUpdate(sql)>0){
System.out.println("插入数据成功");
}
state.close();
}catch (Exception e){
e.printStackTrace();
}finally{
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
package day01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 查询Student表数据
* @author Administrator
*
*/
public class TestQueryStudent {
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.26:1521:tarena",
"name",
"password");
Statement state = conn.createStatement();
String sql = "SELECT * FROM student";
ResultSet rs = state.executeQuery(sql);
while(rs.next()){
String id = rs.getString(1);//rs.getString("name")
String name = rs.getString(2);
int age = rs.getInt(3);
String sex = rs.getString(4).equals("1")?"男":"女";
System.out.println(id+","+name+","+age+","+sex);
}
rs.close();
state.close();
}catch (Exception e){
e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
DAO
package day01pm.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import dayo1pm.entity.Student;
/**
* DAO数据连接对象
* StudentDAO用于操作数据库Student表
*
* @author Administrator
*
*/
public class StudentDAO {
/**
* 根据学生名字查询学生信息
*/
public Student findStudentByName(String name){
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.26:1521:tarena",
"name",
"password");
Statement state = conn.createStatement();
String sql = "SELECT * FROM student WHERE name ='"+name+"'";
/**
* 根据用户名查询该用户信息
* 并将这条数据转化为一个Student对象并返回
*/
ResultSet rs = state.executeQuery(sql);
if(rs.next()){
Student student = new Student();
student.setId(rs.getString("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
student.setSex(rs.getString("sex"));
return student;
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 持久化Student对象
* 将Student对象的数据保存到数据库中
*/
public boolean saveStudent(Student student){
Connection conn = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.26:1521:tarena",
"name",
"password");
Statement state = conn.createStatement();
String sql = "INSERT INTO student VALUES(" + "sys_guid()," + "'"+student.getName()+"',"+
student.getAge()+","+"'"+student.getSex()+"'"+")";
System.out.println(sql);
if(state.executeUpdate(sql)>0){
return true;
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
return false;
}
}
package dayo1pm.entity;
import java.io.Serializable;
/**
* 实体类Student
* 该类描述数据库中Student表
* 其每一个实例都可以代表Student表的一行数据
* 通常情况下实体都是可以序列化的
* @author Administrator
*
*/
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private int age;
private String sex;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex = sex;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getId(){
return id;
}
public void setId(String id){
this.id = id;
}
}
package day01.pm;
import day01pm.dao.StudentDAO;
import dayo1pm.entity.Student;
/**
* 业务逻辑类
* @author Administrator
*
*/
public class StudentService {
private StudentDAO studentDAO = new StudentDAO();
public void reg(String name,int age,String sex){
/**
* 必要的验证
* name不能为空或空字符串
* age要在1-99之间
* sex "1"或"0"
*
* name不能重复
* 网站的注册一般用户名都是不允许重复的。
*/
//该用户存在了
if(studentDAO.findStudentByName(name)!=null){
System.out.println("该用户已存在!");
}else{
/**
* 1:将用户输入的信息转化为一个Student对象
* 2:将该对象交给DAO进行持久化
* 3:根据保存结果通知用户
*/
//1
Student student = new Student();
student.setName(name);
student.setAge(age);
student.setSex(sex);
//2
if(studentDAO.saveStudent(student)){
System.out.println("注册成功!");
}else{
System.out.println("注册失败!");
}
}
}
public void findStudentByName(String name){
//对用户输入的信息进行必要的判断
if(name!=null&&!"".equals(name)){
//向DAO获取学生信息
Student student = studentDAO.findStudentByName(name);
if(student!=null){
System.out.println("学生:"+student.getName()+
"年龄:"+student.getAge());
}else{
System.out.println("查无此人!");
}
}
}
}
package day01.pm;
/**
* 测试类
* @author Administrator
*
*/
public class TestStudent {
public static void main(String[] args) {
String studentName = "jak";
int age = 16;
String sex = "1";
StudentService service = new StudentService();
// service.findStudentByName(studentName);
service.reg(studentName, age, sex);
}
}