jdbc学习over
这次的代码和之前学习到一般的代码主要就是将一些很常见的操作(建立连接、清除连接)不管做什么操作都需要用到它们,所以将它们单独放到另一个工具类里面去。
用到的术语:
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的更多相关文章
- JDBC学习笔记(2)——Statement和ResultSet
Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(2)——Statement和ResultSet
转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- jdbc学习总结
jdbc学习总结: 一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供. 二.知识要点: 连接5要素,3 ...
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- JDBC 学习笔记(六)—— PreparedStatement
1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- JDBC学习笔记一
JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...
随机推荐
- 安慰奶牛Cheering up the Cow
传送门 一次a就很开心 可以当作kruskal模板题(orz --------------------------------------------------------------------- ...
- 原生java与js结合
链接:https://www.jb51.cc/html5/15606.html
- [踩坑记录] windows10 应用商店打不开 代码: 0x80131500
在某博客看到的方法,供参考,可以尝试一下,我的也是这么解决的1.打开“运行”输入 inetcpl.cpl (“WINDOWS”+“R”键,输入 inetcpl.cpl亦可)2.点开高级往下拉,勾上&q ...
- 第一阶段集训(这篇先写写tarjan以及圆方树)
第一阶段的集训结束了w,不得不说oi太长时间不整是会退步的. 怎么说好呢,集训这几天过的很充实,知识收货很多,题调的也不少,自己的目标更明确了吧,不过这几天集训也是可以看出蒟蒻就是蒟蒻,还是太菜了.. ...
- 架设传奇时打开DBC数据库出错或读取DBC失败解决方法
架设传奇时打开DBC数据库出错或读取DBC失败解决方法 DBC右键-属性-高级-管理员身份运行 即可
- HTML-移动端-rem px vw vh 的转换
vw/vh rem px 三者的转换(快速入门移动端页面编写) 1:三种单位的转换 2:如何适配移动端的不同设备 前提知识: 手机端的长宽是实际设计过程中的两倍 比如手机端是 750 * 1200 那 ...
- P1598
无语的是,我以为题目条件的‘在任何一行末尾不要打印不需要的多余空格’意思是每一行都只能到最后一个 '*' 出现就换行,然后用了 '\b',结果怎么都不过,于是看了题解,发现别人都没管这个 = =!!, ...
- 安卓开发:在Mac系统中搭建安卓开发环境
第一步:检查下自己的电脑上有没有安装JDK(Java Development Kit)(2019年7月安装的最新版是JDK 1.8.0_181版本),通过在终端中输入"java -versi ...
- java月利率计算(等额本息贷款)
等额本息 每月还款计算公式: 每月本息金额 = (本金×月利率×(1+月利率)^还款月数)÷ ((1+月利率)^还款月数-1)) 反转求出 月利率 月利率 如果根据上面公式反转是算不出来的. 下面给出 ...
- spark sql 访问mysql数据库
pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...