mysql之数据库连接的方法封装及防sql注入

   2023-02-10 学习力0
核心提示:一、定义数据库和表create database animal;CREATE TABLE `pet` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  `owner` varchar(20) DEFAULT NULL,  `species` varchar(20) DEFAULT NULL,  `sex` char(1) DEFAULT NULL,

一、定义数据库和表

create database animal;

CREATE TABLE `pet` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `owner` varchar(20) DEFAULT NULL,
  `species` varchar(20) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `birth` date DEFAULT NULL,
  `death` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8;

二、连接数据库并定义数据库操作基本方法的几个工具类

(1)数据库连接及查询更新操作的封装

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * 模拟单例模式
 * */
public class DBConn {
    // 定义connection对象
    private static Connection conn;

    // 私有构造函数
    private DBConn() {
    }

    // 返回连接对象
    public static Connection getConn() {
        if (conn == null) {
            try {
                long startTime = System.currentTimeMillis();
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager
                        .getConnection("jdbc:mysql://localhost:3306/animal?user=root&generateSimpleParameterMetadata=true&password=root&useUnicode=true&characterEncoding=UTF-8");
                long endTime = System.currentTimeMillis();
                System.out.println("耗时的操作:" + (endTime - startTime));
            } catch (ClassNotFoundException e1) {
                e1.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return conn;
    }

    // 更新的封装操作
    public static boolean update(String sql, Object args[]) {
        // 1.声明返回值变量
        boolean flag = false;
        // 2.获取预处理对象
        PreparedStatement pstmt = null;
        try {
            pstmt = getConn().prepareStatement(sql);
            // 3.为占位符赋值
            int index = 1;
            // 4.遍历赋值
            for (Object arg : args) {
                pstmt.setObject(index++, arg);
            }
            // 5.执行sql语句
            int num = pstmt.executeUpdate();
            if (num > 0) {
                flag = true;
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            DBConn.release(null, pstmt);
        }
        return flag;
    }

    // 查找的封装操作
    public static <T> List<T> query(String sql, Object args[],
            IResultSetHandle<T> irsh) {
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            pstmt = getConn().prepareStatement(sql);
            if (args != null) {
                int index = 1;
                for (Object arg : args) {
                    pstmt.setObject(index++, arg);
                }
            }
            rs = pstmt.executeQuery();
            //交给别人处理
            return irsh.handle(rs);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBConn.release(rs, pstmt);
        }
        return null;
    }

    // 释放资源
    public static void release(ResultSet rs, PreparedStatement stmt) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

(2)定义IResultSetHandle接口供DBConn实现

import java.sql.ResultSet;
import java.util.List;

public interface IResultSetHandle<T> {
    List<T> handle(ResultSet rs);
}

(3)日期转换

public class DateUtil {
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    public static String DateToStr(Date date) {
        return sdf.format(date);
    }
}
三、定义实体类

public class Pet implements Serializable{

    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private String owner;
    private String species;
    private String sex;
    private Date birth;
    private Date death;
    public Pet() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Pet(Integer id, String name, String owner, String species,
            String sex, Date birth, Date death) {
        super();
        this.id = id;
        this.name = name;
        this.owner = owner;
        this.species = species;
        this.sex = sex;
        this.birth = birth;
        this.death = death;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }
    public String getSpecies() {
        return species;
    }
    public void setSpecies(String species) {
        this.species = species;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public Date getDeath() {
        return death;
    }
    public void setDeath(Date death) {
        this.death = death;
    }
    @Override
    public String toString() {
        return "Pet [;
    }
    
}

四、对实体Bean操作的接口封装

public interface PetDao {
    //插入实体
    boolean insert(Pet entity);
    //更新实体
    boolean update(Pet entity);
    //删除实体
    boolean delete(Pet entity);
    //根据id删除实体
    boolean delete(Integer id);
    //根据id、查询实体
    Pet getObjectById(Integer id);
    //查询所有实体
    List<Pet> getObjects();
    //根据用户查询实体
    List<Pet> getObjectsByOwner(String owner);
}

五、对实体Bean操作接口的实现

public class PetDaoImpl implements PetDao {
    @Override
    public boolean insert(Pet entity) {
        String sql = "insert into pet(name,owner,species,sex,birth,death)values(?,?,?,?,?,?)";
        return DBConn.update(
                sql,
                new Object[] { entity.getName(), entity.getOwner(),
                        entity.getSpecies(), entity.getSex(),
                        entity.getBirth(), entity.getDeath() });
    }
    @Override
    public boolean update(Pet entity) {
        String sql = "update pet set name=?,owner=?,species=?,sex=?,birth=?,death=? where id=?";
        return DBConn.update(sql,new Object[] { entity.getName(), entity.getOwner(),
                        entity.getSpecies(), entity.getSex(),
                        entity.getBirth(), entity.getDeath(), entity.getId() });
    }
    @Override
    public boolean delete(Pet entity) {
        return delete(entity.getId());
    }
    @Override
    public boolean delete(Integer id) {
        String sql = "delete from pet where id=?";
        return DBConn.update(sql, new Object[] { id });
    }
    @Override
    public Pet getObjectById(Integer id) {
        String sql = "select id,name,owner,species,sex,birth,death from pet where id=?";
        return  (Pet) DBConn.query(sql, new Object[]{id}, new IResultSetHandle<Pet>() {
            @SuppressWarnings("rawtypes")
            public List<Pet> handle(ResultSet rs) {
                List<Pet> entities=new ArrayList<Pet>();
                Class cls=Pet.class;
                try {
                    while(rs.next()){
                        Pet pet=(Pet) cls.newInstance();
                        //Field[] field=cls.getDeclaredFields();
                        for(int i=0;i<rs.getMetaData().getColumnCount();i++){
                            //Field f=field[i];
                            Field f=cls.getDeclaredField(rs.getMetaData().getColumnName(i+1));

          //暴力操作
                            f.setAccessible(true);
                            f.set(pet, rs.getObject(i+1));
                        }
                        entities.add(pet);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return entities;
            }
        }).get(0);
    }
    @Override
    public List<Pet> getObjects() {
        String sql = "select id,name,owner,species,sex,birth,death from pet ";
        return  DBConn.query(sql, null, new IResultSetHandle<Pet>() {

            public List<Pet> handle(ResultSet rs) {
                List<Pet> entities=new ArrayList<Pet>();
                @SuppressWarnings("rawtypes")
                Class cls=Pet.class;
                try {
                    while(rs.next()){
                        Pet pet=(Pet) cls.newInstance();
                        //Field[] field=cls.getDeclaredFields();
                        for(int i=0;i<rs.getMetaData().getColumnCount();i++){
                            //Field f=field[i];
                            Field f=cls.getDeclaredField(rs.getMetaData().getColumnName(i+1));
                            f.setAccessible(true);
                            f.set(pet,rs.getObject(i+1));
                        }
                        entities.add(pet);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return entities;
            }
        });
    }

    @Override
    public List<Pet> getObjectsByOwner(String owner) {
        String sql = "select id,name,owner,species,sex,birth,death from pet where owner=?";
        return  DBConn.query(sql, new Object[]{owner}, new IResultSetHandle<Pet>() {

            public List<Pet> handle(ResultSet rs) {
                List<Pet> entities=new ArrayList<Pet>();
                @SuppressWarnings("rawtypes")
                Class cls=Pet.class;
                try {
                    while(rs.next()){
                        Pet pet=(Pet)cls.newInstance();
                        //Field[] field=cls.getDeclaredFields();
                        for(int i=0;i<rs.getMetaData().getColumnCount();i++){
                            //Field f=field[i];
                            Field f=cls.getDeclaredField(rs.getMetaData().getColumnName(i+1));
                            f.setAccessible(true);
                            f.set(pet, rs.getObject(i+1));
                        }
                        entities.add(pet);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return entities;
            }
        });
    }
}
六、防sql注入的测试

    @Test
    public void test() {
        List<Pet> entities=petDao.getObjectsByOwner("' or '1'='1'");
        for(Pet en:entities){
            System.out.println(en.toString());
        }
    }

如果使用以下方法则会被注入

@Override
    public Pet getObjectById(Integer id) {
        Pet entity = null;
        conn = DBConn.getConn();
        String sql = "select id,name,owner,species,sex,birth,death from pet where id=?";
        try {
            pstmt = conn.prepareStatement(sql);
            int index = 1;
            pstmt.setObject(index++, id);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                entity = new Pet();
                entity.setId(rs.getInt("id"));
                entity.setName(rs.getString("name"));
                entity.setOwner(rs.getString("owner"));
                entity.setSpecies(rs.getString("species"));
                entity.setSex(rs.getString("sex"));
                entity.setBirth(rs.getDate("birth"));
                entity.setDeath(rs.getDate("death"));
            }
            DBConn.release(rs, pstmt);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return entity;
    }

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • sql:mysql:函数:TIMESTAMPDIFF函数实现TimeStamp字段相减,求得时间差
    sql:mysql:函数:TIMESTAMPDIFF函数实现TimeS
     函数内指定是minute,则最终结果value值的单位是分钟,如果函数内指定为hours,则最终结果value值单位为小时。//UPLOAD_TIME 减去 CREATE_DTTM 求得时间差,以分钟数计时select avg(TIMESTAMPDIFF(MINUTE,CREATE_DTTM,UPLOAD_TIME)) value,LEFT(CREATE_DTTM
    03-08
  • 去重复的sql(Oracle) 去重复的英文
    1.利用group by 去重复2.可以利用下面的sql去重复,如下  1) select id,name,sex from (select a.*,row_number() over(partition by a.id,a.set order by name) su from test a ) where su=1  2)select id,name,sex from (select a.*,row_number() over(p
    02-10
  • Oracle SQL七次提速技巧
    以下SQL执行时间按序号递减。1,动态SQL,没有绑定变量,每次执行都做硬解析操作,占用较大的共享池空间,若共享池空间不足,会导致其他SQL语句的解析信息被挤出共享池。create or replace procedure proc1as beginfor i in 1..100000 loop    execute imme
    02-10
  • Oracle\SQL  Server等及其他基本语句写法
    Oracle\SQL Server等及其他基本语句写法
    Oracle\SQL  Server等及其他基本语句写法目录一.Excel相关 11.Excel中写脚本范例: 12.提取字节 23. 提取单元格内字符 24.VLOOKUP函数: 2二.SQL语句汇总 21.建表: 22.增 33.删 44.查 65.改 236.Alter的应用 24三.数据库备份与恢复脚本 261. Oracle: 2
    02-10
  • SQL ORACLE case when函数用法
    case when 用法(1)简单case函数:格式:  case 列名   when 条件值1 then 选项1  when 条件值1 then 选项2......  else 默认值 end例如:  select   case job_level  when '1' then '1111'  when '2' then '2222'   when '3' then '3333
    02-10
  • mysql下如何执行sql脚本 执行SQL脚本
    1.编写sql脚本,假设内容如下:  create database dearabao;  use dearabao;  create table niuzi (name varchar(20));  保存脚本文件,假设我把它保存在F盘的hello world目录下,于是该文件的路径为:F:\hello world\niuzi.sql2.执行sql脚本,可以有2种方法: 
    02-10
  • MySQL 5.7版本sql_mode=only_full_group_by问题
    用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'col_user_6.a.START_TIME' which is not functionally dependent on colu
    02-10
  • Oracle迁移到MySQL性能下降的注意点 oracle数据
    背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障。在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的
    02-10
  • ORACLE中通过SQL语句(alter table)来增加、删除
    1.添加字段:alter table  表名  add (字段  字段类型)  [ default  '输入默认值']  [null/not null]  ;2.添加备注:comment on column  库名.表名.字段名 is  '输入的备注';  如: 我要在ers_data库中  test表 document_type字段添加备注  comm
    02-10
  • MySQL与Oracle 差异比较之六触发器
    触发器编号类别ORACLEMYSQL注释1创建触发器语句不同create or replace trigger TG_ES_FAC_UNIT  before insert or update or delete on ES_FAC_UNIT  for each rowcreate trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_u
    02-10
点击排行