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

用到的术语:

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系统后配置的一般步骤

    安装linux后配置的一般步骤 最近在尝试不同的linux系统,记录一下安装完linux之后常用的软件的安装方法 1.源的更新 ubuntu 源的更新方法 参考(没有测试过,但是都大同小异,不行就换一 ...

  2. 【PAT甲级】1075 PAT Judge (25 分)

    题意: 输入三个正整数N,K,M(N<=10000,K<=5,M<=100000),接着输入一行K个正整数表示该题满分,接着输入M行数据,每行包括学生的ID(五位整数1~N),题号和 ...

  3. 将.NET Core Web Api发布到Linux(CentOS 7 64)

    将.NET Core(2.1) Web Api发布到Linux(CentOS 7 64) 近来在学习linux相关的一些东西,然后正巧想试一下把core的应用程序发布到Linux,毕竟跨平台.尝试一下 ...

  4. Python 命令行参数的输入方式(使用pycharm)

    形式一: 第一个红色框为命令行参数 第二个框为控制台模式(Terminal) 形式二 点击运行:点击红色框  编辑配置 如下图:红色框即为设置的命令行参数

  5. ASP.NET Core搭建多层网站架构【5-网站数据库实体设计及映射配置】

    2020/01/29, ASP.NET Core 3.1, VS2019, EntityFrameworkCore 3.1.1, Microsoft.Extensions.Logging.Consol ...

  6. 《JavaScript高级程序设计》读书笔记(三)基本概念第二小节 Number类型

    内容---语法 上一小节---数据类型 本小节 number类型---流程控制语句---理解函数 number类型--使用IEEE754格式来表示整数和浮点数值(双精度数值)--规定了数值字面量格式, ...

  7. Python - 八大排序算法

    1.序言 本文使用Python实现了一些常用的排序方法.文章结构如下: 1.直接插入排序 2.希尔排序 3.冒泡排序 4.快速排序 5.简单选择排序 6.堆排序 7.归并排序 8.基数排序 上述所有的 ...

  8. Mysql常用的sql语句

    替换某字段的字符串: UPDATE article SET content = replace(content, '解决', '解放') WHERE ID<5000; 清空数据库,id也置空: ...

  9. P1893山峰瞭望

    传送门 看完这个题,大家都懂意思吧,然后代码呢,emmmmm #include <bits/stdc++.h> using namespace std; const int maxn = ...

  10. C++11特性中基于范围的for循环

    本文摘录柳神笔记:   除了像C语⾔的for语句 for (i = 0; i < arr.size(); i++) 这样,C++11标准还为C++添加了⼀种新的 for 循环⽅ 式,叫做基于范围 ...