J什么是JDBC
Java Database Connectivity java数据库连接
- SUN公司提供的访问数据库规则、规范,由于数据库种类较多,并且java语言使用比较广泛,sun公司就提供了一种规范,让其他的数据库去实现底层的访问规则。我们的java程序只要使用sun公司提供的jdbc驱动即可。
JDBC连接数据库
package com.itheima.test;
import java.sql.*;
public class MainTest {
public static void main (String[] args) throws ClassNotFoundException {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
//1.注册驱动
//静态代码块----》类加载了就会执行:java.sql.DriverManager.registerDriver(new Driver());
//因此以下代码,相当于注册了两次
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");//修改
//2.建立连接 参数一:协议+访问的数据库,参数二:用户名,参数三:密码
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "root");
//3.创建statement,跟数据库打交道,一定需要这个对象
Statement st = conn.createStatement();
//4.执行查询,得到结果集
String sql="select * from mystudent";
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("id="+id+"==name="+name+"==age="+age);
}
rs.close();
st.close();
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
释放资源改进:
另外建一个类,专门进行释放工作:
public class JDBCutil {
public static void release(Connection conn,Statement st,ResultSet rs) {
closeRs(rs);
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs) {
try {
if(rs!=null)
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}finally {
rs=null;
}
}
private static void closeSt(Statement st ) {
try {
if(st!=null)
st.close();
}catch(SQLException e) {
e.printStackTrace();
}finally {
st=null;
}
}
private static void closeConn(Connection conn) {
try {
if(conn!=null)
conn.close();
}catch(SQLException e) {
e.printStackTrace();
}finally {
conn=null;
}
}
}
使用JDBC使用步骤
- 注册驱动
- 建立连接
- 创建statement
- 执行sql,得到ResultSet
- 遍历结果集
- 释放资源
JDBC工具类构件
- 资源释放工作的整合
- 驱动防二次注册
//静态代码块----》类加载了就会执行:java.sql.DriverManager.registerDriver(new Driver());
//因此以下代码,相当于注册了两次驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");//修改
3.使用properties配置文件
一般情况下,我们不会在java类文件中写
static String url=jdbc:mysql://localhost/student static String name=root static String password=root
而是将它们单独写在资源文件中然后在使用时读取文件,这样我们只需要更改资源文件信息即可,不需要找到源java文件
//jdbc.properties
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/student
name=root
password=root
//JDBCutil.java
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("jdbc.properties");
//使用类加载器读取SRC底下的资源文件,后面在servlet 对应文件位于src目录下
InputStream is =JDBCutil.class.getClassLoader().getSystemResourceAsStream("jdbc.properties");
//导入输入流
properties.load(is);
//读取属性
driverClass = properties.getProperty("driverClass");
url= properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
步骤
- 在src底下声明一个文件xxx.properties
- 在工具类里面,使用静态代码块,读取属性
使用单元测试代码:
步骤
- 定义一个类,textxxx,里面定义方法
- 添加junit 支持:右键工程》add Library》Junit》选择版本
- 在方法上加上注解@Test,其实就是一个标记
@Test
public void testQuery(){
...
}
- 将光标点在需要测试的方法名上,然后右键Run
- 如果光条是绿色,表示代码运行没有错误
意义
对于不想讲测试内容写在main函数里,可以新建一个方法,讲测试代码放入执行。
即可以测试任何方法的正确性
注:如果方法较多,我们可以批量Run,在outline窗口进行操作即可
java对数据库的增删改查
查询:Query
public void textQuery() {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
//查询
//1.获取连接对象
conn = JDBCUtil.getConn();
//2.根据连接对象,得到statement
st = conn.createStatement();
//3.执行sql语句,返回resultset
String sql = "select * from mystudent";
rs=st.executeQuery(sql);
//4.遍历结果集
while(rs.next()) {
String sname=rs.getString("sname");;
String sex=rs.getString("sex");;
String specialty=rs.getString("specialty");
String grade=rs.getString("grade");;
System.out.println(sname+" "+sex+" "+specialty+" "+grade);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
增添:insert
public void textInsert() {
Connection conn=null;
Statement st=null;
//ResultSet rs=null;
try {
//查询
//1.获取连接对象
conn = JDBCUtil.getConn();
//2.根据连接对象,得到statement
st = conn.createStatement();
//3.执行添加
String sql = "insert into mystudent values(6,'王明','男','计算机','大一')";
//影响的行数,如果大于0表名操作成功,否则则失败
int result=st.executeUpdate(sql);
if(result>0) {
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st);
}
}
删除:delete
String sql = "delete from mystudent where id=6";
//影响的行数,如果大于0表名操作成功,否则则失败
int result=st.executeUpdate(sql);
if(result>0) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
更新:update
String sql = "update mystudent set grade='大二' where id=1";
//影响的行数,如果大于0表名操作成功,否则则失败
int result=st.executeUpdate(sql);
if(result>0) {
System.out.println("更新成功");
}else {
System.out.println("更新失败");
}
JDBC Dao模式
- 新建一个dao的接口,里面声明数据库访问规则
- 新建一个dao的实现类,具体实现早前定义的规则
- 直接使用实现
package dao;
/**
* 定义操作数据库的方法
* */
public interface UserDao {
/**
* 查询所有
* */
void Query();//findAll;
}
-----------------------------------------------
package dao.impl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.jupiter.api.Test;
import dao.UserDao;
import util.JDBCUtil;
public class UserDaoImpl implements UserDao{
@Override
@Test
public void Query() {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
try {
//1.获取连接对象
conn = JDBCUtil.getConn();
//2.创建Statement对象
st = conn.createStatement();
//3.
String sql = "select * from myuser";
rs = st.executeQuery(sql);
while(rs.next()) {
int id=rs.getInt("id");
String username=rs.getString("username");
String password=rs.getString("password");
System.out.println("id="+id+" username="+username+" password="+password);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, st, rs);
}
}
}
--------------------------------------------------------------------------------
package test;
import org.junit.Test;
import dao.UserDao;
import dao.impl.UserDaoImpl;
public class TestUserDaoImpl {
@Test
public void TestQuery() {
UserDao dao=new UserDaoImpl();//接口引用对象
dao.Query();
}
}
statement安全问题
statement的执行,其实是拼接sql语句,然后再一起执行。
//前面先拼接sql语句,如果变量里面带有了数据库的关键字,那么一并认为是关键字,不认为是普通的字符串
String sql = "select * from myuser where username='"+username+"' and password='"+password+"'";
rs = st.executeQuery(sql);
if(rs.next()) {
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
public void TestLogin() {
UserDao dao=new UserDaoImpl();
dao.login("admin", "10086'or'1=1");
// SELECT * FROM myuser WHERE username="admin" AND PASSWORD="10088" OR 1=1;
}
PrepareStatement
该对象就是替换前面的statement对象(预先对sql语句执行语法校验)
String sql="select * from myuser where username=? and password=?";
//?对应的内容,后面不管传递什么进来,都把它看成是字符串
PreparedStatement ps = conn.prepareStatement(sql);
//?对应的索引从1开始
ps.setString(1, username);
ps.setString(2, password);
rs=ps.executeQuery();
if(rs.next()) {
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
statement 给preparedstatement参数不报错因为preparedstatement是statement 的子类(体现了多态性)
总结
- JDBC入门
- 抽取工具类
- statement CRUD
- Dao模式
声明与实现分开
- PreparedStatement CRUD
预处理sql语句,解决上面statement出现的问题
- dao里面声明crud,以及登录方法
登录方法:成功后返回该用户的所有信息
查询:如果是findAll返回一个集合
增加&删除&更新
返回影响的行数即可 int类型
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/5341.html