follow大神教程——实践java爬虫之七

在db0703中创建cfsn_news表

CREATE TABLE cfsn_news( id   INT AUTO_INCREMENT, title  VARCHAR(10),URL  VARCHAR(255), PRIMARY KEY (id));

修改一个表中字段为自动增长:

alter table questionlib modify id int(11) auto_increment; 
这样应该可以的,修改后从下一条记录开始自动增长。 
如果想让原来的自动增长就得复制现有表的结构(无id),添加id并加上AUTO_INCREMENT,然后通过循环,添加n条空记录,然后对应先前表的id,依次插入数据。

http://zhidao.baidu.com/link?url=ikzYDJxRwVfIFEF1q15xTV43t5gvcLPmgUOzKXyHPOND59Ozf-ZWjQ7AY_q5YfkUfwglSzEb2Izp9NwuyECr86vxgGo1moBD4b-PdUUM2gS

通过 AUTO_INCREMENT设置
SQL  INSERT 语句的时候,要避免 指定那个自增的字段.否则会发生主键的冲突。
通过  ALTER  TABLE 语句 可以修改 自增的数值, 但是只能增加,不能减少。
TRUNCATE  TABLE  语句,会将自增ID重置为零。
 
mysql>   CREATE    TABLE    test_create_tab2 ( 
      ->   id     INT     AUTO_INCREMENT, 
      ->   val    VARCHAR  (10), 
      ->     PRIMARY    KEY    (id) 
      -> ); 
Query OK, 0   rows    affected (0.09 sec) 
 
mysql>   INSERT    INTO    test_create_tab2(val)   VALUES    (  'NO id'  ); 
Query OK, 1 row affected (0.03 sec) 
 
mysql>   select    last_insert_id()   as    id; 
+  ----+ 
| id | 
+  ----+ 
|  1 | 
+  ----+ 
1 row   in    set    (0.00 sec) 
 
mysql>   INSERT    INTO    test_create_tab2(val)   VALUES    (  'NO id 2'  ); 
Query OK, 1 row affected (0.03 sec) 
 
mysql>   select    last_insert_id()   as    id; 
+  ----+ 
| id | 
+  ----+ 
|  2 | 
+  ----+ 
1 row   in    set    (0.00 sec) 
 
mysql>   select    *   from    test_create_tab2; 
+  ----+---------+ 
| id | val     | 
+  ----+---------+ 
|  1 |   NO    id   | 
|  2 |   NO    id 2 | 
+  ----+---------+ 
2   rows    in    set    (0.00 sec)

 删除一个表

drop table cfsnnews;【居然把drop错写成dorp了,真是的】

数据库基本上没问题了,回头看Java代码中最后打印的时候用的ArrayList,那ArrayList和数组如何相互转化呢?

temporary.java

import java.util.Arrays;
import java.util.List;

public class temporary{
 public static void main(String[] args) {
 // 数组转换为List,其中参数为任意类型
 List<String> list = Arrays.asList(new String[]{"a","b","c"});
 // List转换为数组,参数指定数组的类型
   String[] a = list.toArray(new String[0]);
 // 打印
   System.out.println(list);
   for(String b : a){
    System.out.print(b+" ");
   }
   
 }
}

输出:

[a, b, c]
a b c

其中List转换为数组可以用更容易理解的两句实现

String[] a= new String[list.size()];
 list.toArray(a);

【貌似List和ArrayList还不太一样】(http://blog.csdn.net/duanyipeng/article/details/7851138

简单点的话ArrayList可通过ArrayList.get(i)来循环赋值到数组之中。

 此处较为深入http://www.cnblogs.com/happyPawpaw/archive/2012/10/22/2734140.html

ArrayList<String> list=new ArrayList<String>();
String strings[]=(String [])list.toArray();

这样写代码个人觉得应该没什么问题,编译也没有问题。可是具体运行的时候报异常,如下:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
但是这么写是没有问题的:
ArrayList<String> list=new ArrayList<String>();
String strings[]=new String[list.size()];
for(int i=0,j=list.size();i<j;i++){
strings[i]=list.get(i);
}
对于这个现象我们可以这么解释:Java中允许向上和向下转型,但是这个转型是否成功是根据Java虚拟机中这个对象的类型来实现的。Java虚拟机中保存了每个对象的类型。而数组也是一个对象。数组的类型是[Ljava.lang.Object。把[Ljava.lang.Object转换成[Ljava.lang.String是显然不可能的事情,因为这里是一个向下转型,而虚拟机只保存了这是一个Object的数组,不能保证数组中的元素是String的,所以这个转型不能成功。数组里面的元素只是元素的引用,不是存储的具体元素,所以数组中元素的类型还是保存在Java虚拟机中的。

根据上面的解释,我们可以把这个问题归纳到下面这个模型:
Object objs[]=new Object[10];
String strs[]=(String[])objs;

这样子和刚才上面编译错误是一样的。如果我们修改一下这个代码,如下:
String strs[]=new String[10];
Object objs[]=strs;

这样子就可以编译通过了。

只要能将要的信息转化为数组,一切就好办了,

在main类中测试一下(打印出最后五条信息测试一下)

public class Main {
 public static void main(String args[]) {
  // 定义即将访问的链接
  String url = "http://www.cfsn.cn/news/node_4534.htm";
  // 访问链接并获取页面内容
  String content = Spider.SendGet(url);
  // 获取该页面的所有的Cfsn对象
  ArrayList<Cfsn> myCfsn = Spider.GetCfsn(content);
  
  String[] titleArray = new String[myCfsn.size()];
  String[] urlArray = new String[myCfsn.size()];
    //循环赋值
  for(int i=0;i<titleArray.length;i++){
   titleArray[i]=myCfsn.get(i).title;
   urlArray[i]=myCfsn.get(i).CfsnUrl;
  }
  for(int i=45;i<titleArray.length;i++){
   System.out.println(titleArray[i]+"&"+urlArray[i]);
  }
  // 打印结果
  //System.out.println(myCfsn);
 }
}

 运行结果

113429_yGIG_576429.png

很好,现在可以为所欲为操作数组中的数据了

操作小技巧:shift+tab:整段代码左移;

因为网址字段有特殊符号,将数组内容赋给sql语句的过程中出错了

  //循环插入操作

   for(int i=0;i<titleArray.length;i++){

    String sql_insert="insert into cfsn_news(title,URL) "

      + "values("+titleArray[i]+","+urlArray[i]+")";

    //excuteUpdate执行完后,返回影响表的行数

    int result=statement.executeUpdate(sql_insert);

    if(result!=1){

     System.out.println("第"+i+"次插入结果受影响行数不等于1!!");

    }

    

   }

问问度娘(http://zhidao.baidu.com/link?url=SPHPJq9b5OZd1nj0cX8Y7--mfMmvuAvOfIiUV8PdhA9TwLKHf0W5r15j8ZF50secQBzUPCNKP10jE5GW6u6zHq

加单引号或许可以,先在mysql中测试下

 

mysql> insert into cfsn_news(title,url) values('baidu','http://www.baidu.com');
Query OK, 1 row affected

mysql> select *from cfsn_news;
+----+-------+----------------------+
| id | title | URL                  |
+----+-------+----------------------+
|  1 | ceshi | http://www.baidu.com |
|  2 | baidu | http://www.baidu.com |
+----+-------+----------------------+
2 rows in set

 

运行结果

Data truncation: Data too long for column 'title' at row 1

(好坑)

navicat小技巧:左上角选项符号——文件——设计表,修改title字段的大小为255;

运行:

113752_cYWa_576429.png

此时没有报错,我希望执行成功了,god bless me;

查看数据库内容

哇!!

 

114140_bOIf_576429.png

114141_2NA0_576429.png

成功了,可以睡觉了!!

 

转载于:https://my.oschina.net/SnifferApache/blog/287091

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值