特此说明:本文参考黑马程序员视频讲座
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/*
第一部分:MySQL数据库基本操作
*/
SQL分类:
DDL(Data Definition Language):database,table,column,create,alter,drop,etc
DML(Data Manipulation Language):insert,delete,update,etc
DSDL(Data Storage Description Language)
DDL基本操作
首先,必须安装好MySQL,并配置好环境变量。
登录
创建及查看数据库
创建带有编码格式的数据库及查看数据库编码
删除数据库
切换数据库及查看当前使用哪个数据库
创建表及查看当前数据库有哪些表
查看表结构
删除表
技巧:这个表这样已经删除掉,如果想快速重新创建这个表的话,不需要重新打一遍代码,可以使用上下箭头键迅速恢复之前写的代码,进而重新创建出来这个表,下面将在此表的基础上继续做基本操作
修改表
添加一列
修改列类型
修改列名
删除列
改变表名
改变表编码
MySQL 数据类型及DML基本操作
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
下面摘自http://www.w3school.com.cn/sql/sql_datatypes.asp
插入
提示:中文乱码问题!可以去C:\ProgramData\MySQL\MySQL Server 5.7下的my.ini文件里去改代码,也可以用命令行操作。
更新
删除
delete与truncate的区别:
delete删除记录,不清空anto_increment自增使用的编号,而truncate直接删除表,重新建表,auto_increment自增重新从1开始。delete删除的数据可以回滚找回,而truncate删除的数据找不回来了
查询操作
简单查询
条件查询
排序
聚合函数
sum(),avg(),max(),min(),count()
注意:聚合函数不统计null
分组
查询总结
注意下面的顺序!!!!
select 一般在的后面的内容都是要查询的字段
from 要查询到表
where
group by
having 分组后带有条件只能使用having
order by 它必须放到最后面
查询补充
假设数据库表共5条记录,分成3页,每页两条,那么查询第2页的两条记录的方式是,从(2-1)*2开始,limit 2,2,第一个2表示开始位置,后一个2表示个数。
===============================================================================
/*
*第二部分:JDBC(首先安装好Eclipse。)
*/
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。JDBC是用Java语言向数据库发送SQL语句。JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一的访问入口,JDBC由一组Java工具类和接口组成
Eclipse中更改编码方式如下:
Eclipse导入JDBC驱动包:
JDBC开发步骤
注册驱动
获得连接
获得语句执行者
执行SQL语句
处理结果
释放资源
API详解之【注册驱动】
让JDBC知道要使用的是哪个驱动。
Class.forName("com.mysql.jdbc.Driver");
MySQL驱动包提供了实现类:com.mysql.jdbc,Driver
JDBC规范定义了驱动接口:java.sql.Driver,Ctrl+shift+T,输入Driver,导入源代码,可以查看Driver类的书写源码如下,
可以如下注册驱动:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
但是这样写,根据Driver类的源码可知,这样注册驱动,将注册两次,并且硬代码,不利于后期维护。
API详解之【获得链接】
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123");
服务器的IP地址:localhost
MySQL的端口号:3306
数据库名称:mydb
url参数注意:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8
useUnicode:指定这个连接数据库的过程中使用的字节集是Unicode
characterEncoding:指定java程序连接数据库的过程中,使用的字节集编码是utf-8,而MySQL写成utf8
*API详解之【获得语句执行】
String sql="insert into table_user(user_id,user_name,user_password) values('6','zhang','hi')";
Statement语句执行者代码:Statement statement=connection.createStatement();
//Connection最为重要的一个方法就是用来获取Statement对象
//Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句
void executeUpdate(String sql):执行更新操作(insert、update、delete等)
ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
boolean execute(String sql);执行select语句返回true,执行其他语句返回false,如果返回true,需要使用getResultSet()获得查询结果,如果返回false,需要使用getUpdateCount()获得影响的行数
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:
API详解之【处理结果集】*
rs.next();
rs.getInt(1);
ResultSet中提供了下面的方法:
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。(XXX代表Object,String,int,double等)
API详解之【释放资源】*
先得到的后关闭
rs.close();
statement.close();
connection.close();
实例演练(登录验证)
数据库:
package cn.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
public class LoginTest {
@Test
public void loginTest() {
try {
login("j","12");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 用户登录方法
* @param user_name
* @param user_password
* @throws ClassNotFoundException
* @throws SQLException
*/
public void login(String user_name,String user_password) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获得链接
Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web_08","root","123");
//3.创建执行sql语句的对象
Statement statement=(Statement) connection.createStatement();
//4.书写SQL语句
String sql="select * from table_user where "+"user_name='"+user_name+"' and user_password='"+user_password+"'";
//5.执行SQL语句
ResultSet resultSet=statement.executeQuery(sql);
//6.处理结果集
if(resultSet.next()) {
System.out.println("恭喜您,"+user_name+"登录成功!");
System.out.println(sql);
}
else {
System.out.println("账号或密码错误!");
}
if(resultSet!=null){
resultSet.close();
}
if(statement!=null) {
statement.close();
}
if(connection!=null) {
connection.close();
}
}
}
问题发现:
更改上面测试代码,我们发现这个问题,如下图片
这个问题就是由于书写SQL语句时候使用拼接问导致的注入问题,为了解决这个问题,使用预处理的方法,如下login2方法,上述问题可以解决。
package cn.jdbc.test;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.text.html.HTMLDocument.HTMLReader.ParagraphAction;
import org.junit.Test;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
public class LoginTest {
@Test
public void loginTest() {
try {
login2("j'or's","12");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 用户登录方法
* @param user_name
* @param user_password
* @throws ClassNotFoundException
* @throws SQLException
*/
public void login(String user_name,String user_password) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获得链接
Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web_08","root","123");
//3.创建执行sql语句的对象
Statement statement=(Statement) connection.createStatement();
//4.书写SQL语句
String sql="select * from table_user where "+"user_name='"+user_name+"' and user_password='"+user_password+"'";
//5.执行SQL语句
ResultSet resultSet=statement.executeQuery(sql);
//6.处理结果集
if(resultSet.next()) {
System.out.println("恭喜您,"+user_name+"登录成功!");
System.out.println(sql);
}
else {
System.out.println("账号或密码错误!");
}
if(resultSet!=null){
resultSet.close();
}
if(statement!=null) {
statement.close();
}
if(connection!=null) {
connection.close();
}
}
public void login2(String user_name,String user_password) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获得链接
Connection connection=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web_08","root","123");
//3.创建执行sql语句的对象
String sql="select * from table_user where user_name=? and user_password=?";
//4.创建预处理对象
PreparedStatement preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
//5.设置参数(给占位符),参数从1开始,setXXX根据参数的类型定
preparedStatement.setString(1, user_name);
preparedStatement.setString(2, user_password);
//6.执行查询操作
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next()) {
System.out.println("恭喜您,"+user_name+"登录成功!");
System.out.println(sql);
}
else {
System.out.println("账号或密码错误!");
}
if(resultSet!=null){
resultSet.close();
}
if(preparedStatement!=null) {
preparedStatement.close();
}
if(connection!=null) {
connection.close();
}
}
}