JDBC学习笔记(1)

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);
	}
}






猜你喜欢

转载自blog.csdn.net/qq_38826019/article/details/81054360
今日推荐