数据库CURD
-
insert
insert into user (name,age) values ('小明','22') insert into user values (null,'晓得','21')
-
delete
delete from user where id = 4
-
update
update user set name = 'xiaoong' where id = 7
-
query
select * from user
使用单元测试
1.定义一个类,TestXXX.里面定义一个方法testXXX
2.添加Junit的支持
右键工程---->add Library --- > Junit --- > Junit5
3.在该方法上加注释解.
@Test
public void testQuery() {
```
}
4.选中方法名右键执行单元测试.(打开outline视图,选择方法名执行)
关于配置文件properties放在不同的位置有不同的读取方法
报错:Description Resource Path Location Type Archive for required library:
1>properties在根目录下用
InputStream is = new FileInputStream(“properties”);
2 >properties在src文件目录下,使用类加载器去读取资源文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream(“properties”);
DAO模式
( Data Access Object 数据访问对象 )
dao模式适用于团队开发中
即定义接口 (即声明与实现分开)
1.建立一个Dao接口,声明数据库的访问方法
public interface UserDao {
void findAll();
}
2.再建立一个Dao接口的实现类,即具体的方法操作
public class UserDaoImpl implements UserDao {
@Override
public void findAll() {
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
//1.获取链接对象
conn = JDBCUtil.getConn();
//2.创建statement对象
st = conn.createStatement();
//3.遍历数据库
String sql = "select * from user";
rs = st.executeQuery(sql);
while(rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String age = rs.getString("age");
System.out.println("id="+id+"==name=" + name + "==age=" + age);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
}
3.使用实现类
public class TestDaoImpl {
@Test
public void testFindAll() {
// 面向父类接口编程
UserDao dao = new UserDaoImpl();
dao.findAll();
}
}
statement对象的安全问题-sql注入
由于statement只是起到拼接字符串的作用 (即先把sql语句拼接起来再执行)
String sql = "select * from user where name = '"+ name +"' and psw = " + psw+ "'";
则:
当输入: [ “root” , "1230hhh ’ or ’ 1=1 " ]时,拼接起来的sql语句就是:
select * from user where name = ‘root’ and psw = ’ 1230hhh ’ or ’ 1=1 ’ ;
那么> rs = st.executeQuery(sql); 就返回了结果为真.
原因很简单,由于statement对象不对SQL语句处理,只是简单的拼接起来,如变量中带有数据库的关键字就把它当作了关键字,不认为是变量的字符串了.
PrepareStatement 对象
PrepareStatement对象较之前的statement对象,其会先预处理SQL语句,语法检查,用占位符 ? 代替传进来的变量.
//1.创建PrepareStatement对象
PrepareStatement ps = con.prepareStatement(" update user set name = ? wher id =?");
//2.传递参数
ps.setString(1,"zhangsan");
ps.setInt(2, 1);
ps.executeUpdate();
PrepareStatement对象可以以此创建多次使用
所以数据库不会关闭PrepareStatement对象
BOLB与CLOB接口
BLOB(Binary Large Object)类型的数据以二进制格式保存与数据库中,适用于保存程序文件、图片、音频文件等
CLOB(Character Large Object)类型的数据一Character格式保存与数据库中,适用于保存比较长的文本文件