- 其他方法
- 编写工具类
- 编写资源文件
- 编写工具类
- 编写测试类
- 使用数据库连接池
- SQL注入
- preparestatement对象
- 使用idea来打开数据库
.properties
- 💥💥放在src文件下
- (可要可不要,如果报错还是要加入)在src文件中新建一个文件夹,标记为resourse,将properties文件放入其中
Driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useUnicode=true&&characterEncoding=utf8
username=root
password=123456
编写工具类
JDBCUtils.java
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCutils {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
try {
InputStream in = JDBCutils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties=new Properties();
properties.load(in);
driver = properties.getProperty("Driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
//加载驱动
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void release(Connection connection, Statement statement, ResultSet resultSet){
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
编写测试类
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Testutils {
public static void main(String[] args) throws SQLException {
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
connection=JDBCutils.getConnection();
statement=connection.createStatement();
String sql="SELECT * FROM `student`";
resultSet = statement.executeQuery(sql);
while(resultSet.next()){
System.out.println("学号"+':'+resultSet.getObject("StuID"));
System.out.println("姓名"+':'+resultSet.getObject("Stuname"));
System.out.println("性别"+':'+resultSet.getObject("Stusex"));
System.out.println("年龄"+':'+resultSet.getObject("Stuage"));
System.out.println("====================");
}
JDBCutils.release(connection,statement,resultSet);
}
}
编写了资源文件,工具类后,就可以只在主文件中写少量代码就可以实现数据库的 *** 纵。
使用数据库连接池- 普通的JDBC数据库连接使用DriverManager来获取,
- 每次向数据库建立连接的时候都要将 Connection加载到内存中,需要很长的时间。
- 需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。
数据库连接池:
- 就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
- 数据库连接池负责分配 、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接池,而不是重新建立一个。
这里用的是C3P0,是一个开源。
在后面的javaweb中会详细介绍。
需要导入的jar包:
代码实现:
这里并没有用工具类来实现,是为了更加清晰一些。
mport com.mchange.v2.c3p0.ComboPooledDataSource;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestDataSourse {
public static void main(String[] args) throws PropertyVetoException, SQLException {
ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/school");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("123456");
Connection connection = comboPooledDataSource.getConnection();
String sql="insert into student values (?,?,?,?)";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setInt(1,7);
preparedStatement.setString(2,"林妹妹");
preparedStatement.setString(3,"女");
preparedStatement.setInt(4,200);
int i = preparedStatement.executeUpdate();
if(i>0){
System.out.println("插入成功");
}
preparedStatement.close();
connection.close();
}
}
SQL注入
SQL存在漏洞,容易被攻击。
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法 *** 作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
输入过程中要注意的事项
- SQL中字符串要用 ’ ’ 包裹起来
- 💥💥在写传入数据时一定要注意。
public class TestBug {
public static void main(String[] args) {
//正常登录
//login("张三",1);
//非正常登录
login(" 'or '1=1",1);
//也可以得到
//只要为true都可以
}
//登录业务
public static void login(String username,int ID) {
Connection connection=null;
Statement statement=null;
ResultSet resultSet=null;
try {
connection = JDBCutils.getConnection();
statement = connection.createStatement();
String sql = "SELECT * FROM `student`where `Stuname`='" + username + "' and `StuID`=" + ID;
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println("学号" + ':' + resultSet.getObject("StuID"));
System.out.println("姓名" + ':' + resultSet.getObject("Stuname"));
System.out.println("====================");
}
}catch(Exception e){
e.printStackTrace();
}
JDBCutils.release(connection,statement,resultSet);
}
}
preparestatement对象
preparestatement与statement不同:
- preparestatement可以防止SQL注入,更加安全。
- preparestatement效率更高
import com.study.Testproperties.utils.JDBCutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class TestPrepareStatement {
public static void main(String[] args) {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
try {
connection = JDBCutils.getConnection();
//statement = connection.createStatement();
//区别
//参数为预编译SQL,不执行
String sql="insert into student values (?,?,?,?)";
preparedStatement=connection.prepareStatement(sql);
//手动与参数赋值
preparedStatement.setInt(1,5);
preparedStatement.setString(2,"shengweiming");
preparedStatement.setString(3,"男");
preparedStatement.setInt(4,22);
int i = preparedStatement.executeUpdate();
if(i>0){
System.out.println("插入成功");
}
}catch(Exception e){
e.printStackTrace();
}
JDBCutils.release(connection,preparedStatement,resultSet);
}
}
statement和preparestatement
- executeUpdate:执行增,删,改
- executeQuery:执行查询
连接database:
选择自己想用的数据库:
- 查看数据库中的,双击就可以。
修改表中信息:
在idea中打开SQL编辑器:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)