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://yundeesoft.com/5341.html