一、对数据库的操作:
进入sql:
打开命令提示符,输入以下命令:
mysql -u [username] -p [password]
- 创建一个库:
//方式一
create database 库名;
//方式二
create database 库名 character set 编码;
- 查看数据库:
//查看所有数据库
show databases;
//查看带有编码的数据库
show create database web08_01;
- 删除一个库:
drop database 库名;
- 使用库:
use 库名;
- 查看当前正在操作的库:
select database();
二、对数据库表的操作:
- 创建一张表:
create table 表名(
字段名 类型(长度) [约束],
字段名 类型(长度) [约束],
字段名 类型(长度) [约束]
);
- 查看数据库表:
show tables;
- 查看表的结构:
desc 表名;
- 删除一张表:
drop table 表名;
- 修改表:
- 添加一列:
alter table 表名 add 字段名 类型(长度) [约束] ;
- 修改类的类型(长度、约束):
alter table 表名 modify 要修改的字段名 类型(长度) [约束];
- 修改列的列名:
alter table 表名 change 旧列名 新列名 类型(长度) [约束] ;
- 删除表的列:
alter table 表名 drop 列名 ;
- 修改表名:
rename table 旧表名 to 新表名 ;
- 修改表的字符集:
alter table 表名 character set 编码 ;
三、对数据库表记录进行操作:
- 插入记录:
方式 1:
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……) ;
方式 2:
insert into 表名 values(值1,值2,值3……);
解决中文乱码的方法:
set names gbk ;
- 修改表记录:
- 不带条件的:
update 表名 set 字段名=值, 字段名=值, 字段名=值……
- 带条件的:
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件
- 删除表记录:
- 不带条件的:
delete from 表名;
- 带条件的:
delete from 表名 where 条件;
此时删除后,uid不会重置。
说说delete与truncate的区别?
delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。
truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。
start transaction;
delete from 表名;
rollback;
通过开启一个事物, 可以把delete的表回滚找回来,id不会重置
而truncate无法找回,id会重置。
start transaction;
truncate table 表名;
rollback;
四、查询:
- 查询所有商品:
select * from product ;
- 查询商品名和商品价格:
select pname,price from product;
- 查询所有商品信息使用表别名:
select * from product as p;
as可以省略。
- 查询商品名,使用列别名:
select pname as p from product;
- 去掉重复值(按照价格):
select distinct(price) from product;
- 将所有的商品的价格+10进行显示:
select pname,price+10 from product;
7.条件查询:
- 查询商品名称为"左慈"的商品信息:
select * from product where pname='左慈';
- 查询价格>60元的所有商品信息:
select * from product where price>60;
- 查询商品名称含有"士"字的商品信息:
select * from product where pname like '%士%';
- 查询商品id在(3,6,9)范围内的所有商品信息:
select * from product where pid in(3,6,9);
- 查询商品名称含有"士"字并且id为6的商品信息:
select * from product where pname like '%士%' and pid=6;
- 查询id为2或者6的商品信息:
select * from product where pid=2 or pid=6;
8.排序:
- 查询所有的商品,按价格进行排序(升序、降序):
asc:升序
desc:降序
select * from product order by price asc;
- 查询名称有"士"的商品信息并且按照价格降序排序:
select * from product where pname like '%士%' order by price desc;
9.聚合函数:
- 获得所有商品的价格的总和:
select sum(price) from product;
- 获得所有商品的平均价格:
select avg(price) from product;
- 获得所有商品的个数:
select count(*) from product;
10.分组操作:
准备工作:
- 根据cid字段分组,分组后统计商品的个数:
select cid,count(*) from product group by cid;
- 根据cid分组,分组统计每组商品的平均价格,并且平均价格大于20000元:
select cid,avg(price) from product group by cid having avg(price)>20000;
- 使用Limit关键字进行查询操作:
limit有两个参数:
第一个参数:(要查询第几页 -1)*第二个参数
第二个参数:每页显示的数目
例:每页显示3条记录,要查询第三页。
select * from product limit 6,3;
五、JDBC:
概念:
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。JDBC核心类介绍:
DriverManager、Connection、Statement、ResultSet
1.DriverManager:
两个作用:
(1)注册驱动:
//可能出现ClassNotFoundException异常,原因:没导jar包、类名书写错误
Class.forName("com.mysql.jdbc.Driver");
(2)获取连接:
//web08是数据库的名称,root是数据的用户名,a12345是数据库的密码
//出现SQLException异常
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web08","root","a12345");
2.Connection:
主要用来获取Statement:
Statement stmt = conn.createStatement();
3.Statement:
有三个常用方法:
(1) int executeUpdate(String sql):
执行更新操作,即执行insert、update、delete语句;
(2) ResultSet executeQuery(String sql):
执行查询操作,执行查询操作会返回ResultSet,即结果集;
(3) boolean execute():
用来执行增、删、改、查所有SQL语句;
注:
如果使用execute()方法执行的是更新语句,那么还要调用int getUpdateCount()来获取insert、update、delete语句所影响的行数;
如果使用execute()方法执行的是查询语句,那么还要调用ResultSet getResultSet()来获取select语句的查询结果。
4.ResultSet:
获取结果集代码如下:
ResultSet rs = stmt.executeQuery(sql);
方法:next()表示查看结果集是否为空
//表示结果集中已经有查询到的结果
rs.next();
读取数据的方法如下:
根据列数:
String getString(int columnIndex):获取指定列的String类型数据;
int getInt(int columnIndex):获取指定列的int类型数据;
double getDouble(int columnIndex):获取指定列的double类型数据;
boolean getBoolean(int columnIndex):获取指定列的boolean类型数据;
Object getObject(int columnIndex):获取指定列的Object类型的数据。
根据名称:
String getString(String columnName):获取名称为columnName的列的String数据;
int getInt(String columnName):获取名称为columnName的列的int数据;
double getDouble(String columnName):获取名称为columnName的列的double数据;
boolean getBoolean(String columnName):获取名称为columnName的列的boolean数据;
Object getObject(String columnName):获取名称为columnName的列的Object数据;
PreparedStatement:
预编译声明,是Statement的子接口。
优点:
(1)防止SQL攻击;
(2)提高代码的可读性,以可维护性;
(3)提高效率。
使用模板如下:
String sql = “select * from tab_student where s_number=?”;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, “S_1001”);
ResultSet rs = pstmt.executeQuery();
rs.close();
pstmt.clearParameters();
pstmt.setString(1, “S_1002”);
rs = pstmt.executeQuery();
JDBC的开发步骤:
public void login(String username, String password) throws ClassNotFoundException, SQLException {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root",
"a12345");
// 3.获取执行sql语句的对象
Statement stmt = (Statement) conn.createStatement();
// 4.书写一个sql语句
String sql = "select * from tbl_user where uname='" + username + "' and upassword='" + password + "'";
// 5.执行sql语句
ResultSet rs = stmt.executeQuery(sql);
// 6.对结果集进行处理
if (rs.next()) {
System.out.println("恭喜您," + username + ",登录成功!");
System.out.println(sql);
} else {
System.out.println("账号或密码错误!");
}
// 7.釋放資源
rs.close();
stmt.close();
conn.close();
}
规范化代码如下:
@Test
public void query() {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con = getConnection();
stmt = con.createStatement();
String sql = "select * from user";
rs = stmt.executeQuery(sql);
while(rs.next()) {
String username = rs.getString(1);
String password = rs.getString(2);
System.out.println(username + ", " + password);
}
} catch(Exception e) {
throw new RuntimeException(e);
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
}
下面用PreparedStatement完成,没有sql注入问题
public void login1(String username, String password) throws ClassNotFoundException, SQLException {
// 1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/web08", "root",
"a12345");
// 3.编写sql语句
String sql = "select * from tbl_user where uname=? and upassword=?";
// 4.创建预处理对象
PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql);
// 5.设置占位符
pstmt.setString(1, username);
pstmt.setString(2, password);
// 6.执行查询操作
ResultSet rs = pstmt.executeQuery();
// 7.对结果集进行处理
if (rs.next()) {
System.out.println("恭喜您," + username + ",登录成功!");
System.out.println(sql);
} else {
System.out.println("账号或密码错误!");
}
//8.释放资源
rs.close();
pstmt.close();
conn.close();
}
使用JDBC完成增删改查 的实例:
db.properties文件:版本2和版本3需要用上。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8
username=root
password=a12345
JDBCUtils_V1类:
package cn.zl.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 提供获取连接和资源的方法
* @author ZL
*
*/
public class JDBCUtils_V1 {
//获取连接方法
public static Connection getConnection(){
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/web08","root","a12345");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBCUtils_V2类:
package cn.zl.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
/**
* 提供获取连接和资源的方法
* @author ZL
*
*/
public class JDBCUtils_V2 {
private static String driver;
private static String url;
private static String username;
private static String password;
//静态代码块加载配置文件信息
static{
ResourceBundle bundle = ResourceBundle.getBundle("db");
driver = bundle.getString("driver");
url = bundle.getString("url");
username=bundle.getString("username");
password=bundle.getString("password");
}
//获取连接方法
public static Connection getConnection(){
Connection conn=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//释放资源
public static void release(Connection conn,PreparedStatement pstmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBCUtils_V3类:
package cn.zl.jdbc;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.ResourceBundle;
/**
* 提供获取连接和资源的方法
*
* @author ZL
*
*/
public class JDBCUtils_V3 {
private static String driver;
private static String url;
private static String username;
private static String password;
// 静态代码块加载配置文件信息
static {
try {
// 1/通过当前类获取类加载器
ClassLoader classLoader = JDBCUtils_V3.class.getClassLoader();
// 2.通过类加载器的方法获得一个输入流
InputStream is = classLoader.getResourceAsStream("db.properties");
// 3.创建一个properties对象
Properties props = new Properties();
// 4.加载输入流
props.load(is);
// 5.获取相关参数的值
driver = props.getProperty("driver");
url = props.getProperty("url");
username = props.getProperty("username");
password = props.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
// 获取连接方法
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
// 释放资源
public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
TestUtils类:
package cn.zl.jdbc.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
import cn.zl.jdbc.JDBCUtils_V1;
import cn.zl.jdbc.JDBCUtils_V2;
import cn.zl.jdbc.JDBCUtils_V3;
/**
* 测试工具类
* @author ZL
*
*/
public class TestUtils {
/**
* 根据id更新用户信息方法
*/
@Test
public void testUpdateById(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写sql语句
String sql = "update tbl_user set upassword=? where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1,"555");
pstmt.setInt(2,2);
// 5.执行更新操作
int row = pstmt.executeUpdate();
if (row > 0) {
System.out.println("更新成功!");
} else {
System.out.println("更新失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
}
/**
* 根据id删除信息
*/
@Test
public void testDeleteById(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V3.getConnection();
// 2.编写sql语句
String sql = "delete from tbl_user where uid=?";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setInt(1,3);
// 5.执行删除操作
int row = pstmt.executeUpdate();
if (row > 0) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 6.释放资源
JDBCUtils_V3.release(conn, pstmt, null);
}
}
/**
* 添加用户信息
*/
@Test
public void testAdd() {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1.获取连接
conn = JDBCUtils_V2.getConnection();
// 2.编写sql语句
String sql = "insert into tbl_user values(null,?,?)";
// 3.获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
// 4.设置参数
pstmt.setString(1, "wangwu");
pstmt.setString(2, "999");
// 5.执行插入操作
int row = pstmt.executeUpdate();
if (row > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 6.释放资源
JDBCUtils_V2.release(conn, pstmt, null);
}
}
//根据id查询用户信息
@Test
public void testFindUserById(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
//1.获取连接
conn= JDBCUtils_V1.getConnection();
//2.编写sql语句
String sql="select * from tbl_user where uid=?";
//3获取执行sql语句对象
pstmt = conn.prepareStatement(sql);
//4.设置参数
pstmt.setInt(1, 2);
//5.执行 查询操作
rs = pstmt.executeQuery();
//6.结果集处理
while(rs.next()){
System.out.println(rs.getString(2)+"----"+rs.getString("upassword"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils_V1.release(conn, pstmt, rs);
}
}
}