1. SQL语句
SQL文件导入到数据库
mysql -uroot -p密码;
create database 数据库名称;
use 数据库名称;
source d:\文件名.sql;
SELECT 查询语句
查询所有列
SELECT * FROM 表名称;
查询指定列
SELECT 列名称 FROM 表名称;
WHERE 条件查询
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值;
操作符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
DISTINCT 除去查询到的重复数据
SELECT DISTINCT 列名称 FROM 表名称;
AND & OR 条件查询
AND运算符
SELECT * FROM 表名称 WHERE 列 运算符 值 AND 列 运算符 值;
OR运算符
SELECT * FROM 表名称 WHERE 列 运算符 值 OR 列 运算符 值;
ESC & DESC 排序
- ESC : 升序排列
- DESC : 降序排列
SELECT * FROM 表名称 ORDER BY 列1,列2 DESC;
INSERT 插入语句
插入数据
INSERT INTO 表名称 VALUES (值1, 值2,....);
指定列插入数据
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);
UPDATE 更新语句
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值;
DELECT 删除语句
DELETE FROM 表名称 WHERE 列名称 = 值;
FOR UPDATE 行级锁(悲观锁 )
作用:在当前事务未完成之前,其他进程无法修改所查询到的行,也叫行级锁
SELECT * FROM 表名称 FOR UPDATE;
2. JDBC
2.1 连接数据库
配置数据库连接所需的数据
在src
目录下创建:jdbc.properties
文件
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/“数据库名称”
user = root
pwd = 123456
import java.sql.*;
import java.util.ResourceBundle;
public class JDBCConnection {
public static void main(String[] args) {
//从配置文件读取驱动,地址,用户名,密码的配置
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String pwd = bundle.getString("pwd");
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 加载驱动.使用反射机制让类加载,执行static代码
Class.forName(driver);
// 获取数据库操作对象
connection = DriverManager.getConnection(url, user, pwd);
// 创建SQL语句的执行对象
statement = connection.createStatement();
// 执行SQL语句
// boolean execute = statement.execute("");//执行CREATE,返回是否成功
// int i = statement.executeUpdate("");//执行INSERT\UPDATA\DELETE,返回值表示该语句影响了多少条数据
resultSet = statement.executeQuery("");//执行SELECT,返回查询的结果集
// resultSet.next()每执行一次都将指向下一行数据,如果返回值为false,表示下一行没有数据了
while (resultSet.next()){
String name = resultSet.getString("列名");
}
} catch (SQLException | ClassNotFoundException e) {
System.out.println("连接失败");
e.printStackTrace();
} finally {
//无论上述代码执行成功,都需要依次关闭
if (resultSet != null)
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (statement != null)
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (connection != null)
try {
connection.close();
System.out.println("断开数据库连接成功");
} catch (SQLException e) {
System.out.println("断开数据库连接失败");
e.printStackTrace();
}
}
}
}
2.2 使用JDBC实现用户登录
使用下面的方法时用户使用sql注入任何人都可以登录
用户名:abc
密码:cba’ or ‘1’='1
当密码这段字符拼接到sql查询语句时,判断条件任何情况都是true,返回查询结果不为空。
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Scanner;
public class LoginTest1 {
public static void main(String[] args) {
Map<String , String> userInfo = inputInfo();
boolean login = DBconnction("jdbc", userInfo);
System.out.println(login? "欢迎登录" : "用户名或密码错误");
}
/*
* 用户输入用户名和密码
* */
private static Map<String,String> inputInfo() {
System.out.println("输入用户名:");
Scanner scanner = new Scanner(System.in);
String user = scanner.nextLine();
System.out.println("输入密码:");
String pwd = scanner.nextLine();
Map<String ,String > userInfo = new HashMap<>();
userInfo.put("userName", user);
userInfo.put("pwd", pwd);
return userInfo;
}
/*
连接数据库查询用户和密码是否正确
*/
public static boolean DBconnction(String properties, Map<String, String> userInfo) {
ResourceBundle bundle = ResourceBundle.getBundle(properties);
//数据库连接需要的信息
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String pwd = bundle.getString("pwd");
//用户输入的用户名和密码
String userName = userInfo.get("userName");
String userPwd = userInfo.get("pwd");
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
boolean login = false;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, pwd);
statement = connection.createStatement();
resultSet = statement.executeQuery("select * from user where loginname = '"+userName+"' and loginpwd='"+userPwd+"'");
if (resultSet.next()) {
System.out.println(resultSet.getString("loginname"));
login = true;
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (resultSet != null)
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try{
connection.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
return login;
}
}
2.2.1 防止Sql注入PreparedStatement
通过对Sql语句预处理的方法,解决sql注入的问题。
- 先将sql语句编译,预处理时不带有用户输入的内容
- 通过
setString()
或者setInt()
等方法将用户输入的内容传入到已经处理过的sql语句- 用户输入的内容将不能再作为关键字参与到sql语句的执行
public static boolean DBconnction(String properties, Map<String, String> userInfo) {
ResourceBundle bundle = ResourceBundle.getBundle(properties);
//数据库连接需要的信息
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String pwd = bundle.getString("pwd");
//用户输入的用户名和密码
String userName = userInfo.get("userName");
String userPwd = userInfo.get("pwd");
Connection connection = null;
// 1. 声明PreparedStatement
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
boolean login = false;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, pwd);
// 2. sql语句中的外接字符全部用?占位符代替
String sql = "select * from user where loginname = ? and loginpwd=?";
// 3. 重点:在编译时就将sql语句预处理。通过占位符传入的值将不能作为sql语句的关键字
//注意这连个单词:prepared处理过的;prepare预处理
preparedStatement = connection.prepareStatement(sql);
// 4. 给占位符传值,参数(第几个占位符,值)
preparedStatement.setString(1, userName);
preparedStatement.setString(2, userPwd);
// 5. 执行预处理过的Sql语句
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
System.out.println(resultSet.getString("loginname"));
login = true;
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return login;
}
2.3 事务机制commit
JDBC在
.execute();
方法执行后会自动向数据库服务器提交事务。
有些场景是需要多条sql同时执行,例如:银行转账业务
实现:
- 关闭事务自动提交:
conn.setAutoCommit(false);
- 符合条件时手动提交事务:
conn.commit();
- 如果发生异常,在异常处理中回滚事务:
conn.rollback();
import java.sql.*;
import java.util.ResourceBundle;
public class JDBCCommit {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ppSttmt = null;
try {
ResourceBundle jdbcBundle = ResourceBundle.getBundle("jdbc");
Class.forName(jdbcBundle.getString("driver"));
conn = DriverManager.getConnection(jdbcBundle.getString("url"),
jdbcBundle.getString("user"), jdbcBundle.getString("pwd"));
String sql = "UPDATE bank set money=? where account=?";
ppSttmt = conn.prepareStatement(sql);
//假设这两次提交的updata修改数据是银行转账操作,如果两次提交事务中发生了故障,那么操作就是错误的。
//这是因为JDBC是自动提交事务的,如果想让两个更新操作作为一个事务操作,那么要关闭自动提交事务
conn.setAutoCommit(false);//1. 关闭事务自动提交
ppSttmt.setDouble(1,10000);
ppSttmt.setInt(2,111);
int i = ppSttmt.executeUpdate();
ppSttmt.setDouble(1,10000);
ppSttmt.setInt(2,222);
i = i + ppSttmt.executeUpdate();
// 如果i==2,说明两次更新的操作已经准备好,等待向服务器提交
if ( i== 2){
conn.commit();//2. 符合条件,手动提交事务
System.out.println("事务提交成功");
}
} catch (Exception e) {
if ( conn != null) {
try {
conn.rollback();// 3. 如发生异常,事务回滚
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}
}
}
连接Access数据库
- MAVEN
<!-- https://mvnrepository.com/artifact/net.sf.ucanaccess/ucanaccess -->
<dependency>
<groupId>net.sf.ucanaccess</groupId>
<artifactId>ucanaccess</artifactId>
<version>5.0.1</version>
</dependency>
引用不成功,下载后安装到maven仓库
mvn install:install-file -Dfile=jar包的位置(参数一) -DgroupId=groupId(参数二) -DartifactId=artifactId(参数三) -Dversion=version(参数四) -Dpackaging=jar
连接数据库
public void accesstest(){
try {
//加载驱动
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
//建立连接,用户名和密码没有设置
Connection connection = DriverManager.getConnection("jdbc:ucanaccess://C:\\Users\\Documents\\java\\db\\report.accdb","","");
// 查询数据
/* String sql = "select * from person_info";
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()){
System.out.println(resultSet.getString(2));
}*/
// 插入数据
String sql = "insert into person_info (person_name) values (?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"张三");
int i = ps.executeUpdate();
System.out.println(i);
} catch (Exception e) {
System.out.println("AccessDB connection fail");
e.printStackTrace();
}
}
3.使用PowerDesigner创建数据库模型
下载PowerDesigner
保存为.sql文件
通过sql文件在数据库中创建表
4. MySQL 安装过程
没有提示的界面直接下一步
- 选择精简版
- 一路下一步
一直下一步