JDBC & MySQL

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 BY1,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

动力节点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注入的问题。

  1. 先将sql语句编译,预处理时不带有用户输入的内容
  2. 通过setString()或者setInt()等方法将用户输入的内容传入到已经处理过的sql语句
  3. 用户输入的内容将不能再作为关键字参与到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同时执行,例如:银行转账业务
实现:

  1. 关闭事务自动提交:conn.setAutoCommit(false);
  2. 符合条件时手动提交事务:conn.commit();
  3. 如果发生异常,在异常处理中回滚事务: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 安装过程

没有提示的界面直接下一步

  1. 选择精简版
    在这里插入图片描述
  2. 一路下一步
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    一直下一步
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值