Javaweb入门 JDBC第一天
JDBC的定义和作用
DBC(Java DataBase Connectivity) Java数据库连接, 其实就是利用Java语言/程序连接并访问数据库的一门技术。
之前我们可以通过cmd或者navicat等工具连接并访问数据库,但是在企业开发中,我们更多的是通过程序连接并访问数据库。如果通过Java程序访问数据库,就必须要使用JDBC这门技术!!
JDBC访问数据库操作
创建一个 jt_db 数据库,在库中创建一个account表,并插入三条记录,然后利用Java程序查询出account表中所有的记录,并打印在控制台上。
快速人门程序了解:
创建Java类并实现JDBC程序(大致分为六个步骤)
package com.tedu; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; //JDBC快速入门程序
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
/*
* 通过Java程序查询jt_db.account表中的所有记录
* 将查询的结果输出到控制台上
*/
// 1.注册数据库
Class.forName("com.mysql.jdbc.Driver");
// 2.获取数据库连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jt_db",
"root", "root");
// 3.获取传输器
Statement stat = conn.createStatement();
// 4.发送SQL语句到数据库执行,并返回执行结果
String sql="select * from account";
ResultSet r = stat.executeQuery(sql);
// 5.处理结果
// r.next();判断是否指向记录,最开始指向表头的,用一次指向下一行记录,有记录返回true
while (r.next()) {//进去循环,指向第一行数据,获取数据
int id=r.getInt("id");
String name=r.getString("name");
double money=r.getDouble("money");
System.out.println(id+", "+name+", "+money);
}
// 6.释放资源
r.close();
stat.close();
conn.close();
}
}
JDBC快速入门细节
1.注册数据驱动
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
上面这行代码是根据传入的类的全路径(包名+类名)加载一个类到内存中。
在Driver类中有一个静态代码块,静态代码块中包含着注册驱动的代码。
因此上面这行代码本身其实并不能注册驱动,但是可以让注册驱动的代码执行!
2.获取数据库连接
//获取数据库连接块
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jt_db",
"root", "root");
后面传入的两个参数分别是连接数据库的用户名和密码,这里不再过多描述
第一个参数是连接数据库的url地址(描述连接的是哪一个位置的哪一个库)。其中URL地址的结构如下:
jdbc:mysql://localhost:3306/jt_db
———— —————— -----------
协议名 主机名+端口 数据库的名字
其结构类似于平时访问的网址:
http://www.baidu.com:80/index.html?user=zhangfei
另外在URL后面可以通过问号拼接参数:
jdbc:mysql:///jt_db?characterEncoding=utf-8
characterEncoding=utf-8 可以预防JDBC乱码
(可以避免通过JDBC往数据库插入中文数据时乱码
同时也可以避免通过JDBC从数据库查询数据时出现中文乱码问题)
3.Statement传输器对象
Stat.executeQuery( sql ) – 执行查询类的SQL语句, 执行的结果是一个ResultSet对象, 其中包含了查询的结果
Stat.executeUpdate( sql ) – 执行增删改类型的SQL语句, 执行的结果是一个int值, 表示影响的记录行数。
4.ResultSet结果集对象
ResultSet结果集其中包含了SQL查询后的结果, 该对象上提供了遍历数据的方法和获取数据的方法:
(1)遍历数据行的方法
Rs.next() – 将指向数据行的箭头往下挪动一行, 如果挪动一行后指向了一行记录, 方法将返回true, 否则返回false。
(2)获取数据的方法
Rs.getInt( colName )
Rs.getString( colName )
Rs.getDouble( colName )
Rs.getObject( colName )
...
5.释放资源
Rs.close();
Stat.close();
Conn.close();
释放时遵循一个顺序, 越晚获取的越先关闭!!
JDBC增删改查
1、新增:往account表中插入一条新的记录,name为 "john",money为3000
@Test
public void add() throws Exception{
/*
* 新增:往account表中插入一条新纪录,name为"join",money为30000
*/
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jt_db",
"root", "root");
Statement stat = conn.createStatement();
String sql="insert into account values (null,'john',3000)";
int r = stat.executeUpdate(sql);//返回影响的行数
System.out.println("影响的行数:"+r);
stat.close();
conn.close();
}
2、修改:修改account表中name为 "john" 的记录,将金额改为1500
@Test
public void update() throws Exception{
/*
* 修改account表中name为 "john" 的记录,将金额改为1500
*/
Connection conn = JDBCUtil.getConn();
Statement stat = conn.createStatement();
String sql="Update account set money =1500 where
name='john' ";
int r = stat.executeUpdate(sql);
System.out.println("影响行数:"+r);
JDBCUtil.close(conn, stat, null);
}
3、删除:删除account表中name为 "john" 的记录
@Test
public void delete() throws Exception{
/*
* 删除:删除account表中name为 "john" 的记录
*/
Connection conn = JDBCUtil.getConn();
Statement stat = conn.createStatement();
String sql="delete from account where name='John'";
int r = stat.executeUpdate(sql);
System.out.println("影响行数:"+r);
JDBCUtil.close(conn, stat, null);
}
4、查询:查询account表中id为1的记录
@Test
public void find() throws Exception{
/*
* 查询account表中id为1的记录
*/
Connection conn = JDBCUtil.getConn();
Statement stat = conn.createStatement();
String sql="select * from account where id=1";
ResultSet r = stat.executeQuery(sql);
// while (r.next()) {
// int id=r.getInt("id");
// String name=r.getString("name");
// double money=r.getDouble("money");
// System.out.println(id+","+name+","+money);
// }
if(r.next()){
int id=r.getInt("id");
String name=r.getString("name");
double money=r.getDouble("money");
System.out.println(id+","+name+","+money);
}
JDBCUtil.close(conn, stat, r);
}
上面代码中调用了工具类中注册,连接数据库和释放资源的方法
package com.tedu.util; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; /** JDBC工具类 */
public class JDBCUtil {
/**
* 获取数据库连接对象并返回
* @return Connection对象
* @throws Exception
*/
public static Connection getConn() throws Exception{
//1.注册驱动
Class.forName( "com.mysql.jdbc.Driver" );
//2.获取连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql:///jt_db?characterEncoding=utf-8",
"root",
"root");
return conn;
} /**
* 释放JDBC程序中的资源
* @param conn 连接对象
* @param stat 传输器对象
* @param rs 结果集对象
*/
public static void close(Connection conn,
Statement stat, ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
rs = null;
}
}
if(stat != null){
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
stat = null;
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} finally{
conn = null;
}
}
}
}
模拟用户登录案例
创建LoginUser类,提供mian方法和login方法
public static void main(String[] args) {
/* 提示用户在控制台输入用户名和密码,并接收用户名和密码
* 根据用户名和密码查询user表, 如果查询到记录, 则证明
* 用户名密码正确, 模拟登录, 否则提示用户名密码错误!!*/
Scanner in = new Scanner( System.in );
//1.提示用户输入用户名和密码,并接收
System.out.println("请登录...");
System.out.println("请输入用户名:");
String user = in.nextLine();
System.out.println("请输入密码:");
String pwd = in.nextLine();
//2.调用login方法, 传入用户名和密码进行登录操作
login( user, pwd );
}
/**
* 根据用户名和密码进行登录
* @param user 用户名
* @param pwd 密码
*/
private static void login(String user, String pwd) {
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
//1.注册驱动并获取连接
conn = JdbcUtil.getConn();
//2.获取传输器并执行sql语句
stat = conn.createStatement();
String sql =
"select * from user where username='"
+user+"' and password='"+pwd+"'";
System.out.println( sql );
rs = stat.executeQuery( sql );
//3.处理结果
if( rs.next() ) {//用户名密码正确
System.out.println("恭喜您登录成功!!");
}else {
System.out.println("登录失败! 用户名或密码不正确!!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
执行时输入:
请登录...
请输入用户名:
张飞'#'
请输入密码: select * from user where username='张飞'#'' and password=''
恭喜您登录成功!!
或输入:
请登录...
请输入用户名:
张飞' or '1=1
请输入密码: select * from user where username='张飞' or '1=1' and password=''
恭喜您登录成功!!
或输入:
请登录...
请输入用户名: 请输入密码:
' or '2=2
select * from user where username='' and password='' or '1=1'
恭喜您登录成功!!
以上在用户名或密码错误的情况下也能登录,就是SQL注入攻击
SQL注入攻击是一种常见的网络攻击方式,其产生的原因是:
由于后台的SQL语句是拼接而来的, 其中的参数是用户提交过来的, 如果用户在提交参数时, 在参数中添加了一些SQL关键字或者特殊符号, 就可能会导致SQL语句语义的改变,从而导致一些意外的操作,比如用户名或密码错误也能登录成功!
解决方案:
(1)通过正则对用户提交的用户名或密码进行检查, 如果其中包含
SQL关键字或者特殊符号, 则提示用户名或密码输入不合法
(2)通过PreparedStatement对象可以防止SQL注入攻击!
防止SQL注入攻击
PreparedStatement对象是如何防止SQL注入攻击的?
先将SQL语句的骨架(包含问号占位符)发送给服务器, 让服务器编译并确定下来。
再将SQL语句中的参数发送给服务器,由于前面服务器已经确定了SQL语句(一旦确定就不能被改变),因此参数中即使再包含SQL关键字或者特殊符号,也不会影响SQL语句的语义,只会被当做普通的文本来对待!
/**
* 根据用户名和密码进行登录
* @param user 用户名
* @param pwd 密码
*/
private static void login(String user, String pwd) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try {
//1.注册驱动并获取连接
conn = JdbcUtil.getConn();
//2.获取传输器并执行sql语句
String sql = "select * from user where"
+ " username=? and password=?";
stat = conn.prepareStatement( sql );
//设置sql参数(如果有?占位符)
stat.setString( 1 , user );
stat.setString( 2, pwd );
//执行sql语句
rs = stat.executeQuery( );//不要再传SQL语句!
//3.处理结果
if( rs.next() ) {//用户名密码正确
System.out.println("恭喜您登录成功!!");
}else {
System.out.println("登录失败! 用户名或密码不正确!!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//4.释放资源
JdbcUtil.close(conn, stat, rs);
}
}
Javaweb入门 JDBC第一天的更多相关文章
- Javaweb入门 数据库第一天
数据库概述 本菜鸟使用的数据库软件为Mariadb,以下内容都是以Mariadb数据库软件来写的学习总结. 数据库 所谓的数据库就是用于存储.管理数据的仓库,数据库根据底层存储数据结构的不同可以分为很 ...
- JavaWeb入门——Tomcat的目录结构
JavaWeb入门——Tomcat的目录结构 摘要:本文主要了解了Tomcat的目录结构. 目录结构 打开Tomcat的目录,可以看到如下文件和文件夹: bin目录 该目录下存放的是二进制可执行文件. ...
- JavaWeb用Jdbc操作MySql数据库(一)
一.添加开发包.在JavaWeb中用jdbc操作数据库,使用方法与java一样,但是在处理开发包的问题上有点差别.JavaWeb不能将mysql-connector-java-5.1.7-bin.ja ...
- Storm入门之第一章
Storm入门之第一章 1.名词 spout龙卷,读取原始数据为bolt提供数据 bolt雷电,从spout或者其他的bolt接收数据,并处理数据,处理结果可作为其他bolt的数据源或最终结果 nim ...
- Entity Framework 6.0 入门系列 第一篇
Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...
- JavaWeb入门——在Linux环境下安装Tomcat服务器
JavaWeb入门——在Linux环境下安装Tomcat服务器 摘要:本文主要学习了如何在Linux环境下安装Tomcat服务器. 准备工作 检查Java环境变量 检查系统是否配置了Java的环境变量 ...
- JavaWeb入门——在Windows环境下安装Tomcat服务器
JavaWeb入门——在Windows环境下安装Tomcat服务器 摘要:本文主要学习如何在Windows环境中下载并安装Tomcat服务器. 下载 获取安装包 推荐去官网上下载Tomcat: htt ...
- JavaWeb入门——背景知识
JavaWeb入门——背景知识 摘要:本文主要介绍了Web服务器的相关知识. 概念 什么是JavaWeb JavaWeb,是用Java技术来解决相关Web互联网领域的技术的总称.Web包括:Web服务 ...
- Elasticsearch7.X 入门学习第一课笔记----基本概念
原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...
随机推荐
- D. AB-string ( 思维 )
传送门 题意: 给你一个长度为n的字符串, 字符串只由 A B 组成. 问你这个字符串存在多少个 good string: ( 连续的一段子串 ) good string 的定义就是: 字符串中所有的 ...
- Java进阶知识26 SSH整合(Struts2、Spring、Hibernate)
1.我用到的jar包 2.整合实例 2.1.数据库建表语句 create database school; -- 创建数据库 use school; -- 使用school数据库 create tab ...
- OSI七层协议模型
OSI七层模型详解 TCP/IP协议 链接:https://www.nowcoder.com/questionTerminal/b2ccf60bbb13483b94b4bffe200b4f3c 来源: ...
- codeforces533E
Correcting Mistakes CodeForces - 533E Analyzing the mistakes people make while typing search queries ...
- easyui的combobox模糊搜索
<tr> <th>测试名称:</th> <td> <select data-options="" class="ea ...
- 谷歌浏览器试调网页 多出font标签
突然发现一些按钮的点击功能失效,在控制台发现该a标签中多出个font标签,导致文字区域不能触发到a标签 就算a标签宽高设置百分百 也没用. 经测试不同的浏览器情况不一样 safari就不会出现这种情况 ...
- Protocol Buffers学习笔记
Protocol Buffers学习笔记 1. 简介 Protocol Buffers是google发明的一种数据交换格式,独立于语言,独立于平台.与其他的数据交换格式有所不同,Protocol Bu ...
- Linux设备驱动 之 中断处理程序
注册中断处理程序 中断处理程序是管理硬件驱动程序的组成部分:如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序: 驱动程序通过request_irq()函数注册,并且激活给定的中断线,以处理中 ...
- 使用pycharm发布python程序到ubuntu中运行
前提条件: 1.ubuntu安装了vsftpd,可以参考:https://www.cnblogs.com/xienb/p/9322805.html 2.安装专业版pycharm 步骤: 1.新建一个P ...
- centos7.4出现yum command not found
购买的云服务器运行yum命令出现yum command not found. 通过将云主机自带的yum和python卸载掉,并且同时需要关注/usr/bin/yum文件的首行解释.我定义其为" ...