zoukankan      html  css  js  c++  java
  • 20170416总结

    JDBC通用DAO:

             

     1 public <T> T get(Class<T> clazz,String sql,Object ... args) throws SQLException {
     2         T entity = null;
     3 
     4         Connection connection = null;
     5         PreparedStatement preparedStatement = null;
     6         ResultSet resultSet = null;
     7 
     8         jdbcUtils = new JDBCUtils();
     9         try {
    10             //1.得到ResultSet对象
    11             connection = jdbcUtils.getConnection();
    12             preparedStatement = connection.prepareStatement(sql);
    13             for (int i=0;i<args.length;i++){
    14                 preparedStatement.setObject(i+1,args[i]);
    15             }
    16             resultSet = preparedStatement.executeQuery();
    17             //2.得到ResultSetMetaData对象
    18             ResultSetMetaData rsmd = resultSet.getMetaData();
    19             //3.创建一个Map<String,Object> 对象,键:SQL查询的列的别名 值:列的值
    20             Map<String,Object> map = new HashMap<>();
    21             //4.处理结果集,利用ResultSetMetaData填充 3 对应的Map对象
    22             while (resultSet.next()){
    23                 for (int i=0;i<rsmd.getColumnCount();i++){
    24                     String columnLable = rsmd.getColumnLabel(i + 1);
    25                     Object columnValues = resultSet.getObject(columnLable);
    26 
    27                     map.put(columnLable,columnValues);
    28                 }
    29             }
    30 
    31             //5.若Map不为空集,利用反射创建clazz对应的对象
    32             if (map.size() > 0){
    33                  entity = clazz.newInstance();
    34                 //5.遍历Map对象,利用反射未Class对象的对应的属性赋值
    35                 for (Map.Entry<String,Object> entry : map.entrySet()){
    36                     String filedName = entry.getKey();
    37                     Object value = entry.getValue();
    38                     ReflectionUtils.setFieldValue(entity,filedName,value);
    39                 }
    40             }
    41         } catch (Exception e) {
    42             e.printStackTrace();
    43         }finally {
    44             jdbcUtils.releaseDB(resultSet,preparedStatement,connection);
    45         }
    46 //        System.out.println("传入的sql值为:" + sql);
    47 
    48         return entity;
    49     }

    JDBC工具类:

      

     1 package com.carzyit.jdbc;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.sql.*;
     7 import java.util.Properties;
     8 
     9 import static com.sun.org.apache.xalan.internal.utils.SecuritySupport.getContextClassLoader;
    10 
    11 /**
    12  * Created by lenovo on 2017/4/11.
    13  */
    14 public class JDBCUtils {
    15     private String driver;
    16     private String url;
    17     private String user;
    18     private String pass;
    19     public  Connection getConnection() throws Exception {
    20 
    21             InputStream in = getClass().getResourceAsStream("mysql.properties");
    22             Properties properties = new Properties();
    23             properties.load(in);
    24             driver = properties.getProperty("driver");
    25             url = properties.getProperty("url");
    26             user = properties.getProperty("user");
    27             pass = properties.getProperty("pass");
    28 
    29             //加载驱动
    30             Class.forName(driver);
    31             Connection connection = DriverManager.getConnection(url,user,pass);
    32 
    33         return connection;
    34     }
    35 
    36     /**
    37      * 执行SQL语句,使用PreparedStatement,使用可变参数进行输入
    38      * @param sql
    39      * @param args
    40      * @throws SQLException
    41      */
    42     public void update(String sql,Object... args) throws SQLException {
    43         Connection connection = null;
    44         PreparedStatement preparedStatement = null;
    45         try {
    46             connection = getConnection();
    47             preparedStatement = connection.prepareStatement(sql);
    48             for (int i=0;i<args.length;i++){
    49                 preparedStatement.setObject(i + 1,args[i]);
    50             }
    51             preparedStatement.executeUpdate();
    52         } catch (Exception e) {
    53             e.printStackTrace();
    54         }finally {
    55             releaseDB(null,preparedStatement,connection);
    56         }
    57     }
    58 
    59     public ResultSet query(String sql) throws Exception {
    60         Connection connection = null;
    61         Statement statement = null;
    62         ResultSet resultSet = null;
    63 
    64         connection = getConnection();
    65         statement = connection.createStatement();
    66         resultSet = statement.executeQuery(sql);
    67 
    68         return resultSet;
    69     }
    70 
    71     public int update(String sql) throws Exception {
    72 
    73         Connection connection = null;
    74         Statement statement = null;
    75 
    76         connection = getConnection();
    77         statement = connection.createStatement();
    78 
    79         return  statement.executeUpdate(sql);
    80     }
    81 
    82     public static void releaseDB(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
    83         if (resultSet != null){
    84             resultSet.close();
    85         }
    86 
    87         if (statement != null){
    88             statement.close();
    89         }
    90 
    91         if (connection != null){
    92             connection.close();
    93         }
    94     }
    95 }

    mysql.properties文件

    1 driver=com.mysql.jdbc.Driver
    2 url=jdbc:mysql://localhost:3306/array
    3 user=root
    4 pass=root

    mysql其他测试操作

      1 package com.carzyit.jdbc;
      2 
      3 
      4 import com.sun.corba.se.spi.ior.ObjectKey;
      5 
      6 import java.sql.*;
      7 import java.util.HashMap;
      8 import java.util.Map;
      9 import java.util.Scanner;
     10 
     11 /**
     12  * 常用数据库操作集合
     13  * Created by lenovo on 2017/4/11.
     14  */
     15 public class JDBCTest {
     16     private JDBCUtils jdbcUtils;
     17     private Student student;
     18 
     19     /**
     20      * 使用ResultSetMetaData获取JDBC元数据对象
     21      * @throws SQLException
     22      */
     23     public void testResultSetMetaData() throws SQLException {
     24 
     25         Connection connection = null;
     26         PreparedStatement preparedStatement = null;
     27         ResultSet resultSet = null;
     28         String sql = "SELECT flow_id flowId,type,id_card idCard,exam_card examCard,student_name studentName," +
     29                 "location,grade From testgrad WHERE flow_id = ?";
     30 
     31         jdbcUtils = new JDBCUtils();
     32         try {
     33 
     34             connection = jdbcUtils.getConnection();
     35             preparedStatement = connection.prepareStatement(sql);
     36             preparedStatement.setInt(1,3);
     37 
     38             resultSet = preparedStatement.executeQuery();
     39 
     40             Map<String,Object> map = new HashMap<String,Object>();
     41 
     42             //1.得到ResultSetMetaData对象
     43             ResultSetMetaData rsmd = resultSet.getMetaData();
     44             while (resultSet.next()){
     45                 //2.打印每一列的列名,放入map集合中
     46                 for (int i=0;i<rsmd.getColumnCount();i++){
     47                     String columnLable = rsmd.getColumnLabel(i + 1);
     48                     Object columnValue = resultSet.getObject(columnLable);//getObject不用指定类型
     49 
     50                     map.put(columnLable,columnValue);
     51                 }
     52             }
     53             Class clazz = Student.class;//实例化为Student对象
     54             Object object = clazz.newInstance();
     55             for (Map.Entry<String,Object> entry : map.entrySet()){
     56                 String filedName = entry.getKey();
     57                 Object fileValues = entry.getValue();
     58                 //利用反射机制获取集合元素
     59                 ReflectionUtils.setFieldValue(object,filedName,fileValues);
     60             }
     61             System.out.println(object);//输出实例化对象的集合
     62         } catch (Exception e) {
     63             e.printStackTrace();
     64         }finally {
     65             jdbcUtils.releaseDB(resultSet,preparedStatement,connection);
     66         }
     67     }
     68 
     69     /**
     70      * *********掌握************
     71      * 目前最通用的查询方法!!!!!!!!利用反射机制得到类的属性
     72      * @param clazz
     73      * @param sql
     74      * @param args
     75      * @param <T>
     76      * @return
     77      * @throws SQLException
     78      */
     79     public <T> T get(Class<T> clazz,String sql,Object ... args) throws SQLException {
     80         T entity = null;
     81 
     82         Connection connection = null;
     83         PreparedStatement preparedStatement = null;
     84         ResultSet resultSet = null;
     85 
     86         jdbcUtils = new JDBCUtils();
     87         try {
     88             //1.得到ResultSet对象
     89             connection = jdbcUtils.getConnection();
     90             preparedStatement = connection.prepareStatement(sql);
     91             for (int i=0;i<args.length;i++){
     92                 preparedStatement.setObject(i+1,args[i]);
     93             }
     94             resultSet = preparedStatement.executeQuery();
     95             //2.得到ResultSetMetaData对象
     96             ResultSetMetaData rsmd = resultSet.getMetaData();
     97             //3.创建一个Map<String,Object> 对象,键:SQL查询的列的别名 值:列的值
     98             Map<String,Object> map = new HashMap<>();
     99             //4.处理结果集,利用ResultSetMetaData填充 3 对应的Map对象
    100             while (resultSet.next()){
    101                 for (int i=0;i<rsmd.getColumnCount();i++){
    102                     String columnLable = rsmd.getColumnLabel(i + 1);
    103                     Object columnValues = resultSet.getObject(columnLable);
    104 
    105                     map.put(columnLable,columnValues);
    106                 }
    107             }
    108 
    109             //5.若Map不为空集,利用反射创建clazz对应的对象
    110             if (map.size() > 0){
    111                  entity = clazz.newInstance();
    112                 //5.遍历Map对象,利用反射未Class对象的对应的属性赋值
    113                 for (Map.Entry<String,Object> entry : map.entrySet()){
    114                     String filedName = entry.getKey();
    115                     Object value = entry.getValue();
    116                     ReflectionUtils.setFieldValue(entity,filedName,value);
    117                 }
    118             }
    119         } catch (Exception e) {
    120             e.printStackTrace();
    121         }finally {
    122             jdbcUtils.releaseDB(resultSet,preparedStatement,connection);
    123         }
    124 //        System.out.println("传入的sql值为:" + sql);
    125 
    126         return entity;
    127     }
    128 
    129     public Customers getCustomers(String sql,Object... args) throws SQLException {
    130         Customers customers = null;
    131 
    132         Connection connection = null;
    133         PreparedStatement preparedStatement = null;
    134         ResultSet resultSet = null;
    135 
    136         jdbcUtils = new JDBCUtils();
    137         try {
    138             connection = jdbcUtils.getConnection();
    139             preparedStatement = connection.prepareStatement(sql);
    140             for (int i=0;i<args.length;i++){
    141                 preparedStatement.setObject(i+1,args[i]);
    142             }
    143             resultSet = preparedStatement.executeQuery();
    144             while (resultSet.next()){
    145                 customers = new Customers();
    146                 customers.setId(resultSet.getInt(1));
    147                 customers.setName(resultSet.getString(2));
    148                 customers.setEmail(resultSet.getString(3));
    149                 customers.setBirth(resultSet.getDate(4));
    150             }
    151         } catch (Exception e) {
    152             e.printStackTrace();
    153         }finally {
    154             jdbcUtils.releaseDB(resultSet,preparedStatement,connection);
    155         }
    156         System.out.println("传入的sql值为:" + sql);
    157         return customers;
    158     }
    159 
    160     /**
    161      * 使用PrepareStatement进行登录验证,将有效解决SQL注入问题
    162      */
    163     public String testSQLInjection2(String username,String password) throws SQLException {
    164         String flag = null;
    165         String sql = "SELECT * FROM zengjiqiang WHERE  username = ? AND password = ?";//符号记得别用中文,否则出错很难找到!!!!
    166         System.out.println(sql);
    167         jdbcUtils = new JDBCUtils();
    168 
    169         Connection connection = null;
    170         PreparedStatement preparedStatement = null;
    171         ResultSet resultSet = null;
    172 
    173         try {
    174             connection = jdbcUtils.getConnection();
    175             preparedStatement = connection.prepareStatement(sql);
    176 
    177             preparedStatement.setString(1,username);
    178             preparedStatement.setString(2,password);
    179             resultSet = preparedStatement.executeQuery();
    180             if (resultSet.next()){
    181                 System.out.println("登录成功!");
    182                 flag = "登录成功!!!";
    183             }else {
    184                 System.out.println("用户名或者密码错误!");
    185                 flag = "用户名或者密码错误!";
    186             }
    187         } catch (Exception e) {
    188             e.printStackTrace();
    189         }finally {
    190             jdbcUtils.releaseDB(resultSet,preparedStatement,connection);
    191         }
    192         return flag;
    193     }
    194 
    195     /**
    196      * 使用Statement进行登录验证,可以进行SQL注入,不安全
    197      * @throws SQLException
    198      */
    199     public void testSQLInjection() throws SQLException {
    200         String username = "a' or password = ";
    201         String password = " or '1'='1 ";
    202         String sql = "select * from zengjiqiang where  username= '" + username + "' and password = '"+ password + "'";
    203         System.out.println(sql);
    204         jdbcUtils = new JDBCUtils();
    205 
    206         Connection connection = null;
    207         Statement statement = null;
    208         ResultSet resultSet = null;
    209 
    210         try {
    211             connection = jdbcUtils.getConnection();
    212             statement = connection.createStatement();
    213             resultSet = statement.executeQuery(sql);
    214             if (resultSet.next()){
    215                 System.out.println("登录成功!");
    216             }else {
    217                 System.out.println("用户名或者密码错误!");
    218             }
    219         } catch (Exception e) {
    220             e.printStackTrace();
    221         }finally {
    222             jdbcUtils.releaseDB(resultSet,statement,connection);
    223         }
    224     }
    225 
    226     public String registerTest(String username,String password) throws SQLException {
    227         String flag = null;
    228         Connection connection = null;
    229         PreparedStatement preparedStatement = null;
    230         String sql = "insert into zengjiqiang(username,password) values(?,?)";
    231         jdbcUtils = new JDBCUtils();
    232         try {
    233             connection = jdbcUtils.getConnection();
    234             preparedStatement = connection.prepareStatement(sql);
    235             preparedStatement.setString(1,username);
    236             preparedStatement.setString(2,password);
    237             preparedStatement.executeUpdate();
    238             flag = "注册成功!";
    239         } catch (Exception e) {
    240             e.printStackTrace();
    241             flag = "注册失败!";
    242         }finally {
    243             jdbcUtils.releaseDB(null,preparedStatement,connection);
    244         }
    245         return flag;
    246     }
    247 
    248 
    249     /**
    250      * 使用PreparedStatement执行插入
    251      * @throws SQLException
    252      */
    253     public void testPrepareStatement() throws SQLException {
    254         Connection connection = null;
    255         PreparedStatement preparedStatement = null;
    256         String sql = "insert into customers(name,email,birth) values(?,?,?)";
    257         jdbcUtils = new JDBCUtils();
    258         try {
    259             connection = jdbcUtils.getConnection();
    260             preparedStatement = connection.prepareStatement(sql);
    261             preparedStatement.setString(1,"李达康");
    262             preparedStatement.setString(2,"12345@163.com");
    263             preparedStatement.setDate(3,new Date(new java.util.Date().getTime()));//传入时间的时候要特别注意
    264             preparedStatement.executeUpdate();
    265         } catch (Exception e) {
    266             e.printStackTrace();
    267         }finally {
    268             jdbcUtils.releaseDB(null,preparedStatement,connection);
    269         }
    270     }
    271 
    272     /**
    273      * 根据某一列的信息查询所有对象的数据;例如:根据准考证号或者身份证号查询成绩
    274      * @throws Exception
    275      */
    276     public void getStudentInfo() throws Exception {
    277         //1.得到查询类型
    278         int searchType = getSearchTypeFromConsole();
    279         //2.具体查询学生信息
    280         Student student = searchStudent(searchType);
    281         //3.打印学生信息
    282         printStudent(student);
    283     }
    284 
    285     /**
    286      * 打印学生信息:存在打印具体信息,
    287      * @param student
    288      */
    289     private void printStudent(Student student) {
    290         if (student != null){
    291             System.out.println(student);
    292         }else {
    293             System.out.println("无查找结果!");
    294         }
    295 
    296     }
    297 
    298     /**
    299      * 具体查询学生信息的,返回一个Student对象,若不存在,则返回null
    300      * @param searchType
    301      * @return
    302      */
    303     private Student searchStudent(int searchType) throws Exception {
    304         String sql = "SELECT * FROM TestGrad WHERE ";
    305 //        String sql = "SELECT flowid, type, idcard, examcard,studentname, location, grade FROM TestGrad WHERE ";
    306         Scanner scanner = new Scanner(System.in);
    307         //1.根据searchType,提示用户输入
    308         //1.1若searchType为1,提示:请输入身份证号,若为2:请输入准考证号
    309         if (searchType == 1){
    310             System.out.print("请输入准考证号:");
    311             String examCard = scanner.next();
    312             sql = sql + "examcard = '" + examCard + "'";
    313         }else {
    314             System.out.print("请输入身份证号:");
    315             String idCard = scanner.next();
    316             sql = sql + "idCard = '" + idCard + "'";
    317         }
    318         //2.执行查询
    319         Student student = getStudent(sql);
    320 
    321         //3、存在返回查询结果
    322         return student;
    323     }
    324 
    325     /**
    326      * 使用PrepareStatement进行查询操作
    327      * 根据传入的Sql 返回student对象,
    328      * @param sql
    329      * @param args
    330      * @return
    331      */
    332     private Student getStudent(String sql,Object... args) throws SQLException {
    333         Student student = null;
    334 
    335         Connection connection = null;
    336         PreparedStatement preparedStatement = null;
    337         ResultSet resultSet = null;
    338 
    339         jdbcUtils = new JDBCUtils();
    340         try {
    341             connection = jdbcUtils.getConnection();
    342             preparedStatement = connection.prepareStatement(sql);
    343             for (int i=0;i<args.length;i++){
    344                 preparedStatement.setObject(i+1,args[i]);
    345             }
    346             resultSet = preparedStatement.executeQuery();
    347             while (resultSet.next()){
    348                 student = new Student();
    349                 student.setFlowId(resultSet.getInt(1));
    350                 student.setType(resultSet.getInt(2));
    351                 student.setIdCard(resultSet.getString(3));
    352                 student.setExamCard(resultSet.getString(4));
    353                 student.setStudentName(resultSet.getString(5));
    354                 student.setLocation(resultSet.getString(6));
    355                 student.setGrade(resultSet.getInt(7));
    356             }
    357         } catch (Exception e) {
    358             e.printStackTrace();
    359         }finally {
    360             jdbcUtils.releaseDB(resultSet,preparedStatement,connection);
    361         }
    362         System.out.println("传入的sql值为:" + sql);
    363         return student;
    364     }
    365 
    366     /**
    367      * 使用Statement进行查询操作
    368      * 根据传入的Sql 返回student对象,
    369      * @return
    370      */
    371     private Student getStudent(String sql) throws SQLException {
    372 
    373         Student student = null;
    374 
    375         Connection connection = null;
    376         Statement statement = null;
    377         ResultSet resultSet = null;
    378 
    379         jdbcUtils = new JDBCUtils();
    380         try {
    381             connection = jdbcUtils.getConnection();
    382             statement = connection.createStatement();
    383             resultSet = statement.executeQuery(sql);
    384             while (resultSet.next()){
    385                 student = new Student(
    386                         resultSet.getInt(1),
    387                         resultSet.getInt(2),
    388                         resultSet.getString(3),
    389                         resultSet.getString(4),
    390                         resultSet.getString(5),
    391                         resultSet.getString(6),
    392                         resultSet.getInt(7));
    393             }
    394         } catch (Exception e) {
    395             e.printStackTrace();
    396         }finally {
    397             jdbcUtils.releaseDB(resultSet,statement,connection);
    398         }
    399         System.out.println("传入的sql值为:" + sql);
    400         return student;
    401     }
    402 
    403     /**
    404      * 从控制台读入一个整数,确定要查询的类型
    405      * @return 1.用身份证查询 2.用准考证号查询, 其他的无效,并提示用户重新输入
    406      */
    407     private int getSearchTypeFromConsole() {
    408         System.out.println("1.用准考证号查询 2.用身份证查询");
    409         Scanner scanner = new Scanner(System.in);
    410         int type = scanner.nextInt();
    411         if (type != 1 && type != 2){
    412             System.out.print("输入错误请重新输入");
    413             throw new RuntimeException();
    414         }
    415         return type;
    416     }
    417 
    418     /**
    419      * 使用Statement执行插入语句;非常麻烦,注意与PrepareStatement执行插入的区别
    420      * @throws Exception
    421      */
    422     public void addNewStudent() throws Exception {
    423         student = getStudentFromConsole();
    424 //        addNewStudent(student);
    425         addNewStudent2(student);
    426     }
    427 
    428     private Student getStudentFromConsole(){
    429 
    430         Scanner scanner = new Scanner(System.in);
    431         student = new Student();
    432 
    433         System.out.print("FlowId: ");
    434         student.setFlowId(scanner.nextInt());
    435 
    436         System.out.print("Type: ");
    437         student.setType(scanner.nextInt());
    438 
    439         System.out.print("IdCard:");
    440         student.setIdCard(scanner.next());
    441 
    442         System.out.print("ExamCard:");
    443         student.setExamCard(scanner.next());
    444 
    445         System.out.print("StudentName: ");
    446         student.setStudentName(scanner.next());
    447 
    448         System.out.print("Location:");
    449         student.setLocation(scanner.next());
    450 
    451         System.out.print("Grade: ");
    452         student.setGrade(scanner.nextInt());
    453 
    454         return  student;
    455     }
    456 
    457     public void addNewStudent(Student student) throws Exception {
    458         //1.准备一条sql语句:
    459         String sql = "INSERT INTO TestGrad VALUES(" + student.getFlowId()
    460                 + "," + student.getType() + ",'" + student.getIdCard() + "','"
    461                 + student.getExamCard() + "','" + student.getStudentName()
    462                 + "','" + student.getLocation() + "'," + student.getGrade()
    463                 + ")";
    464 
    465         jdbcUtils.update(sql);
    466     }
    467 
    468     /**
    469      * 使用PrepareStatement
    470      * @param student
    471      * @throws SQLException
    472      */
    473     public void addNewStudent2(Student student) throws SQLException {
    474         jdbcUtils = new JDBCUtils();
    475         String sql = "insert into testgrad(flowid,type,idcard,examcard,studentname,location,grade) values(?,?,?,?,?,?,?)";
    476         jdbcUtils.update(sql,student.getFlowId(),student.getType(),
    477                 student.getIdCard(),student.getExamCard(), student.getStudentName(),
    478                 student.getLocation(),student.getGrade());
    479     }
    480 
    481     /**
    482      * 使用Statement查询数据库的左右信息(查询四六级所有信息)
    483      * @throws SQLException
    484      */
    485     public void allTotalInfo() throws SQLException {
    486         String sql = null;
    487         Connection connection = null;
    488         Statement statement = null;
    489         ResultSet resultSet = null;
    490         jdbcUtils = new JDBCUtils();
    491 //        sql = "delete from customers where id = 1";//删除第一条记录
    492 //        sql = "update customers set name = 'Tom' where id = 2";//查询id为2的记录
    493         sql = "select flowid ,type,idcard,examcard,studentname,location,grade from testgrad";//查询所有结果
    494 
    495         try {
    496             connection = jdbcUtils.getConnection();
    497             statement = connection.createStatement();
    498             resultSet = statement.executeQuery(sql);
    499             while (resultSet.next()){
    500                 int id = resultSet.getInt("flowid");
    501                 int grad = resultSet.getInt("type");
    502                 String idnumber = resultSet.getString("idcard");
    503                 String ticketnumber = resultSet.getString("examcard");
    504                 String name = resultSet.getString("studentname");
    505                 String area = resultSet.getString("location");
    506                 int score = resultSet.getInt("grade");
    507                 System.out.println("流水号:" + id);
    508                 System.out.println("四级/六级:" + grad);
    509                 System.out.println("身份证号:" + idnumber);
    510                 System.out.println("准考证号:" + ticketnumber);
    511                 System.out.println("姓名:" + name);
    512                 System.out.println("区域:" + area);
    513                 System.out.println("得分:" + score);
    514                 System.out.println();
    515             }
    516         } catch (Exception e) {
    517             e.printStackTrace();
    518         }finally {
    519             jdbcUtils.releaseDB(resultSet,statement,connection);
    520         }
    521     }
    522 }


    关于properties文件存放的位置:

          一般放在和引用此properties文件的类的包下,然后使用如下代码引用:(相对路径的应用方法)

         

    1      InputStream in = getClass().getResourceAsStream("mysql.properties");
    2      Properties properties = new Properties();
    3      properties.load(in);

        使用绝对路径引用一直出错!!!!!将properties文件放在工程根目录一直引用失败!!!!后续将继续解决路径问题!!!

  • 相关阅读:
    iOS 远程推送
    iOS 本地推送
    iOS 循环利用的注意事项
    iOS 通知代理执行代理方式时,代理为nil的解决办法
    iOS SSZipArchive
    iOS PushMebaby
    Objective
    Objective
    Objective
    Objective
  • 原文地址:https://www.cnblogs.com/zengjiqiang/p/6720020.html
Copyright © 2011-2022 走看看