发表于: 2019-12-11 12:12:40
1 1360
今天完成的事情:
1.简单学习了数据库的连接方式,顺便学习了Junit,方式5是最终版
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class ConnectionTest {
//方式1
@Test
public void testConnection1() throws SQLException {
Driver driver = new com.mysql.cj.jdbc.Driver();
String url = "jdbc:mysql://localhost:3306/test";
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "19980710");
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
//方式2
@Test
public void testConnection2() throws Exception {
//获取Driver实现类对象,使用反射
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
String url = "jdbc:mysql://localhost:3306/test";
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "19980710");
Connection conn = driver.connect(url, info);
System.out.println(conn);
}
//方式3:用DriverManager替换Driver
@Test
public void testConnection3() throws Exception {
Class clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "19980710";
DriverManager.registerDriver(driver);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
//方式4
@Test
public void testConnection4() throws Exception {
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "19980710";
Class.forName("com.mysql.cj.jdbc.Driver");
//可以省略如下操作,因为在mysql的Driver实现类中声明了此操作
// Driver driver = (Driver) clazz.newInstance();
// DriverManager.registerDriver(driver);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
//方式5
@Test
public void testConnection5() throws Exception {
//读取配置文件中的信息
InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("db.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//加载驱动
Class.forName(driverClass);
//获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
}
2. 向数据库中添加数据
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
public class Update {
@Test
public void testInsert() {
Connection conn = null;
PreparedStatement ps = null;
try {
//读取配置文件中的信息
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("db.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//加载驱动
Class.forName(driverClass);
//获取连接
conn = DriverManager.getConnection(url, user, password);
// System.out.println(conn);
//预编译sql语句,返回PreparedStatement的实例。
String sql="insert into user(name,pwd)values(?,?)";//?是占位符
ps = conn.prepareStatement(sql);
//填充占位符
ps.setString(1,"呵呵");
ps.setString(2,"1111111");
//执行操作
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
//资源关闭
try {
if (ps!=null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn!=null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.Junit测试(运行流程)
package com.junit;
import org.junit.*;
public class JunitTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClass......");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClass......");
}
@Before
public void setUp() throws Exception {
System.out.println("this is before......");
}
@After
public void tearDown() throws Exception {
System.out.println("this is after......");
}
@Test
public void test1() {
System.out.println("this is test1......");
}
@Test
public void test2() {
System.out.println("this is test2......");
}
}
运行结果:
this is beforeClass......
this is before......
this is test1......
this is after......
this is before......
this is test2......
this is after......
this is afterClass......
结论:
@BeforeClass
修饰的方法会在所有方法被调用前执行,且该方法时静态的,所以当测试类被加载后就接着运行它,而且在内存中他只会存在一份实例,他比较适合加载配置文件(针对所有测试,只执行一次 )
@AfterClass
所修饰的方法通常用来对资源管理,如关闭数据库连接(针对所有测试,只执行一次 )
@Before和@After 会在每个测试方法前后各执行一次
@Test:测试方法
@Ignore:忽略的测试方法
4.修改代码,添加获取数据库连接的工具类,并释放资源
package com.utils;
import com.jdbc.ConnectionTest;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
public static Connection getConnection() throws Exception {
//读取配置文件中的信息
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("db.properties");
Properties pros = new Properties();
pros.load(is);
String user = pros.getProperty("user");
String password = pros.getProperty("password");
String url = pros.getProperty("url");
String driverClass = pros.getProperty("driverClass");
//加载驱动
Class.forName(driverClass);
//获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
return conn;
}
public static void closeResourse(Connection conn, Statement ps) {
//资源关闭
try {
if (ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5.优化后的修改数据库中的数据
@Test
public void testUpdate() {
//获取数据库连接
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
//预编译sql语句,返回PreparedStatement的实例
String sql = "update user set name = ? where id = ?";
ps = conn.prepareStatement(sql);
//填充占位符
ps.setObject(1, "啦啦");
ps.setObject(2, 1);
//执行操作
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
//资源关闭
JDBCUtils.closeResourse(conn, ps);
}
}
删除操作就省略吧,只需修改sql语句和占位符就行了
明天计划的事情:开始使用JdbcTemplate连接数据库进行增删改查操作,继续复习基础
遇到的问题:都解决了
收获:
1.Junit
1)测试方法上必须使用@Test
2)测试方法必须使用 public void进行修饰
3)新建一个源代码目录来存放测试代码
4)测试类的包应该和被测试类的包一样
5)测试单元中的每个方法一定要能够独立测试,其方法不能有任何依赖
2.SQL注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
3.标准的maven结构如下:
src
---main
---java
---resources
---webapp
---test
target
像test,main下的resources目录和java目录需要我们自己来创建,target目录在执行maven的编译命令后会自动生成。只需要在main下右键,创建文件夹,然后将文件夹进行mark Directory as 操作即可。
评论