这次的代码和之前学习到一般的代码主要就是将一些很常见的操作(建立连接、清除连接)不管做什么操作都需要用到它们,所以将它们单独放到另一个工具类里面去。

用到的术语:

1.事务:https://www.cnblogs.com/cstdio1/p/11626657.html

2.缓冲池(数据源):https://www.cnblogs.com/chy18883701161/p/11374731.html

主逻辑代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import JDBCUtils.JDBCUtils;
import JDBCUtils.JDCPDataSource; public class MysqlDemo1 { public static void main(String[] args) {
selectAll();
//System.out.println(selectByUsernamePassword2("zs","123"));
//sql注入
//System.out.println(selectByUsernamePassword("zs","12347'or'1'='1"));
//PageSearch(1,2);
//insert("sdf","249.1");
//delete("sdf");
//update("zs","123","000");
transAccount("zs","ls",1000);
}
public static void selectAll(){
// TODO Auto-generated method stub
Connection con=null;
Statement stmt=null;
ResultSet rs=null;
try {
con = JDCPDataSource.getConnection();
stmt = con.createStatement();
String SqlRequest = "select * from student";
rs= stmt.executeQuery(SqlRequest);
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4));
//System.out.println(rs.getString("id")+" "+rs.getString("stu_name")+" "+rs.getString("stu_sex")+" "+rs.getString("stu_score"));
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDCPDataSource.closeResource(rs, stmt, con);
//JDBCUtils.closeResource(rs, stmt, con);
} } public static boolean selectByUsernamePassword(String username,String password){//验证用户名和密码(字符串拼接的方式存在sql注入的问题) Connection con=null;
Statement stmt=null;
ResultSet rs=null; try {
con = JDBCUtils.getConnection();
stmt = con.createStatement();
String requestSql="select * from user where u_name='"+username+"'and u_password='"+password+"'";
System.out.print(requestSql);
rs = stmt.executeQuery(requestSql);
if(rs.next()){
return true;
}else{
return false;
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ JDBCUtils.closeResource(rs, stmt, con);
} return false; } public static boolean selectByUsernamePassword2(String username,String password){//验证用户名和密码(版本2可以防止sql注入) Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null; try {
con = JDBCUtils.getConnection();
String RequestSql="select *from user where u_name=? and u_password=? ";
pstmt = con.prepareStatement(RequestSql); pstmt.setString(1, username);
pstmt.setString(2,password);
rs = pstmt.executeQuery();
if(rs.next()){
return true;
}else{
return false;
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ JDBCUtils.closeResource(rs, pstmt, con);
} return false; }
/*
*PageNum:查询第几页
*LineNum:总共显示多少行
*/
public static void PageSearch(int PageNum,int LineNum){
//分页查询
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null; try { con = JDBCUtils.getConnection();
String RequestSql="select *from user limit ?,?";
pstmt = con.prepareStatement(RequestSql); pstmt.setInt(1,(PageNum-1)*LineNum);
pstmt.setInt(2,LineNum);
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1)+" "+rs.getString(2));
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCUtils.closeResource(rs, pstmt, con); } } public static void insert(String UserName,String Password){
//新注册的信息进行插入操作 Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
int mark=0;
try {
con = JDBCUtils.getConnection();
String RequestSql="insert into user(u_name,u_password) values(?,?)";
pstmt = con.prepareStatement(RequestSql); pstmt.setString(1, UserName);
pstmt.setString(2,Password);
mark = pstmt.executeUpdate();
if(mark>0){
System.out.println("插入成功");
}else{
System.out.println("插入失败");
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ JDBCUtils.closeResource(rs, pstmt, con);
} } public static void delete(String UserName){ Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
int mark=0;
try {
con = JDBCUtils.getConnection();
String RequestSql="delete from user where u_name = ?";
pstmt = con.prepareStatement(RequestSql); pstmt.setString(1, UserName);
mark = pstmt.executeUpdate();
if(mark>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ JDBCUtils.closeResource(rs, pstmt, con);
}
} public static void update(String UserName,String OldPassword,String NewPassword){
//修改用户密码 Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
int mark=0;
try {
con = JDBCUtils.getConnection();
String RequestSql="update user set u_password = ? where u_name = ? and u_password = ? ";
pstmt = con.prepareStatement(RequestSql); pstmt.setString(1, NewPassword);
pstmt.setString(2, UserName);
pstmt.setString(3, OldPassword);
mark = pstmt.executeUpdate();
if(mark>0){
System.out.println("修改成功");
}else{
System.out.println("修改失败");
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ JDBCUtils.closeResource(rs, pstmt, con);
}
} public static void transAccount(String UserName1,String UserName2,int money){
//转账操作(利用事务)
Connection con=null;
PreparedStatement pstmt1=null;
PreparedStatement pstmt2=null;
ResultSet rs=null;
try {
con = JDBCUtils.getConnection();
con.setAutoCommit(false);//开启事务
String sql="update user set u_balance = u_balance - ? where u_name = ? ";
pstmt1 = con.prepareStatement(sql); pstmt1.setInt(1, money);
pstmt1.setString(2, UserName1);
pstmt1.executeUpdate(); // String s=null;模拟异常情况(断电、数据库崩溃)
// s.charAt(2); sql = "update user set u_balance = u_balance + ? where u_name = ? ";
pstmt2 = con.prepareStatement(sql);
pstmt2.setInt(1, money);
pstmt2.setString(2, UserName2);
pstmt2.executeUpdate(); con.commit();//事务完成 } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{ JDBCUtils.closeResource(rs, pstmt1, con);
JDBCUtils.closeResource(null, pstmt2, null);
} }
}

分页查询的公式:

JDBC工具类:

package JDBCUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList; public class JDBCUtils {
private static final String url="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
private static final String user="root";
private static final String password="root";
private static ArrayList <Connection> Clist = new ArrayList<Connection>();//保存连接 static{
for(int i=0;i<10;i++){
Connection con = createConnection();//创建连接
Clist.add(con);//添加到容器中
}
} public static Connection getConnection(){
if(Clist.isEmpty()==false){
Connection con = Clist.get(0);//得到容器中的连接
Clist.remove(con);
return con;
}else{
return createConnection();//创建连接
}
}
public static Connection createConnection(){
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(url,user,password);//建立和mysql数据库的连接
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//选择注册驱动 return null;
} public static void closeResource(ResultSet rs,Statement stmt,Connection con){
try {
if(rs!=null)
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
if(stmt!=null)
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // try {
// if(con!=null)
// con.close();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
Clist.add(con);
} public static void closeResource(ResultSet rs,PreparedStatement pstmt,Connection con){
try {
if(rs!=null)
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
if(pstmt!=null)
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // try {
// if(con!=null)
// con.close();
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
Clist.add(con);//这里的连接不需要关闭,因为在不断建立连接和取消连接的过程会消耗很多时间,所以引入了缓冲池(数据源)的概念
}
}

我们上面的工具类的数据源是我们自己利用容器去模拟它去实现的,实际上已经有一些现成的我们可以直接使用的,例如:dbcp、c3p0。

DBCP数据源(工具类版本2):

package JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import org.apache.commons.dbcp2.BasicDataSource; public class JDCPDataSource {
private static final String url="jdbc:mysql://localhost:3306/dy?useUnicode=true&characterEncoding=utf-8&useSSL=false";
private static final String user="root";
private static final String password="root";
private static BasicDataSource ds; static{
ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(password); ds.setInitialSize(5);//设置初始连接
ds.setMaxTotal(20);//设置最大连接数
ds.setMinIdle(3);//设置最小空闲连接(一旦小于最小空闲连接它会自动创建连接以达到最小空闲连接)
}
public static Connection getConnection(){ try {
return ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
public static void closeResource(ResultSet rs,Statement stmt,Connection con){
try {
if(rs!=null)
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
if(stmt!=null)
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
if(con!=null)
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public static void closeResource(ResultSet rs,PreparedStatement pstmt,Connection con){
try {
if(rs!=null)
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
if(pstmt!=null)
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
if(con!=null)
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}  

注意:使用dbcp时需要下载:第一个是核心包、后面两个都是核心包所依赖的东西,不下程序会显示找不到Class

c3p0使用方法类似,不做过多演示 

  

jdbc学习over的更多相关文章

  1. JDBC学习笔记(2)——Statement和ResultSet

    Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...

  2. JDBC学习笔记(1)——JDBC概述

    JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...

  3. 【转】JDBC学习笔记(2)——Statement和ResultSet

    转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...

  4. 【转】JDBC学习笔记(1)——JDBC概述

    转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...

  5. jdbc学习总结

    jdbc学习总结:   一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供.   二.知识要点: 连接5要素,3 ...

  6. JDBC 学习笔记(十一)—— JDBC 的事务支持

    1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...

  7. JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架

    1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...

  8. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

  9. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  10. JDBC学习笔记一

    JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...

随机推荐

  1. 喵星之旅-狂奔的兔子-linux安装

    一.前言 本文演示虚拟机安装,和真机区别可能在网卡驱动上有差异. 真机环境:CentOS Linux release 7.6.1810 (Core) 虚拟机(虽然centos系统自带虚拟机软件,但是习 ...

  2. 1011 World Cup Betting

    Title:1011 World Cup Betting 1. 注意点 比较简单,没有注意点 2. python3代码 def func(output): max = 0 index = -1 lin ...

  3. java篇 之 静态

    Final:不可改变 Static:静态修饰符,在编译阶段就能确定了,可以修饰成员变量,相应的称之为静态变量 是一个共享的变量(被这个类和这个类所产生的对象所共享的,他是唯一的,出生时间 为类第一次产 ...

  4. Color the ball(差分数组)

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  5. python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数。如果不存在这样一对整数,则输入一条消息进行说明。

    python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数.如果不存在这样一对整数,则输入一条消息 ...

  6. C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,

    //函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...

  7. ASP.NET Core搭建多层网站架构【13-扩展之支持全球化和本地化多语言】

    2020/02/03, ASP.NET Core 3.1, VS2019, ResXManager 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[13-扩展之支持全球化 ...

  8. How2j学习java-3下载 ECLIPSE

    1.下载并解压Eclipse 下载并解压到e:/eclipse,目录情况如图所示.注: 这个Eclipse是64位的,应该使用本站提供的JDK(64)位,下载地址:JDK. 如果JDK位数和 Ecli ...

  9. C:gcc的基本使用

    分布编译 预处理:gcc -E hello.c -o hello.i 编 译:gcc -S hello.i -o hello.s 汇 编:gcc -c hello.s -o hello.o 链 接:g ...

  10. python opencv:代码执行时间计算

    t1 = cv2.getTickCount() # ...... t2 = cv2.getTickCount() # 计算花费的时间:毫秒 time = (t2-t1) / cv2.getTickFr ...