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


    一、定义数据库和表

    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 [id=" + id + ", name=" + name + ", owner=" + owner
                    + ", species=" + species + ", sex=" + sex + ", birth=" + birth
                    + ", death=" + death + "]";
        }
        
    }

    四、对实体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;
        }

  • 相关阅读:
    shell脚本--php执行普通shell命令
    shell脚本--eval执行shell命令
    shell脚本--CGI获取请求数据(GET / POST)
    shell脚本--编写CGI代码(shell结合html)以及环境变量
    shell脚本--初识CGI
    数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
    写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。
    输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
    写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
    字符串分隔 ->连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
  • 原文地址:https://www.cnblogs.com/ly-radiata/p/4347110.html
Copyright © 2020-2023  润新知