社区
DB2
帖子详情
通过jdbc2访问db2怎样使用updatable Resultset?
azurereverie
2003-10-21 10:22:25
我用的db2 7.0,使用数据库自带的jdbc2的驱动,Resultset的诸如getString等方法都可以用,想在java中使用Resultset的updateString一类方法,但是运行时却报错:该版本的驱动程序不支持updatable Resultset,请问是不是还需要什么配置,或者需要更高级的驱动?
...全文
43
8
打赏
收藏
通过jdbc2访问db2怎样使用updatable Resultset?
我用的db2 7.0,使用数据库自带的jdbc2的驱动,Resultset的诸如getString等方法都可以用,想在java中使用Resultset的updateString一类方法,但是运行时却报错:该版本的驱动程序不支持updatable Resultset,请问是不是还需要什么配置,或者需要更高级的驱动?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
db2boy
2003-10-29
打赏
举报
回复
ado只不过给你提供了一个方便的手段。如果觉得官方的jdbc麻烦,可以去找open source的东西。
db2boy
2003-10-29
打赏
举报
回复
你用什么,最终的接口也都是sql
db2boy
2003-10-28
打赏
举报
回复
修改数据不用sql用什么,你的批量修改是什么意思?一条语句改多行数据吗,你直接执行update语句不就行了。
Statement updStmt = con.createStatement();
int numRows = updStmt.executeUpdate
("更新语句");
azurereverie
2003-10-28
打赏
举报
回复
你不会只用过sql修改数据吧?
因为我以前用ADO的时候,能够用recordset来修改记录集,这样做有时候比用sql来更新强的多。比如传给我一个字段名和字段值的二维数组,我可以用一个for循环就完成对多条记录的更新或新增,字段值的类型由生成数组的人确保与数据库统一,最大的好处是代码简洁易于维护。
假如用这个二维数组来生成sql,你就会在类型的问题上煞费苦心,比如字段值为字符串的加引号,数值型的不加引号,如果由于更新的记录数过多而导致最后生成的sql太长不能一次执行,还得拆分一下,我就曾遇过这类情况。
如果ResultSet的update等方法可以用就达到同样效果了,不过jdbc可用的方法太少了,在jdk文档里提到的很多方法不能用,还有如first(),last()等,想来好像就一个next()来单向遍历记录集,有点上当的感觉!
azurereverie
2003-10-27
打赏
举报
回复
你说的那是用sql修改数据库,除此之外就没有其他方法吗?
如果批量修改,岂不是要写一大扒拉sql?
db2boy
2003-10-23
打赏
举报
回复
这个跟钱没有关系
jefrry
2003-10-22
打赏
举报
回复
我用的是8.1的从网上down的,也不可以,是不是因为没掏钱的缘故?
db2boy
2003-10-22
打赏
举报
回复
这样试试,能修改。
PreparedStatement pUpd = con.prepareStatement
("UPDATE TEMPL " +
" SET SALARY =?"+
" WHERE EMPNO =?");
pUpd.setString(1,argv[1]);
pUpd.setString(2,argv[2]);
int numRows = pUpd.executeUpdate();
jsp连接数据库大全
一定将
jdbc
的驱动程序放到服务器的类路径里,然后要在数据库里建一个表test,有两个字段比如为test1,test2,可以用下面SQL建 create
table
test(test1 varchar(20),test2 varchar(20) 然后向这个表写入一条测试纪录 一、jsp连接Oracle8/8i/9i数据库(用thin模式) testoracle.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("oracle.
jdbc
.driver.OracleDriver").newInstance(); String url="
jdbc
:oracle:thin:@localhost:1521:orcl"; //orcl为你的数据库的SID String user="scott"; String password="tiger"; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> 二、jsp连接Sql Server7.0/2000数据库 testsqlserver.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("com.microsoft.
jdbc
.sqlserver.SQLServerDriver").newInstance(); String url="
jdbc
:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; //pubs为你的数据库的 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> 三、jsp连接
DB2
数据库 test
db2
.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("com.ibm.
db2
.
jdbc
.app.
DB2
Driver ").newInstance(); String url="
jdbc
:
db2
://localhost:5000/sample"; //sample为你的数据库名 String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> 四、jsp连接Informix数据库 testinformix.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("com.informix.
jdbc
.IfxDriver").newInstance(); String url = "
jdbc
:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword"; //testDB为你的数据库名 Connection conn= DriverManager.getConnection(url); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> 五、jsp连接Sybase数据库 testmysql.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("com.sybase.
jdbc
.SybDriver").newInstance(); String url ="
jdbc
:sybase:Tds:localhost:5007/tsdata"; //tsdata为你的数据库名 Properties sysProps = System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn= DriverManager.getConnection(url, SysProps); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> 六、jsp连接MySQL数据库 testmysql.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); String url ="
jdbc
:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" //testDB为你的数据库名 Connection conn= DriverManager.getConnection(url); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> 七、jsp连接PostgreSQL数据库 testmysql.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("org.postgresql.Driver").newInstance(); String url ="
jdbc
:postgresql://localhost/soft" //soft为你的数据库名 String user="myuser"; String password="mypassword"; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1)%> 您的第二个字段内容为:<%=rs.getString(2)%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %>
java程序是怎么操作数据库的,可以以常用据库为例,求详细解答,最好能举例。
java 实现连接sql server 20002007-12-16 13:28:00.0 第一种:通过ODBC连接数据库 JAVA语言的跨平台的工作能力(Write Once ,Run Anywhere)、优秀的图像处理能力(我相信现在没有那种语言可以超过JAVA在网络上的图形处理能力)、网络通信功能、通过
JDBC
数据库
访问
技术等等,让我们谁都不可否认JAVA语言是SUN公司对于计算机界的一个巨大的贡献。笔者可以描述这样一个场景:有一天你上网完全可以不用IE 或者NETSCAPE,上网就像是玩游戏,你可以获得游戏那么精美的图像和互动的感觉,如果你玩过UO,也许你就知道那种感觉了,但是JAVA做成的东西一定会超过UO的,因为不单单是游戏,也不是单单是浏览器,如果你愿意(要你有钱,有时间,有优秀的JAVA人才)你可以把所有的这一切用Java完全集成出来!!!我不是夸大JAVA的功能,大家可以
访问
一下http://www.simchina.net的那个社区程序,你就能找到一种感觉了:相信我没有说什么假话 。好了,不说废话了,现在我向你介绍JAVA的数据库
访问
技术----
JDBC
数据库
访问
技术(你可千万不要搞成ODBC了哟!)。
JDBC
技术事实上是一种能通过JAVA语言
访问
任何结构化数据库的应用程序接口(API)(Sun这样说的,我也不知道是不是真的),而且现在的
JDBC
3.0据Sun说也能
访问
Execel等电子表格程序!
JDBC
对于数据库的
访问
有四种方式,我们这里只是介绍两种: 第一种是通过ODBC做为“桥”(Bridge)对数据库
访问
,第二种是直接对数据库
访问
。 我们先来看看第一种
JDBC
<-->ODBC
访问
的流程:
JDBC
Driver Mannager->
JDBC
<->ODBC桥->ODBC->数据库客户机驱动库->数据库服务器->返回查询结果,在这种
访问
中值的我们注意的是虽然JAVA是"Write Once ,Run Anywhere",但是如果通过这种
访问
的话,需要客户端必须设置ODBC和有相应的数据库客户机的驱动,当你看了下面的另外一个流程的时候或许你会想:明明下一种更方面,为什么还要有这个东西的产生!呵呵,因为,未必所有的数据库服务器提供商都提供下面的
JDBC
驱动程序(给
JDBC
访问
提供相应的接口),所以就有了
JDBC
<->ODBC Bridge。 接着再让我们来看看第二种
访问
流程:
JDBC
Driver Mannager->局部
JDBC
驱动->客户端数据库->数据库服务器->返回查询结果,这种
访问
事实上是转换
JDBC
调用为相应的数据库(Oracle, Sybase, Informix,
DB2
, 和其他的数据库数据库管理系统)的客户端API调用(这么说,不知道大家能不能懂,说简单点就好像ASP不是通过DSN对数据库
访问
而是通过OLEDB
访问
,说道这里我还是不知道大家能不能明白我的意思。哎呀,不要扔鸡蛋嘛!),这种方式的
访问
需要相应的数据库提供商提供相应的
JDBC
驱动程序,但是有一种好处,可以独立于odbc用于可以随处可Run的客户端的浏览器中的Applet程序。 我们下面将给大家一个通过
JDBC
-ODBC桥数据库
访问
的实例,但是在看下面的事例前我想问大家一次:JDK1.3装了吗?数据库驱动装了吗(我
使用
的是SQLserver)?你该没有
使用
Linux吧?虽然java支持Linux,但是老兄我可没有
使用
Linux哟(这同JAVA的Write Once ,Run Anywhere没有关系),由于
使用
了运行于Win下面的ODBC,我建议你看看这篇东西http://www.aspcn.com/showarticle.asp?id=112,否则你要是有了问题,出不了结果那岂不是要怪我(不过欲加之罪,何患无吃... ...),冤枉呀! 哎呀,说了这么多的废话,还是让我们来看看到底
JDBC
的调用吧!既然我们是通过odbc
访问
数据库,所以这个odbc是跑不了的,我们先来设置你的odbc:打开你的odbc数据源->选择系统dsn(Click加新的dsn-)->接下来输入选择数据库类型、输入dsn名:、选择服务器、连接数据库的方式、输入数据库的登陆用户和密码->测试连接,如果测试成功的话,那么你的dsn就建立好了,我的dsn名为Sqlserver.
使用
的是sqlserver7.0,以 “sa”登陆,密码为空。这些东西都是后面要用道的! 好了下面让我们来看程序代码: (该代码已经通过运行) //########################################################### //代码开始 //########################################################### import java.sql.*; //加载java数据连接包,java基本所有的数据库的调用的都在这个东西里面 public class InsertCoffees { public static void main(String args[]) { String url = "
jdbc
:odbc:sqlserver"; //取得连接的url名,注意sqlserver是dsn名 Connection con; //实例化一个Connection对象 Statement stmt; String query = "select * from col_link"; //选择所有的Col_link表中的数据输出 try { Class.forName("sun.
jdbc
.odbc.
Jdbc
OdbcDriver"); //加载
jdbc
-odbc桥驱动 } catch(java.lang.ClassNotFoundException e) { System.err.print("ClassNotFoundException: "); //加载
jdbc
-odbc桥错误 System.err.println(e.getMessage()); //其他错误 } try { con = DriverManager.getConnection(url, "sa", ""); //数据库连接 stmt = con.createStatement(); //Create 一个声明 stmt.execute
Upda
te("CREATE
TABLE
col_link (sitename varchar (20) NULL ,siteurl varchar (50) NULL) "); //执行了一个sql语句生成了一个表col_link的表 stmt.execute
Upda
te("insert into col_link values('ASP中华网','http://www.aspcn.com')"); stmt.execute
Upda
te("insert into col_link values('永远到底有多远','http://xuankong.com')"); //执行一个insert into语句 stmt.execute
Upda
te("
upda
te col_link set siteurl='http://www.aspcn.com/xuankong/xuankongt.jpg' where siteurl='http://xuankong.com'"); //执行一个
upda
te语句,更新数据库
ResultSet
rs = stmt.executeQuery(query); //返回一个结果集 System.out.println("Col_link表中的数据如下(原始数据)"); //下面的语句
使用
了一个while循环打印出了col_link表中的所有的数据 System.out.println("站点名 "+" "+"站点地址"); System.out.println("---------------"+" "+"----------------"); while (rs.next()) { String s = rs.getString("sitename"); String f = rs.getString("siteurl"); //取得数据库中的数据 System.out.println(s + " " + f); /*String t = rs.getString(1); String l = rs.getString(2); System.out.println(t + " " + l);*/ /*
jdbc
提供了两种方法识别字段,一种是
使用
getXXX(注意这里的getXXX表示取不同类型字段的不同的方法)获得字段名, 第二种*是通过字段索引,在这里我把第二种方法注释了*/ /*你可以
访问
这个连接获得getxxx的用法:http://java.sun.com/docs/books/tutorial/
jdbc
/basics/_retrieving
Table
.html*/ } stmt.close(); con.close(); //上面的语句关闭声明和连接 } catch(SQLException ex) { System.err.println("SQLException: " + ex.getMessage()); //显示数据库连接错误或者查询错误 } } } //########################################################### //代码结束 //########################################################### 在上面这个程序中我想你展示了如何
使用
JDBC
-ODBC连接数据库,
使用
SQL语句生成一个表,
使用
SELECT、INSERT 、
UPDA
TE语句取的、插入和更新一个表中的数据,如何通过字段名和字段索引
访问
数据库中的东东!我希望你能从上面的代码真正的学习到一些东西! 发挥你的想象力,设想一下JAVA到底,比如说可以通过数据库做一个不需要GUI(图形用户界面)的聊天室,呵呵,感觉起来就像在DOS环境下打字的聊天室!哈哈! 最后需要说的是笔者的调试上面程序的环境:WIN2000 , JDK1.3,MS SQLSERVER编辑软件:EDITPLUS 2.01a(这最后的东西可不是废话,虽然早就了一些专业的JAVA开发工具,但是笔者建议JAVA初学者
使用
文本软件开发JAVA程序) 第二种:直接用
jdbc
访问
数据库 (1) 该实例已经运行通过 jsp连接Sql Server7.0/2000数据库 testsqlserver.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <%Class.forName("com.microsoft.
jdbc
.sqlserver.SQLServerDriver").newInstance(); String url="
jdbc
:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; //pubs为你的数据库的 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); Statement stmt=conn.createStatement(
ResultSet
.TYPE_SCROLL_SENSITIVE,
ResultSet
.CONCUR_
UPDA
TABLE
); String sql="select * from test";
ResultSet
rs=stmt.executeQuery(sql); while(rs.next()) {%> 您的第一个字段内容为:<%=rs.getString(1);%> 您的第二个字段内容为:<%=rs.getString(2);%> <%}%> <%out.print("数据库操作成功,恭喜你");%> <%rs.close(); stmt.close(); conn.close(); %> (2)java
访问
sqlserver服务器 第一步:安装
jdbc
点击SQL Server for
JDBC
驱动程序安装程序setup.exe(可以到微软网站下载 http://msdn.microsoft.com/library/default.asp?rul=/downloads/list/sqlserver.asp下载) 第二步:设置系统变量classpath 假设SQL Server for
JDBC
驱动程序安装在d:\
jdbc
\,则classpath应该设置如下: classpath:=.;…;d:\
jdbc
\lib; d:\
jdbc
\lib\mssqlserver.jar; d:\
jdbc
\lib\msutil.jar; d:\
jdbc
\lib\msbase.jar; 注意:设置时要在最前面的点号和分号 第三步:编辑java程序并且运行 实例1如下: //import com.microsoft.*; //注意:在java与sql server 连接时不需要这个包,其他书上说这个包是必需的,这个问题有待进一步讨论 import java.sql.*; import java.net.URL; class insert { public static void main(String[] args) { String url="
jdbc
:microsoft:sqlserver://localhost:1433;DatabaseName=northwind"; String query="select * from categories"; String query1="insert categories values(10,'Hanbao','Sweet')"; String query2="insert categories values(11,'Naicha','Coffee taste')"; try { Class.forName("com.microsoft.
jdbc
.sqlserver.SQLServerDriver"); Connection con=DriverManager.getConnection(url,"sa","739555"); Statement stmt=con.createStatement(); stmt.execute
Upda
te(query1); stmt.execute
Upda
te(query2); stmt.close(); con.close(); } catch(SQLException ex) { } catch(java.lang.Exception ex) { ex.printStackTrace(); } } } 实例2如下: //import com.microsoft.*; //注意:在java与sql server 连接时不需要这个包,其他书上说这个包是必需的,这个问题有待进一步讨论 import java.sql.*; import java.net.URL; class java2sqlserver { public static void main(String[] args) { String url="
jdbc
:microsoft:sqlserver://localhost:1433;User=sa;Password=739555;DatabaseName=northwind"; String query="Select * From Categories"; try { Class.forName("com.microsoft.
jdbc
.sqlserver.SQLServerDriver"); //DriverManager.setLogStream(System.out); Connection con=DriverManager.getConnection(url); checkForWarning(con.getWarnings()); Statement stmt=con.createStatement();
ResultSet
rs=stmt.executeQuery(query); disp
ResultSet
(rs); rs.close(); stmt.close(); con.close(); } catch(SQLException ex) { System.out.println(ex.toString()+"----SQLException caught----"); while(ex!=null) { System.out.print("SQLState:"+ex.getSQLState()); System.out.print("Message:"+ex.getMessage()); System.out.print("Vendor:"+ex.getErrorCode()); ex=ex.getNextException(); System.out.println(""); } } catch(java.lang.Exception ex) { ex.printStackTrace(); } } private static boolean checkForWarning(SQLWarning warn) { boolean rc=false; if(warn!=null) { System.out.println("----Warning----"); rc=true; while(warn!=null) { System.out.print("SQLState:"+warn.getSQLState()); System.out.print("Message:"+warn.getMessage()); System.out.print("Vendor:"+warn.getErrorCode()); System.out.println(""); warn=warn.getNextWarning(); } } return rc; } private static void disp
ResultSet
(
ResultSet
rs) throws SQLException { int i;
ResultSet
MetaData rsmd=rs.getMetaData(); int numCols=rsmd.getColumnCount(); for(i=1;i<=numCols;i++) { if(i>1) System.out.print(", "); System.out.print(rsmd.getColumnLabel(i)); } System.out.println(""); boolean more=rs.next(); while(more) { for(i=1;i
DB2
ResultSet
用法
http://blog.csdn.net/ming2316780/article/details/48544785
JDBC
API 2.0/3.0中
ResultSet
记录集的简便实用的新特性 1 新定义了若干个常数 这些常数用于指定
ResultSet
的类型游标移动的方向等性质,如下所示: public static final int FETCH_FORWARD; 该常数的作用是
JDBC
ResultSet
方法大全
ResultSet
方法大全: boolean absolute(int row)
JDBC
2.0。将游标移至结果集中的给定行号。 void afterLast()
JDBC
2.0。将游标移至结果集的末尾,正好在最后一行的后面。 void beforeFirst()
JDBC
2.0。将游标移至结果集的前方,正好在第一行的前面。 void clearWa...
[转载]
使用
JDBC
连接不同版本
DB2
数据库的兼容性问题
使用
JDBC
连接不同版本
DB2
数据库的兼容性问题
DB2
与
JDBC
支持 依照
JDBC
规范,有四种类型的
JDBC
驱动程序体系结构: Type 1:这类驱动程序将
JDBC
API 作为到另一个数据
访问
A...
DB2
5,889
社区成员
11,654
社区内容
发帖
与我相关
我的任务
DB2
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
复制链接
扫一扫
分享
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章