1.使用idea创建maven项目
使用Maven管理依赖
使用idea新建Meaven项目(需要在idea中配置Maven),打开idea,打开设置中心,选择maven,并修改为我们自己创建的maven路径和仓库的路径,如图所示
图中 Maven home directory:指的是maven的安装路径
User settings file :指我们自己配置的文件
Local repository:指Maven本地仓库的位置
新建一个项目,选择当前项目使用的JDK,如果没有就点击new,新建并关联到我们自己安装的JDK上,如图所示
创建成功后如下
编写一个JDBC程序
1.添加依赖 以来查询工具 :https://mvnrepository.com/
//pom.xml 中添加如下代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alice.mp</groupId>
<artifactId>my_maven_pro</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 这里就是项目所需要的依赖 -->
<dependencies>
<!-- MYSQL驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
</project>
2.在src-->main-->java目录下新建包,并创建 JDBCTest.java,并编写一个JDBC程序代码如下:
注意:mysql8的驱动,使用时需要指定时区
package com.niit.dao;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCTest{
public static void main(String[] args) throws SQLException {
Connection conn = null;
try{
//第一步:加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//第二步:设置连接数据库所需要的URL、用户、密码
String url = "jdbc:mysql://localhost:3306/myschool? useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/S hanghai";
String user="root";
String pwd = "root";
//第三步:获取数据库连接对象
conn =DriverManager.getConnection(url,user,pwd);
System.out.println("数据库连接成功");
//第四步:编写SQL语句并执行
Statement statement = conn.createStatement(); //获取SQL语句 执行对象
String sql ="select * from student";//student指myschool数据库中student表
ResultSet rs=statement.executeQuery(sql);
//执行SQL语句
//第五步:处理SQL执行结果
while (rs.next()){ System.out.print("学号="+rs.getObject("StudentNo")); System.out.print(" 姓名="+rs.getObject("StudentName"));
System.out.print(" 地址 ="+rs.getObject("Address")+"\n"); } }catch (Exception e){ e.printStackTrace(); }finally {
//第六步:关闭数据库连接资源
if(conn != null){
conn.close();
System.out.println("数据库连接已关闭");
} } } }
}
3。从database.properties属性文件中,获取数据库连接信息
对于数据库链接信息,是一个经常要更改的内容。经常修改编译很麻烦,我们可以借助属性文件,在不需要重新编译的情况下就可以更改数据库的连接信息。
1. 在 src-->main-->resource 目录下,创建一份 database.properties 文件,配置文件都放在这里
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool? useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Sh anghai
user=root
pwd=root
2. 使用 Properties 类来获取属性文件,改造 JDBCTest.java
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/*** 第一个JDBC程序 */
public class JDBCTest {
public static void main(String[] args) throws SQLException {
Connection conn = null;
try{
//加载文件到流
InputStream is = JDBCTest.class.getClassLoader().getResourceAsStream("database.properties ");
Properties prop = new Properties();
//创建属性文件读取对象
//读取属性文件
prop.load(is);
//第二步:设置连接数据库所需要的URL、用户、密码
String driver =prop.getProperty("driver");
String url = prop.getProperty("url");
String user=prop.getProperty("user");
String pwd = prop.getProperty("pwd");
//第一步:加载数据库驱动
Class.forName(driver);
//第三步:获取数据库连接对象
conn =DriverManager.getConnection(url,user,pwd);
System.out.println("数据库连接成功");
//第四步:编写SQL语句并执行
Statement statement = conn.createStatement();
//获取SQL语句 执行对象
String sql ="select * from student";
ResultSet rs=statement.executeQuery(sql);
//执行SQL语句
//第五步:处理SQL执行结果
while (rs.next()){ System.out.print("学号="+rs.getObject("StudentNo")); System.out.print(" 姓名="+rs.getObject("StudentName"));
System.out.print(" 地址 ="+rs.getObject("Address")+"\n"); } }
catch (Exception e){
e.printStackTrace();
}finally {
//第六步:关闭数据库连接资源
if(conn != null){
conn.close();
System.out.println("数据库连接已关闭");
}
}
}
}
4.封装JDBC工具类 JDBCUtil.java
为什么需要封装工具类:
提高代码的利用率
减少资源浪费
//JDBCUtil.java中的代码
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
/*** JDBC连接数据库的工具类 */
public class JDBCUtil {
private static Connection conn=null;
private static String driverName;
private static String url;
private static String userName;
private static String password;
/*** 使用静态代码块的方式,使得数据库的连接信息在工具类加载的时候就获取并赋值 */
static{ try {//第二步:定义数据库连接信息
InputStream is=JDBCTest.class.getClassLoader().getResourceAsStream("database.properties");
//使用Properties类来读取属性文件中对应的值
Properties prop = new Properties();
//把输入流中的信息加载到Properties的对象
prop.load(is);
driverName = prop.getProperty("driverName");
url = prop.getProperty("url");
userName = prop.getProperty("userName");
password = prop.getProperty("password");
//获取数据库的连接
//第一步:加载数据库驱动
Class.forName(driverName);
} catch (Exception e)
{ e.printStackTrace();
} }
/*** 获取数据库的连接对象 * @return * @throws SQLException */
public static Connection getConnection() throws SQLException { /
/为了让整个应用程序有且只有一个数据库连接对象 ---单例模式
if(conn == null)
{ conn = DriverManager.getConnection(url,userName,password);
}
return conn;
}
public static void closeConnection(Connection conn) throws SQLException { if(conn != null)
conn.close(); } }
SQL 注入问题 preparedStatement
SQL 注入:
用户通过输入框传递一些非法语句导致 sql 在执行的时候,非法拼接了,从而使得系统无法进行安
全校验,
//使用preparedStatement之前
@Test
public void testLogin() throws SQLException { Connection conn =null;
String sNo = "1005 or 1=1 ";
//这是一个错误的用户名
String pwd = "123456";
try{
//获取数据的连接对象
conn = JDBCUtil.getConnection();
//获取SQL的执行对象
//执行SQL 判断登录,,用户名和密码同时存在,就允许登录 使用statement时 候的sql 语句
String sql = "select * from student where StudentNo = "+sNo+" and LoginPwd ="+pwd; Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql);
//第五步:处理数据库返回的结果
if(rs.next()){
System.out.println("登录成功");
} }
catch (Exception e)
{ e.printStackTrace();
}
finally { JDBCUtil.closeConnection(conn);
} }
//使用preparedStatement之后
@Test
public void testLogin() throws SQLException { Connection conn =null;
String sNo = "1005 or 1=1 ";
//这是一个错误的用户名
String pwd = "123456";
try{
//获取数据的连接对象
conn = JDBCUtil.getConnection();
//获取SQL的执行对象
//使用PreparedStatement
使用使用的SQl语句
String sql = "select * from student StudentNo = ? and LoginPwd = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,sNo);
//给第一个?传递参数
ps.setString(2,pwd);
//给第二个?传递参数
ResultSet rs = ps.executeQuery();
//第五步:处理数据库返回的结果
if(rs.next()){ System.out.println("登录成功");
} }
catch (Exception e)
{ e.printStackTrace();
}finally {
JDBCUtil.closeConnection(conn); } }