BBS
lomboz_eclipse_jdbc
lomboz eclipse
安装:google关键词“lomboz eclipse”(选择all-in-one版)
- Eclipse的J2EE插件版
- Eclipse基于插件实现扩展
- lomboz要依赖于其它Eclipse插件
- 竞争对手
- MyEclipse(比lomboz好使,但收费)
- Jbuilder(收费)
JDBC
JDBC ( Java Database Connectivity ) ——数据库联结纽带
JDBC简介
JDBC两端
SQL语言回顾
- Select
- select * from T where …
- Insert
- insert into T values ( … )
- Create
- create table T ( … )
- Delete
- delete from T where …
- Update
- update T set t1 = … and t2 = … where t3 = …
- Drop
- drop table T
JDBC基础编程
JDBC编程步骤:
1. Load the Driver1) 把classes12.jar ( D:\tools\Oracle10.2.0.4\client\lib\classes12.jar ) 添加到eclipse中
2) Class.forName(“DriverName”) | Class.forName().newInstance() | new DriverName()3) 实例化时自动向DriverManager注册,不需显示调用DriverManager.registerDriver方法
2. Connect to the DataBase
DriverManager.getConnection()
3. Execute the SQL
1) Connection.createStatement()2) Statement.executeQuery()3) Statement.executeUpdate()
4. Retrieve the result data
循环取得结果while(rs.next())
5. Show the result data
将数据库中的各种类型转换为Java中的类型(getXXX)方法
6. Close ( 后打开的先关 )
close the resultset / close the statement / close the connection
package jdbc;
import java.sql.*;
public class TestJDBC {
public static void main(String[] args) {
/**
* JDBC编程步骤:
* 1.new 一个 driver,向DriverManager注册(自动注册)
* 2.通过DriverManager.getConnection()方法,向它传递 JDBC 链接url、用户名、密码
* 3.创建一个Statement对象,通过Statement来执行SQL语句
* 4.拿到ResultSet
* 5.对ResultSet进行遍历
* 6.把该关的关了
*/
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//new oracle.jdbc.driver.OracleDriver();//另一种写法
//jdbc:oracle:thin:@ip地址:端口:orcal的SID
conn = DriverManager.getConnection("jdbc:oracle:thin:@db.dev.ark.taobao.net:1521:ark","tbcat","tbcat");
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from auction_categories t where parent_id=1625");
//循环取得结果
while(rs.next()){
System.out.println("cat_id="+rs.getInt("cat_id"));
System.out.println("cat_name="+rs.getString("cat_name"));
}
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC处理DML语句(data manipulation language):
insert示例代码1:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TestDML {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT","scott","tiger");
stmt = conn.createStatement();
String sql = "insert into dept2 values (98,'GAME','BJ')";
stmt.executeUpdate(sql);
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在eclipse中直接观察数据库(在 lomboz eclipse中才能观察):Window → show view → other → Data → Database Explorer →Connections点右键 → new connection →
→ finish → Schemas找到自己的schemas → Tables → 找到对应的表 → 右键 → Data → Sample Contents
insert示例代码2:
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 在main命令行后输入3值,把这3值依次插入到dept2表中 *
*/
public class TestDML2 {
public static void main(String[] args) {
if (args.length != 3){
System.out.println("Parameter Error! Please Input Again!");
System.exit(-1);//-1 非正常退出
}
int deptno = 0;
try {
deptno = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("Parameter Error! Deptno should be Number Format!");
System.exit(-1);
}
String dname = args[1];
String loc = args[2];
Connection conn = null;
Statement stmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT","scott","tiger");
stmt = conn.createStatement();
String sql = "insert into dept2 values ("+ deptno +",'" +dname +"','" + loc +"')";
System.out.println(sql);
stmt.executeUpdate(sql);
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
在eclipse运行代码是需输入参数:右键 → Run AS → Run Configurations → Arguments → 在Program arguments中输入参数(多个参数直接以回车分隔) → Run
测试SQL语句常用方法:1.把SQL语句打印出来 2.然后拷贝到SQL*Plus中运行一下看看
JDBC编程高级
JDBC进阶
- 灵活指定SQL语句中的变量
- PreparedStatement
- 对存储过程进行调用
- CallableStatement
- 运用事务处理
- Transaction
- 批处理
- Batch
- Movable ResultSet
- 可以前后移动的结果集
- Rs.last()
- Rs.getRow()返回值可以确定一共有多少条记录
- 可以前后移动的结果集
- Updatable ResultSet
JDBC处理PreparedStatement
package jdbc;
import java.sql.*;
/**
* 采用PreparedStatement方式
*/
public class TestPrepStmt {
public static void main(String[] args) {
if (args.length != 3){
System.out.println("Parameter Error! Please Input Again!");
System.exit(-1);
}
int deptno = 0;
try {
deptno = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.out.println("Parameter Error! Deptno should be Number Format!");
System.exit(-1);
}
String dname = args[1];
String loc = args[2];
Connection conn = null;
PreparedStatement pstmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT","scott","tiger");
//需用Connection的prepareStatement()方法来创建pstmt
//用?这种占位符来代替有几个参数
pstmt = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
//通过PreparedStatement.setXXX()来赋值
pstmt.setInt(1, deptno);
pstmt.setString(2, dname);
pstmt.setString(3, loc);
pstmt.executeUpdate();
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
} finally {
try {
if(pstmt != null) {
pstmt.close();
pstmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC处理存储过程
sql*plus中的存储过程写法:
java的存储过程写法:
package jdbc;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;
/**
* JDBC处理存储过程
* java.sql.CallableStatement
* 注意:此处throws Exception只是为了方便看清代码结构,不建议直接throws Exception
*/
public class TestProc {
public static void main(String[] args) throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT","scott","tiger");
CallableStatement cstmt = conn.prepareCall("{call p(?, ?, ?, ?)}");//p:表示要调用的Procedure的名字
//告诉JDBC哪些参数是输出参数,通过CallableStatement.registerOutParameter()来注册
//指定类型的时候用java.sql.Types类来指定
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
//给输入参数赋值
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
//打印输出参数
System.out.println(cstmt.getInt(3));
System.out.println(cstmt.getInt(3));
cstmt.close();
conn.close();
}
}
JDBC进行批处理
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
/**
* 批处理
*/
public class TestBatch {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT","scott","tiger");
Statement stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51,'500','haha')");
stmt.addBatch("insert into dept2 values (52,'500','haha')");
stmt.addBatch("insert into dept2 values (53,'500','haha')");
stmt.executeBatch();
stmt.close();
/* PreparedStatement ps = conn.prepareStatement("insert into dept2 values (?, ?, ?)");
ps.setInt(1, 61);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.setInt(1, 62);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.setInt(1, 63);
ps.setString(2, "haha");
ps.setString(3, "bj");
ps.addBatch();
ps.executeBatch();
ps.close();
*/
conn.close();
}
}
JDBC处理Transaction
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC处理Transaction
*/
public class TestTransaction {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger");
conn.setAutoCommit(false);// 默认自动提交
stmt = conn.createStatement();
stmt.addBatch("insert into dept2 values (51,'500','haha')");
stmt.addBatch("insert into dept2 values (52,'500','haha')");
stmt.addBatch("insert into dept2 values (53,'500','haha')");
stmt.executeBatch();
conn.commit();// 手动提交
conn.setAutoCommit(true);// 恢复现场
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
try {
if (conn != null) {
// 回滚
conn.rollback();
conn.setAutoCommit(true);// 恢复现场
}
} catch (SQLException e1) {
e.printStackTrace();
}
} finally {
try {
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC处理可滚动的结果集
要看数据库厂商提供的开发包是否支持该接口(查数据库手册)
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC处理可滚动的结果集
*/
public class TestScroll {
public static void main(String[] args) {
try {
new oracle.jdbc.driver.OracleDriver();
String url ="jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connection conn = DriverManager.getConnection(url,"scott","tiger");
//ResultSet.TYPE_SCROLL_INSENSITIVE结果集对滚动不敏感,对滚动不敏感指可以往前、后滚
//ResultSet.CONCUR_READ_ONLY当并发访问这个结果集是只能读取里面的内容不能改写
//class12.jar只支持ResultSet.CONCUR_READ_ONLY这一种
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery("select * from emp order by sal");
rs.next();
//取字段里面的值有两种方法:1.指定字段顺序值 2.指定字段名
System.out.println(rs.getInt(1));//1表示第一个字段
//System.out.println(rs.getInt("empno"));
rs.last();
System.out.println(rs.getString(1));
System.out.println(rs.isLast());//true
System.out.println(rs.isAfterLast());//false
System.out.println(rs.getRow());//当前这一条记录是第几条记录
rs.previous();//向前,向上滚,往前一条
System.out.println(rs.getString(1));
rs.absolute(6);//直接定位到第6条
System.out.println(rs.getString(1));
rs.close();
stmt.close();
conn.close();
} catch (SQLException e){
e.printStackTrace();
}
}
}
JDBC处理可更新的结果集
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* JDBC处理可更新的结果集
*/
public class TestUpdateRs {
public static void main(String[] args) {
try {
new oracle.jdbc.driver.OracleDriver();
String url ="jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connection conn = DriverManager.getConnection(url,"scott","tiger");
//ResultSet.CONCUR_UPDATABLE并发访问时可更新的结果集(注意:class12.jar不支持)
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("select * from emp2");
rs.next();
//更新一行数据
rs.updateString("ename", "AAAA");
rs.updateRow();//内存里改成"AAAA"了,调用这句话让数据库里也跟着改成"AAAA"
//插入新行
rs.moveToInsertRow();//结果集的最后一行的最下面
rs.updateInt(1, 9999);
rs.updateString("ename", "AAAA");
rs.updateInt("mgr", 7839);
rs.updateDouble("sal", 99.99);
rs.insertRow();
//将光标移动到新建的行
rs.moveToCurrentRow();
//删除行
rs.absolute(5);
rs.deleteRow();
//取消更新
rs.cancelRowUpdates();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
DataSource_RowSet介绍和总结
- DataSource (在javax.sql中)
- DriverManager的替代(DriverManager最主要的作用:帮我们拿到跟数据库的连接)
- 连接池实现
- 分布式实现
- DataSource的属性可以动态改变
- RowSet
- 新的ResultSet
- 从ResultSet继承
- 支持断开的结果集
- (ResultSet搁里面来回的滚动、来回的取数据的话,你要跟数据库的连接必须保持住,一旦中间跟数据库连接断开了就滚不了了;)
- (但RowSet你咣当从数据库里面取出来一大堆东西我就可以跟数据库断开连接了,你所有的操作在我内存里面执行,从这一点上来说它效率会比较高)
- 支持JavaBean的标准
- (RowSet可以表现为图形界面,同时还保持和数据库的连接)
- (但ResultSet不可以)
- (RowSet可以表现为图形界面,同时还保持和数据库的连接)
学习方法
- 如何掌握JDBC?
- 记住常用的各种类型程序段
- 具体说哪几个程序:
- TestJDBC.java
- TestDML.java
- TestPrepStmt.java
- TestTransaction.java
- 具体说哪几个程序:
- 将程序处理完善
- JDBC初步
- DML
- Transaction
- DataSource & RowSet
- 记住常用的各种类型程序段
tomcat
tomcat初步
Servlet
背景知识
- 常用的Web服务器
- IIS:Microsoft 的Web服务器
- Apache:C语言写的,最纯净的版本只能跑html(html 叫 静态网页技术),要跑php需先装插件
- Tomcat:Java语言写的,Tomcat 叫做 Servlet 和 JSP的容器
- 通常的动态网页技术
- CGI ( Common GateWay Interface )
- API 常用的有 ( NSAPI , ISAPI )
- ASP ( Active Server Page ):以进程的方式运行,故效率不高。在微软平台上现已被ASP.NET替代
- PHP ( Personal Home Page )
- JSP/Servlet ( Java Server Page ):以线程方式运行
Servlet和JSP
JSP就是一种Servlet
Servlet简介
- Servlet 是服务器小应用程序
- 用来完成 B/S 架构下,客户端请求的响应处理
- 平台对立,性能优良,能以线程方式运行
- Servlet API 为 Servlet 提供了统一的编程接口
- Servlet 一般在容器中运行
- 常见的 Servlet 的容器
- Tomcat 安装程序:google关键词 “tomcat download” (安装时注意修改文件夹名字为 tomcat 加版本号,例如 tomcat6.0.37)
命令
- 启动服务
- startup
- 出现“Server startup in xxx ms”表示启动成功
- 输入http://localhost:8080/可验证是否启动成功
- web server通常会使用80端口
- 启动失败:
- 防火墙给限制了
- 端口被占用:
- 通过http://localhost:8080/或http://127.0.0.1:8080/或本机ip地址,可查看被哪个程序占用了
- 改端口:
- 控制面板 → 管理工具 → 服务 → 找到对应的已占用端口的程序如OracleOraHome90HTTPServer → 给它停掉,然后在重启tomcat服务
- 配置tomcat到另一个端口
- catalina start
- catalina是tomcat实质上真正起作用的部分,实质上startup、shutdown内部调用的都是catalina,所以可以用catalina来运行
- startup
- 停止服务
- shutdown
- catalina stop
- bin/ 二进制可执行文件和脚本
- common/ Catalina 本身和 web 应用可加载的类目录
- lib/ servlet 要用的 api 都放在 servlet-api.jar 中
- lib/ servlet 要用的 api 都放在 servlet-api.jar 中
- conf/ 配置文件目录
- logs/ 日志目录
- server/ 服务器所需的类库目录
- shared/ Web App 共享的类库
- webapps/ Web 应用所存放的目录 applications
- work/ Tomcat 的工作目录(存放 jsp 产生的 class 文件)
- remp/ 存放临时产生的文件
Tomcat 配置文件
- conf / server.xml
- 服务器的主配置文件
- 最常用的改动地点
- 改 server 启动的端口:搜 “8080”
- 改动成功后,重启 tomcat 服务可以看到 "Initializing Coyote HTTP/1.1 on http-xxxx"(其中xxxx为修改后的端口号)
- 改 server 启动的端口:搜 “8080”
- conf / web.xml
- 定义所有 Web 应用的配置
- (缺省的 Servlet 定义和 MIME 类型定义)
- conf / tomcat-user.xml
- 定义了 tomcat 用户的信息
- http://localhost:8080/ ,点击Tomcat Manager,用户名密码输入tomcat / tomcat,报403错误时修改,若正确则进入Tomcat Web Application Manager
<tomcat-users> <user rolename="manager"/> <user username="tomcat" password="tomcat" roles="manager"/> </tomcat-users>
- 注意事项:修改配置文件前先备份一份(把属性改成只读)
- 修改配置文件后需重启 tomcat
Mysql
下载:google关键词 “mysql download” (选择MySQL Community Server,选择稳定版)
安装:注意事项: