发表于: 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 操作即可。



返回列表 返回列表
评论

    分享到