复习
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
二 工具类的编写步骤:
- 建立连接池
- 读取配置文件
- 读取加载资源
- 驱动
- 创建连接池
- 获取连接
- 归还资源(连接池中的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);
}
}
}
Java数据库操作实战
818

被折叠的 条评论
为什么被折叠?



