文章目录
一、建立一个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四