当前位置: 首页 > news >正文

东莞网站建设公司哪家专业seo快速软件

东莞网站建设公司哪家专业,seo快速软件,网站建设中 动画,制作网站需要懂哪些二.JDBC知识点全面总结1:JDBC实战编写CRUD 1.JDBC重要接口? 2.Driver和DriverMangement的关系? 3.JAVA与数据库连接 4.JAVA中使用statement来执行sql语句时,拼接字符串的sql注入问题? 5.使用preparedstatement进行…

二.JDBC知识点全面总结1:JDBC实战编写CRUD

1.JDBC重要接口?

2.Driver和DriverMangement的关系?

3.JAVA与数据库连接

4.JAVA中使用statement来执行sql语句时,拼接字符串的sql注入问题?

5.使用preparedstatement进行增删改查

6.自定义通用查询方法

未更新

二.JDBC知识点全面总结1:JDBC实战编写CRUD

1.JDBC重要接口?

①装载驱动接口

  • Driver接口:对接MySQL提供的Driver具体实现类
  • DriverManager类:封装Driver实例。

②连接

  • Connetion接口:获取和MySQL服务器的连接
  • 获取connection实例的方式:
    driver.connect();
    DriverManger.getConnection();

③执行SQL语句

  • Statement类(执行静态SQL语句并接受返回结果)
    Statement类:SQL语句无参数
    PreparedStatement类继承Statement类:SQL语句有参数(防止sql注入)
  • 执行方法
    execute()运行无返回值
    executeQuery()运行select语句有返回集
    executeUpdate()运行Insert/delete/Update语句返回影响的行数

2.Driver和DriverManger的关系?

①对比

  • Driver是所有JDBC驱动类实现的接口
  • DriverMangement封装Driver

②使用

  • Driver创建驱动实例后直接获取连接
    driver.connect()
  • DriverMangement初始化(注册)Driver后直接获取连接
    DriverMangement.getConnetion

③实战使用

  • Class.forName()加载类而且执行静态代码快。数据库驱动(Driver)中有静态代码块即注册驱动到DriverMangement
  • 故实战可以使用DriverMangement,在加载驱动类后直接获取连接。

3.JAVA与数据库连接

①获取连接注意事项

  • properties的编写,注意直接连接的具体数据库
  • class.forName在加载驱动类时执行类中静态代码,已经从DriverMangement中注册(初始化)

②获取连接代码

  • mytest是具体数据库名称
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:13306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false
user=root
password=abc123
  • 注意我的mysql版本是5.7的
        <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.37</version></dependency>
package com.likejin;import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Properties;public class MyTest2 {public static void main(String[] args) throws Exception {InputStream resourceAsStream = MyTest2.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);String driverClass = properties.getProperty("driverClass");String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Class.forName(driverClass);Connection connection = DriverManager.getConnection(url, user, password);}
}

4.JAVA中使用statement来执行sql语句时,拼接字符串的sql注入问题?

①statement

  • 是通过获取连接之后利用其来执行sql语句
  • 原理:字符串拼接(由于数据必须通过’'来包含)

②sql注入问题

  • 实例场景:判断学生在数据库中是否有。
  • 代码
package com.likejin;import com.likejin.util.Utils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;public class MyTest3 {public static void main(String[] args) throws Exception {Connection conn = Utils.getconn();Statement statement = conn.createStatement();Scanner scanner = new Scanner(System.in);System.out.println("请输入ID");String id =scanner.nextLine();System.out.println("请输入年龄");String age = scanner.nextLine();String sql = "select * from student where id = '"+ id + "' and age = '" +age+"'";System.out.println(sql);ResultSet resultSet = statement.executeQuery(sql);if(resultSet.next()){System.out.println("您找的学生在这个班级");}else{System.out.println("您找的学生不在这个班级");}}
}
  • 数据表
    在这里插入图片描述
  • 正常情况下
    在这里插入图片描述
    在这里插入图片描述
  • sql注入问题加上单引号
    在这里插入图片描述
  • sql注入 不加单引号
    在这里插入图片描述

5.使用preparedstatement进行增删改查

①preparedstatement的方法

  • setObject 来填充占位符
  • execute() 来执行增删改,返回boolean类型是否成功
  • executeQuery()来执行查,返回ResultSet结果集

②ResultSet的方法

  • next() 判断下一个是否存在,存在指正下移,返回true,不存在指正不动,返回false
  • getObject(i) 参数为行数据的第几列,返回的是某一行数据的某一列的具体数值
  • getMetaData()获取到ResultSetMetaData类型,该类型有方法:
    getColumnCount()返回具体列数
    getColumnName(i)返回某一列的名称

②注意事项

  • 注意数据库中列从第一列开始,而JAVA数据一般从0开始,故计算时注意+1。
  • 注意sql注入时参数也是从第一个开始的。
  • 注意封装类时需要设置属性为public,否则无法利用反射初始化值。
  • 注意如果要编写未知数据的查找(封装为该类的list),需要知道数据的类型:
    可以用泛型方法来传入封装的数据类型
    Class <T> clazz
    T t

②代码

package com.likejin.util;import com.likejin.MyTest2;
import com.likejin.Student;import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;public class Utils {public static Connection getconn() throws Exception {InputStream resourceAsStream = MyTest2.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);String driverClass = properties.getProperty("driverClass");String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Class.forName(driverClass);Connection connection = DriverManager.getConnection(url, user, password);return connection;}//针对学生表的通用更新操作public static boolean updateData(String sql, Object... args) throws Exception {Connection conn = getconn();PreparedStatement preparedStatement = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {preparedStatement.setObject(i + 1, args[i]);}boolean execute = preparedStatement.execute();preparedStatement.close();conn.close();return execute;}//针对学生表的通用查询操作(已知列数,已知对象,已知列名)public static List selectData(String sql, Object... args) throws Exception {Connection conn = getconn();PreparedStatement preparedStatement = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {preparedStatement.setObject(i + 1, args[i]);}ResultSet resultSet = preparedStatement.executeQuery();ArrayList<Student> students = new ArrayList<>();int i = 0;while (resultSet.next()) {Student student = new Student();student.setId(resultSet.getInt(1));student.setAge(resultSet.getInt(2));student.setGrade(resultSet.getInt(3));i = i + 1;students.add(student);}return students;}//针对任何表的查询操作public static <T> List<T> selectData(Class<T> clazz,String sql, Object... args) throws Exception {Connection conn = getconn();PreparedStatement preparedStatement = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {preparedStatement.setObject(i + 1, args[i]);}ArrayList<T> ts = new ArrayList<>();ResultSet resultSet = preparedStatement.executeQuery();ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();while(resultSet.next()){T t = clazz.newInstance();for(int i = 0;i<columnCount;i++){Field dd = clazz.getDeclaredField(metaData.getColumnName(i+1));dd.set(t,resultSet.getObject(i+1));}ts.add(t);}return ts;}
}

6.自定义通用查询方法

①缺点

  • 运行时类和类类型不同,无法在方法中就强转为需要的类类型。
    stuent.getClass() 或者Student.class都和 Student不同
  • 故如果想获得类类型,就需要运用泛型。
  • 举例说明
    如果想在传入方法中获取该类的类型如何获取?
    利用泛型 T t或者 Class<T> clazz都可获取类型为T
    利用Object o 获取不到类类型,最多获取运行时类的实例,故需要在获取方法的返回值后手动进行强转。
  • 对象获取到类类型的数据是什么?为什么不能强转?
    即最多获取到类类型字符串
    String typeName = o1.getClass().getTypeName();由于编译的限制,无法去利用字符串强转对象。

②代码

    //针对任何表的查询操作public static List selectData5(Object o,String sql, Object... args) throws Exception {//获取连接(拿到配置文件中的内容+注册driver+DriverMangement获取连接)InputStream resourceAsStream = Utils.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);final String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Class.forName(properties.getProperty("driverClass"));Connection connection = DriverManager.getConnection(url, user, password);//连接的sql注入获取结果集PreparedStatement preparedStatement = connection.prepareStatement(sql);for(int i = 0;i<args.length;i++){preparedStatement.setObject(i+1,args[i]);}ResultSet resultSet = preparedStatement.executeQuery();//处理结果集利用反射获取结果的列表ResultSetMetaData metaData = resultSet.getMetaData();ArrayList arrayList = new ArrayList();int columnCount = metaData.getColumnCount();while(resultSet.next()){Object o1 = o.getClass().newInstance();for(int i =0;i<columnCount;i++){String columnName = metaData.getColumnName(i + 1);Field field = o1.getClass().getField(columnName);field.set(o1, resultSet.getObject(i+1));}//无法转换为目标对象的类//因为o.getClass获取的是运行时类的类型,而不是实际类类型//故实际使用时需要转换类型输出arrayList.add(o1);}return arrayList;}public static void main(String[] args) throws Exception {String sql = "select * from student where id<?" ;List students1 =null;List list = selectData5(new Student(), sql, 10);Iterator iterator = list.iterator();while(iterator.hasNext()){System.out.println((Student)iterator.next());}}

未更新

http://www.yayakq.cn/news/632069/

相关文章:

  • 建设银行网站怎么查开户行wordpress图片合成
  • _网站建设网站手机端企业网站源码下载
  • html网页模板资源seo sem是什么
  • wordpress多站点wordpress长文章分页
  • 广州优化网站关键词网站跳转至手机端如何做
  • 营销型网站盈利方案网站公司网站建设
  • 网站开发倒计时conoha wordpress
  • 网站文章页301重定向怎么做赣州找工作的网站
  • 企业网站建设需要资料广州做贷款有什么网站
  • 红色大气网络公司企业网站源码_适合广告设计网站建设费算费用还是固定资产
  • 珠珠宝宝网网站站建建设设引物在线设计网站
  • 临沂网站开发怎么建免费论坛网站
  • php网站开发 教案哪家微网站建设
  • 做艺术教育类网站如何申请闽侯县住房和城乡建设网站
  • 呼伦贝尔市规划建设局网站门户网站建设发展趋势
  • 网站开发工具有组合域名后面wordpress
  • 深州网站上海嘉定建设局官方网站
  • 每个网站都有后台吗备案没有商城可以做商城网站吗
  • 推广网站加盟中教在线3d建模培训
  • semcms外贸网站管理系统奉贤网站开发
  • 域名就是网站名吗福州网站建设效果
  • 设计公司的网站wordpress文章标题总有网站名
  • 成都响应式网站建百度网站怎么做的
  • 自己买域名建设网站肇庆东莞网站建设
  • 买网站空间需要知道的网站建设和制作
  • 建设公司网站应有哪些功能用糖做的网站
  • 郑州企业网站模板建站个人网页设计作业总结
  • html代码冰墩墩seo优化网络公司
  • 网站中文名alpine wordpress
  • 北京两学一做网站ui设计师面试自我介绍