java连接虚拟机中的数据库

一、建立一个maven项目

1.创建项目

在这里插入图片描述

2.选择maven=》next

在这里插入图片描述

3.自定义组名项目名=》next

在这里插入图片描述

4.finish

在这里插入图片描述

二、在maven中央仓库中找到5.1.17的数据库依赖

<dependencies>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.17</version>
</dependency>
</dependencies>

在这里插入图片描述

出现此,表明下载完成
在这里插入图片描述

三、编写代码连接数据库

1.创建Test类测试

在这里插入图片描述

2.准备工作

要连接的数据库
在这里插入图片描述

连接数据库的ip=》在虚拟机中查看网络连接
在这里插入图片描述

端口号=》Navicat新建MySQL
在这里插入图片描述

用户名:root
密码:123456

3.编写代码

1.方法一,在筛选时会发生sql注入

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//连接数据库需要知道,数据库的ip地址(master),端口号,用户名,密码 要连接的数据库名称
//通过可视化工具Navicat,找到端口号,通过虚拟机中的网络连接知道ip
//ip:192.168.154.110  port:3306 username:root  password:123456
public class Test {
    public static void main(String[] args) throws  Exception{
        //1.以映射方式加载Driver,抛出异常
        Class.forName("com.mysql.jdbc.Driver");
        //2.建立连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/shujuku", "root", "123456");
        //3.执行sql语句
        //方式一
        //3.1.1创建sqlyu语句
        String sql="select * from student;";
        //3.1.2通过创建的连接对象创建执行器,用来执行sql语句
        Statement statement = conn.createStatement();
        //3.1.3通过执行器执行sql语句,得到结果集
        ResultSet rs = statement.executeQuery(sql);
        //3.1.4将执行的结果在控制台显示
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"--"+name+"--"+age+"--"+sex);
        }
         conn.close();
        statement.close();
        rs.close();

    }
}

在这里插入图片描述
如果sql语句为筛选语句,在该参数的时候可能会注入sql语句,导致结果出错
sql注入

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//连接数据库需要知道,数据库的ip地址(master),端口号,用户名,密码 要连接的数据库名称
//通过可视化工具Navicat,找到端口号,通过虚拟机中的网络连接知道ip
//ip:192.168.154.110  port:3306 username:root  password:123456
public class Test {
    public static void main(String[] args) throws  Exception{
        //1.以映射方式加载Driver,抛出异常
        Class.forName("com.mysql.jdbc.Driver");
        //2.建立连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/shujuku", "root", "123456");
        //3.执行sql语句
        //方式一
        //3.1.1创建sqlyu语句
        //查询ID为1005的学生信息,本来是作为参数,加在sql后面,但是如果加上其他语句,
        // 不仅仅是参数,还会成为sql的逻辑语句
        String studntid="1005 or 1=1";
        String sql="select * from student where id="+studntid;
        //3.1.2通过创建的连接对象创建执行器,用来执行sql语句
        Statement statement = conn.createStatement();
        //3.1.3通过执行器执行sql语句,得到结果集
        ResultSet rs = statement.executeQuery(sql);
        //3.1.4将执行的结果在控制台显示
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"--"+name+"--"+age+"--"+sex);
        }
         conn.close();
        statement.close();
        rs.close();
    }
}

结果不是查询不到,而是遍历输出,因为or 1= 1的存在使得每条结果都成立
在这里插入图片描述

2.方法二

避免sql注入

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test1 {
    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/shujuku", "root", "123456");
        String sql="select * from student where id=?";//给上占位符
        //方式二
        //3.2.1创建执行器
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1,"1005 or 1=1");//第一个占位符给1,如果有两个问号,设置两次,下次给2
        //3.2.1执行语句,获取结果集
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"--"+name+"--"+age+"--"+sex);
        }
        conn.close();
        ps.close();
        rs.close();
    }
}

未查询到
在这里插入图片描述

四、总结

格式1创建Statement步骤
	1.反射加载Driver
		Class.forName("com.mysql.jdbc.Driver");
	2.创建连接
		Connection conn=DriverManager.getConnection("jdbc:mysql://master:3306/shujia","root","123456");
	3.1.创建执行器
		Statement statement=conn.createStatement();
	3.2.执行器执行sql语句 获得ResultSet结果集
		String sql="select * from student";
		ResultSet rs = statement.executeQuery(sql);
	4.解析结果
		 while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"-"+name+"-"+age+"-"+sex);
        }
    5.关闭
        rs.close();
        statement.close();
        conn.close();
格式2preparedStatement步骤
	1.反射加载Driver
		Class.forName("com.mysql.jdbc.Driver");
	2.创建连接
		Connection conn=DriverManager.getConnection("jdbc:mysql://master:3306/shujia","root","123456");
	3.1创建执行器 首先加载sql的格式
		//使用PreparedStatement执行器执行sql时,参数通过?进行传递
		String sql="select * from student where id=?";
		PreparedStatement ps = conn.prepareStatement(sql);
		//通过ps.set数据类型(index,value)进行赋值
		ps.setString(1,"1055");
	3.2通过执行器执行sql 获取结果集
		ResultSet rs = ps.executeQuery();// 执行sql语句 获取结果集
    4解析结果集
        while(rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            System.out.println(id+"-"+name+"-"+age+"-"+sex);
        }
    5关闭
        rs.close();
        ps.close();
        conn.close();
sql注入:参数中可以有sql语句        
区别:Statment可以进行sql注入,PreparedStatement不行

为了避免多次打开连接,可以把连接信息写入到工具类之中
	例如:// 工具类 连接工具 用于连接mysql
public class JDBCUtil {
    private static String driver=null;
    private static String url=null;
    private static String username=null;
    private static String password=null;
    private static Connection conn=null;
    static{
        Properties properties = new Properties();
        // 读取配置文件 通过反射的方式
        InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("mysql.properties");
        // 把读取到文件的流放到properties中进行加载
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        driver=properties.getProperty("driver");
        url=properties.getProperty("url");
        username=properties.getProperty("username");
        password=properties.getProperty("password");
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
           conn = DriverManager.getConnection(url, username, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection()throws Exception{
        return conn;
    }
    public static void close(PreparedStatement ps, ResultSet rs,Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
    public static void close(PreparedStatement ps,Connection conn){
        if(ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}


配置文件:避免程序上线之后,内容发生更改时,需要再次打包上传
在Maven项目中自己提供了一个资源目录resources,专门用于存放配置文件
	配置文件的格式:文件名称.properties
	内容格式:KV格式
		例如:username=root
	读取配置文件步骤:
		1.创建Java提供的Properties对象,用于操作配置文件
			Properties properties = new Properties();
		2.通过反射读取配置文件
			 InputStream in = 当前类名.class.getClassLoader().getResourceAsStream("配置文件名称");
		3.Properties对象加载in
			properties.load(in);
		4.获取配置文件中的zhi
			properties.getProperties(String key);
	注意:是否正确读取配置文件,通过Ctrl+鼠标左键点击 是否能进入到配置文件中,可以就是正确读取

java
java入门基础学习(一)
java入门基础学习(二)
java入门基础学习(三)
java入门基础学习(四)
java入门基础学习(五)
java入门基础学习(六)
java入门基础学习(七)
java入门基础学习(八)
java入门基础学习(九)
java入门基础学习(十)
java入门基础学习(十一)
java入门基础学习(十二)
java入门基础学习(十三)
java入门基础学习(十四)Maven Git
java总结,题目+笔记
java进阶之常见对象(一)
java进阶之常见对象(二)
java进阶之冒泡排序
java进阶之选择排序
java进阶之面向对象(封装)
java进阶之面向对象(代码块、继承)
java进阶之面向对象(多态、抽象、接口)
java进阶之匿名内部类、访问修饰符、包
java进阶之io流(字节流,字符流)
Linux
Linux基础一
Linux基础二
Mysql
mysql一
mysql二
mysql三
mysql四

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值