JAVA Database Connectivity java 数据库连接
###使用JDBC的基本步骤
1. 注册驱动
`DriverManager.registerDriver(new com.mysql.jdbc.Driver());<这里需要抛出异常>`
1. 建立连接
//DriverManager.getConnection("jdbc:mysql://localhost/test?user=monty&password=greatsqldb");
(参数一: 协议 访问的数据库,参数二:用户名,参数三:密码)
<下面例子:>
Connection coon = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "123456");
3.创建statement,跟数据库打交道,一定需要这个对象
`Statement st = conn.createStatement();`
4.执行查询,得到结果集
执行sql,得到ResultSet
String sql = "select * from 你的表名";
ResultSet rs = st.executeQuery(sql);
通过遍历 :
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
......
System.out.println("输出语句");
}
*****记得释放资源
if(rs !=null){
try{
rs.close();
}catch (SQLException sqlEx){} //ignore
rs = null;
}
.....
###JDBC工具类构建
1.资源释放工作的整合
2.驱动防二次注册
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Driver 这个类里面有静态代码块,一上来就执行了,所以等同于我们注册了两次驱动。 其实没这个必要的。
//静态代码块 ---> 类加载了,就执行。 java.sql.DriverManager.registerDriver(new Driver());
最后形成以下代码即可
Class.forName("com.mysql.jdbc.Driver");
3.使用properties配置文件
1.在src底下声明一个文件xxx.properties,里面的内容如下:
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/数据库名
name=root
password=123456
2.在工具类里面,使用静态代码块,读取属性
还有一段配置如下:
static String driverClass = null;
static String url =null;
static String name = null;
static String password = null;
static{
try{
//1.创建一个属性配置对象
Properties.properties = new Properties();
//InputStream is = new FileInputStream("xxx.properties");//对于文件位于工程根目录
//使用类加载器,去读取src底下的资源文件.后面再servlet //对应文件位于src目录底下
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("xxx.properties");
//导入输入流
properties.load(is);
//读取属性
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
}catch (Exception e){
e.printStackTrace();
}
}
###数据库的CRUD sql
* **insert**
` INSERT INTO 表名(NAME,age)VALUES(‘wangqiang‘,28)`
` INSERT INTO 表名 VALUES(NULL,‘wangqiang‘,28)`
//1.获取连接对象
conn = JDBCUtil.getConn();
// 2. 根据连接对象,得到statement
st = conn.createStatement();
//3. 执行添加
String sql = "insert into t_stu values(null , ‘aobama‘ , 59)";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
* **delete**
DELETE FROM 表名 WHERE id = 1
//1.获取连接对象
Connection conn = JDBCUtil.getConn();
//2.根据连接对象,得到statement
st = conn.createStatement();
//3
String sql = "delete from 表名 where id = 1";
//影响的行数, ,如果大于0 表明操作成功。 否则失败
int result = st.executeUpdate(sql);
if(result > 0 ){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
* **query**
`SELECT * FROM 表名`
Statement st = null;
ResultSet rs = null;
Connection conn = null;
//1.获取连接对象
conn = JDBCUtil.getConn();
//2.根据连接对象,得到statement对象
st = conn.createStatement();
//3.执行sql,返回ResultSet
String sql = "Select * from 表名";
ResultSet rs = st.executeQuery(sql);
//4.遍历结果集
while(rs.next()){
String name = rs.getString("name");
...
System.out.println("name=" name "...");
}
* **update**
`UPDATE 表名 SET age = 18 WHERE id = 1;`
//1.获取连接对象
conn = JDBCUtil.getConn();
//2.根据连接对象,得到statement对象
st = conn.createStatement();
String sql = "update 表名 set age = 18 where id = 1";
int result = st.executeUpdate(sql);
if(result >0 ){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
###使用单元测试,测试代码
1.定义一个类,TestXXX,里面定义方法testXXX.
2.添加junit的支持
右键工程 --- add Library---Junit---Junit4
3.在方法的上面加上注解,其实就是一个标记
@Test
public void testQuery(){
...
}
4.光标选中方法名字,然后右键执行单元测试.或者是打开outline视图,然后选择方法右键执行
###Dao模式
>Data Access Object 数据访问对象
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();
String sql = "select * from t_user";
rs = st.executeQuery(sql);
while(rs.next()){
String userName = rs.getString("username");
String password = rs.getString("password");
System.out.println(userName "=" password);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
}
3.直接使用实现
public class TestUser {
@Test
public void demo1(){
UserDao userDao = new UserDaoImpl();
userDao.findAll();
}
}
##Statement安全问题
1.Statement执行,其实是拼接sql语句的.先拼接sql语句,然后在一起执行.
String sql = "select * from t_user where username=‘" username "‘ and password=‘" password "‘";
UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88‘ or ‘1=1");
SELECT * FROM t_user WHERE username=‘admin‘ AND PASSWORD=‘100234khsdf88‘ or ‘1=1‘
前面先拼接sql语句, 如果变量里面带有了 数据库的关键字,那么一并认为是关键字。 不认为是普通的字符串。
rs = st.executeQuery(sql)
###PrepareStatement
>该对象就是替换前面的statement对象
1.相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
sql = "insert into t_user values(null , ? , ?)";
ps = conn.prepareStatement(sql);
//给占位符赋值 从左到右数过来,1 代表第一个问号, 永远从1开始。
ps.setString(1, userName);
ps.setString(2, password);
##总结:
1.JDBC入门
2.抽取工具类 ###
3.Statement CRUD###
演练crud
4.Dao模式###
声明与实现分开
5.PrepareStament CRUD###
预处理sql语句,解决上面statement出现的问题