JDBC02

Java数据库操作实战

复习

package day02;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/**
 * 根据员工的编号查询领导的个人编号和工资
 * @author 臻冉
 *
 */
public class JDBCDemo1 {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入员工编号");
			int empno = scanner.nextInt();
			//获取连接
			conn = DButilDemo.getConnection();
			Statement stat = conn.createStatement();
			String sql = "select * from emp where empno = (select mgr from emp where empno=)"+empno+"";
			ResultSet rs = stat.executeQuery(sql);
			if(rs.next()){
				int en = rs.getInt("empno");
				double sal = rs.getDouble("sal");
				System.out.println("领导编号"+en+",领导薪资:"+sal);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DButilDemo.closeConnection(conn,null);
		}
	}
}

package day02;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/*
 * 练习:根据员工编号查询领导所属的部门信息
 */
public class JDBCDemo2 {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			Scanner scanner = new Scanner(System.in);
			System.out.println("请输入员工编号");
			int empno = scanner.nextInt();
			//获取连接
			conn = DButilDemo.getConnection();
			Statement stat = conn.createStatement();
			String sql = "SELECT d.* FROM emp e JOIN dept d ON e.deptno=d.deptno WHERE e.empno=(SELECT mgr FROM emp WHERE empno="+empno+")";
			ResultSet rs = stat.executeQuery(sql);
			if(rs.next()){
				int deptno = rs.getInt("deptno");
				String dname = rs.getString("dname");
				String loc = rs.getString("loc");
				System.out.println("领导部门编号:"+deptno+",部门名称:"+dname+",住址:"+loc);
				
			} else {
				throw new RuntimeException("该用户不存在");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DButilDemo.closeConnection(conn,null);
		}
	}
}

一编写properties

db.properties

drivername=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/store_ykt
username=root
userpwd=123456
maxActive=1
maxWait=7000
二 工具类的编写步骤:
  1. 建立连接池
  2. 读取配置文件
  3. 读取加载资源
  4. 驱动
  5. 创建连接池
  6. 获取连接
  7. 归还资源(连接池中的close只是归还资源,不是将其真正关闭)
    下面属于一个工具类:用于连接数据库和释放资源
public class DButilDemo {
	//mysql驱动
	private static String driver;
	//地址
	private static String url;
	//账号
	private static String username;
	//密码
	private static String password;
	static{
		/*properties类主要用于读取Java的配置文件,不同的配置编程
		语言有自己所支持的配置文件*/
		
		try {
			//方式一
			/*preparetiese类主要用于读取Java配置文件,不同的配置编程语言有自己所支持的 */
			Properties  p = new Properties();
			//p.load(new FileInputStream("db.properties"));
			//方式二
			//读取加载的资源/文件()在本项目中获取
			p.load(DButilDemo.class.getClassLoader().getResourceAsStream("db.properties"));
			
			driver = p.getProperty("drivername");
			url = p.getProperty("url");
			username=p.getProperty("username");
			password=p.getProperty("userpwd");
			System.out.println("连接数据库初始化...");
			System.out.println(driver);
			System.out.println(url);
			System.out.println(username);
			System.out.println(password);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//获取数据库的连接
	public static Connection getConnection(){
		try {
			Class.forName(driver);
			Connection conn = DriverManager.getConnection(url, username, password);
			System.out.println("连接成功");
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("连接失败...");
		}
	}
	
	//释放资源
	public static void closeConnection(Connection conn,ResultSet rs){
		try {
			//释放资源,并不是将其真正关闭,而是归还资源
			if(conn!=null){
				conn.close();
			}
			if(rs!=null){
				rs.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		Connection conn = DButilDemo.getConnection();
		System.out.println(conn);
	}
}

工具类

/**
 * 数据库连接的管理:
 * DBCP(DataBase Connection pool)数据连接池是一个Java连接池项目,DBCP通过连接池
 * 预先通过数据库建立一个"连接"放在内存中(即连接池),应用程序需要建立数据库连接是直接从池
 * 中申请一个连接使用,用完后有连接池回收该连接,从而达到连接的复用,减少资源消耗的目的.
 * 
 * 连接池来管理Connection,这样可以重复使用Connection,有了连接池,我们就不用自己来创建Connection
 * 而是通过池来获取Connection来获取对象,当使用完Connection调用Connection的close方法也不会真的
 * 关闭Connection,而是把Connection"归还"给连接池,池就可以再次利用这个Connection对象
 * @author 臻冉
 *
 */
public class DButil {
	//连接池对象
	private  static BasicDataSource ds;
	
	static{
		try {
			//properties类主要用于读取Java配置文件,不同的
			//编程语言有自己所支持的配置文件
			Properties  p = new Properties();
			//读取加载资源/文件
			p.load(DButilDemo.class.getClassLoader().getResourceAsStream("db.properties"));
			
			//getProperty指的是获得系统变量的值
			//mysql驱动
			String driver = p.getProperty("drivername");
			//连接地址
			String url = p.getProperty("url");
			//连接数据库用户名
			String username=p.getProperty("username");
			//连接数据库密码
			String password=p.getProperty("userpwd");
			//获取最大连接
			int maxActive = Integer.parseInt(p.getProperty("maxActive"));
			//获取最大等待时间
			int maxWait = Integer.parseInt(p.getProperty("maxWait"));
			System.out.println("初始化数据库");
			System.out.println(driver);
			System.out.println(url);
			System.out.println(username);
			System.out.println(password);
			
			//创建数据库连接池
			ds=new BasicDataSource();
			//Class.forName()	设置驱动
			ds.setDriverClassName(driver);
			
			//DriverManager.getConnection(..)		设置数据库地址,用户名,密码
			ds.setUrl(url);
			ds.setUsername(username);
			ds.setPassword(password);
			
			//设置最大连接数
			ds.setMaxActive(maxActive);
			//设置最大等待时间
			ds.setMaxWait(maxWait);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//获取数据库连接
	public static Connection getConnection(){
		try {
			/*向连接池获取连接,如果连接池中没有可用连接时,该方法会阻塞当前线程.
			阻塞时间在连接池设置的maxWait阻塞,但阻塞过程中连接池有了可用连接你们则
			会返回,若超时仍然没有可有连接,该方法会抛出异常
			数据库连接池给我们提供了方法getConnection()从数据库连接池中获取连接
			*/
			Connection conn = ds.getConnection();//这个连接是连接池调用连接池的连接
			System.out.println("连接成功");
			return conn;
		} catch (Exception e) {
			throw new RuntimeException("请稍后再试...");
		}
		
	}
	
	//归还资源
	public static void closeConnection(Connection conn,ResultSet rs){
		try {
			if(conn!=null){
				/*
				 * 连接池的联机的对close方法的处理是将连接池中的状态设置为空闲,而不是真的将其关闭
				 */
				conn.close();
			}
			if(rs!=null){
				rs.close();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	
	public static void main(String[] args) {
		Connection conn = DButilDemo.getConnection();
		System.out.println(conn);
	}
}

三小测试

测试连接池最大连接和最大等待时间

public class BasicDataSourceDemo {
	public static void main(String[] args) {
	//创建3个线程
		Thread t1 = new DemoThread(5000,"连接1");
		Thread t2 = new DemoThread(5000,"连接2");
		Thread t3 = new DemoThread(5000,"连接3");
		t1.start();
		t2.start();
		t3.start();
	}
}

class DemoThread extends Thread{
	private int wait;//睡眠时间
	private String name;//连接名字
	
	public DemoThread(int wait,String name){
		this.wait=wait;
		this.name=name;
	}
	
	Connection  conn = null;
	public void run(){
		try {
			//数据库连接
			conn = DButil.getConnection();
			Statement stat = conn.createStatement();
			String sql = "select * from myjdbc";
			ResultSet rs = stat.executeQuery(sql);
			while(rs.next()){
				System.out.println(rs.getString("user_name")+","+rs.getString("gender"));
			}
			Thread.sleep(wait);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DButilDemo.closeConnection(conn,null);
		}
		
		
	}
}
package day02;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Scanner;

import javax.management.RuntimeErrorException;

/*
 * Statement适合执行静态SQL语句也就是SQL语句中没有拼接动态数据
 * 
 * PrepareStatement是java.sql包下面的一个接口,用来执行SQL语句查询
 * 通过调用connection,prepareStatement(sql)方法可以获取PreparedStament
 * 对象,数据库系统会对sql语句进行预编处理
 * 处理语句将被预先编译好,这条编译的SQL查询语句能在将来的查询中重用
 * 这样一来,它比Statement对象生成的查询速度更快
 * 
 * Statement使用Statement对象,在对数据库只执行一次性存取的时候,用
 * Statenment对象进行处理
 * 
 * PreParedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处,选择
 * PreparedStatement取决于你要怎么使用他它们,对于只执行一次的SQL语句是最好的,相反被多次
 * 执行的SQL语句选择用PreparedStatement是最好的
 * 
 * PreParedStatement的一次执行消耗是很高的,它的性能体现在后面的重复执行
 * 
 */
public class PreparedStatementDemo {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入用户名");
		String name = scanner.next();
		System.out.println("请输入密码");
		String pwd = scanner.next();
		System.out.println("请输入性别");
		String gender = scanner.next();
		Connection conn = null;
		try {
			//数据库连接
			conn = DButilDemo.getConnection();
			//通过Connection创建PreparedStatement对象
			String sql = "insert into myjdbc values (null,?,?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, name);
			ps.setString(2, pwd);
			ps.setString(3, gender);
			int n = ps.executeUpdate();
			if(n>0){
				System.out.println("插入成功");
			} else {
				throw new RuntimeException("插入失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DButilDemo.closeConnection(conn,null);
		}
		
		
	}
}

package day02;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;

/**
 * 批量执相同的SQL语句,ps可以重用执行计划,减小数据库开销
 * @author 臻冉
 *
 */
public class PreparedStatementDemo2 {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			conn = DButilDemo.getConnection();
			/*conn = DButilDemo.getConnection();
			Statement state = conn.createStatement();
			
			for(int i=0;i<=100;i++){
				String sql = "insert into myjdbc(user_name) values ('ceshi')";
				state.executeUpdate(sql);//执行SQL语句100次
			}*/
			
			long time1 = System.currentTimeMillis();
			String sql = "insert into myjdbc(user_name) values (?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			for(int i=0;i<=100;i++){
				ps.setString(1, "ceshi"+i);
				ps.executeUpdate();
			}
			
			long time2 = System.currentTimeMillis();
			System.out.println("插入sql语句所用的时间"+(time2-time1));
			
			//通过id可以获取到刚刚插入的数据信息
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			DButilDemo.closeConnection(conn,null);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值