数据库连接(Connection)
数据库连接
获取数据库连接有两种方法,一种是通过驱动程序管理器DriverManager类,另一种则是使用DataSource接口。这两种方法都提供了了一个getConnection方法,用户可以在程序中对它们进行相应处理后调用这个方法来返回数据库连接。
• DriverManager类
• DataSource接口
• Connection接口
• JDBC URL
jdbc:<subprotocol>:<subname>
• 驱动程序注册方法
(1)调用ClassforName方法
(2)设置jdbcdrivers系统属性
• DriverManager方法
DriverManager类中的所有方法都是静态方法,所以使用DriverManager类的方法时,不必生成实例。
DriverManager
• getConnection方法
作用是用于获取数据库连接,原型如下:
public static Connection getConnection(String url)
throws SQLException;
public static Connection getConnection(String url, String user, String password)
throws SQLException;
public static Connection getConnection(String url, Properties info)
throws SQLException;
• 使用DriverManager的getConnetion方法
ClassforName("sunjdbcodbcJdbcOdbcDriver");
Connection conn = DriverManagergetConnection
("jdbc:odbc:sqlserver", "sa", "sa");
• 使用设置jdbcdrivers系统属性的方法
java -Djdbcdrivers=sunjdbcodbcJdbcOdbcDriver testjava
DataSource 接口
……
//从上下文中查找数据源,并获取数据库连接
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctxlookup("sqlserver");
Connection conn = dsgetConnection();
//查询数据库中所有记录
Statement stmt = conncreateStatement();
ResultSet rs = stmtexecuteQuery("SELECT FROM student");
……
Connection 接口
Connection接口代表了已经建立的数据库连接,它是整个JDBC的核心内容。Connnection接口中的方法按照它们所实现的功能,可以分为三类:
• 生成数据库语句
• 管理数据库事务
• 获取数据库信息
生成数据库语句
JDBC将数据库语句分成三种类型 :
• 生成Statement 语句 :
ConnectioncreateStatement()
• 生成PreparedStatement 语句 :
Connection prepareStatement()
• 生成CallableStatement 语句 :
Connection prepareCall ()
管理数据库事务
• 默认情况下,JDBC将一条数据库语句视为一个完整的事务。可以关掉默认事务管理:
public void setAutoCommit(Boolean autoCommit) throws SQLException;
将autoCommit的值设置为false,就关掉了自动事务管理模式
• 在执行完事务后,应提交事务:
public void commit() throws SQLException;
• 可以取消事务:
public void rollback() throws SQLException;
第二讲 第四部分
数据库语句
数据库语句
JDBC数据库语句共有三种类型:
• Statement:
Statement语句主要用于嵌入一般的SQL语句,包括查询、更新、插入和删除等等。
• PreparedStatement:
PreparedStatement语句称为准备语句,它是将SQL语句中的某些参数暂不指定,而等到执行时在统一指定。
• CallableStatement:
CallableStatement用于执行数据库的存储过程。
Statement 语句
• executeQuery方法
• executeUpdate方法
• execute方法
• close方法
executeQuery方法
• executeQuery方法主要用于执行产生单个结果集的SQL查询语句(QL),即SELECT语句。executeQuery方法的原型如下所示:
• public ResultSet executeQuery(String sql) throws SQLException;
executeUpdate方法
• executeUpdate方法主要用于执行 INSERT、UPDATE、DELETE语句,即SQL的数据 *** 作语句(DML)
• executeUpdate方法也可以执行类似于CREATE TABLE和DROP TABLE语句的SQL数据定义语言(DDL)语句
• executeUpdate方法的返回值是一个整数,指示受影响的行数(即更新计数)。而对于CREATE TABLE 或 DROP TABLE等并不 *** 作特定行的语句,executeUpdate的返回值总为零。
execute方法
execute方法用于执行:
• 返回多个结果集
• 多个更新计数
• 或二者组合的语句
execute方法
• 返回多个结果集:首先要调用getResultSet方法获得第一个结果集,然后调用适当的getter方法获取其中的值。要获得第二个结果集,需要先调用getMoreResults方法,然后再调用getResultSet方法。
• 返回多个更新计数:首先要调用getUpdateCount方法获得第一更新计数。然后调用getMoreResults,并再次调用getUpdateCount获得后面的更新计数。
• 不知道返回内容:如果结果是ResultSet对象,则execute方法返回true;如果结果是int类型,则意味着结果是更新计数或执行的语句是DDL命令。
execute方法
为了说明如果处理execute方法返回的结果,下面举一个代码例子:
stmtexecute(query);
while (true) {
int row = stmtgetUpdateCount();
//如果是更新计数
if (row > 0) {
Systemoutprintln("更新的行数是:" + row);
stmtgetMoreResults();
continue;
}
execute方法
//如果是DDL命令或0个更新
if (row == 0) {
Systemoutprintln("没有更新,或SQL语句是一条DDL语句!");
stmtgetMoreResults();
continue;
}
//如果是一个结果集
ResultSet rs = stmtgetResultSet;
if (rs != null) {
while (rsnext()) {
// 处理结果集
}
stmtgetMoreResults();
continue;
}
break;
}
PreparedStatement 语句
登录一个网站或BBS时 :
• 使用Statement语句
Statement stmt = conncreateStatement();
ResultSet rs = stmtexecuteQuery
(“SELECT password FROM userinfo
WHERE id=userId");
• 使用PreparedStatement语句
PreparedStatement pstmt=connprepareStatement
(“SELECT password FROM userinfo
WHERE id=");
pstmtsetString(1, userId);
PreparedStatement语句
• 常用的setter方法
public void setBoolean(int parameterIndex, boolean x) throws SQLException;
public void setByte(int parameterIndex, byte x) throws SQLException;
public void setShort(int parameterIndex, short x) throws SQLException;
public void setInt(int parameterIndex,int x) throws SQLException;
public void setLong(int parameterIndex, long x) throws SQLException;
public void setFloat(int parameterIndex, float x) throws SQLException;
public void setDouble(int parameterIndex, double x) throws SQLException;
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException;
public void setString(int parameterIndex, String x) throws SQLException;
public void setBytes(int parameterIndex, byte[] x) throws SQLException;
public void setDate(int parameterIndex, Date x) throws SQLException;
public void setTime(int parameterIndex, Time x) hrows SQLException;
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException;
PreparedStatement语句
• PreparedStatement接口是由Statement接口扩展而来的,重写了executeQuery方法、executeUpdate方法和execute 方法
• public ResultSet executeQuery() throws SQLException
• public int executeUpdate() throws SQLException
• public boolean execute() throws SQLException
CallableStatement语句
• CallableStatement语句是由Connection接口的prepareCall方法创建的,创建时需要传入字符串参数,参数的形式为:
• {call procedure_name[(, , )]}
• { = call procedure_name[(, , )]}
• {call procedure_name}
CallableStatement语句
• 其中的问号是参数占位符,参数共有两种:
• IN参数
• OUT参数
• IN参数使用setter方法来设置
• OUT参数则使用registerOutParameter方法来设置
CallableStatement 语句
CallableStatement cstmt = conprepareCall
("{call getTestData(, )}");
cstmtregisterOutParameter
(1, javasqlTypesTINYINT);
cstmtregisterOutParameter
(2, javasqlTypesDECIMAL, 3);
cstmtexecuteQuery();
byte x = cstmtgetByte(1);
javamathBigDecimal n =
cstmtgetBigDecimal(2, 3);
第二讲 第五部分
结 果 集
结果集
• JDBC为了方便处理查询结果,又专门定义了一个接口,这个接口就是ResultSet接口。ResultSet接口提供了可以访问数据库查询结果的方法,通常称这个接口所指向的对象为结果集。
• 有两种方法得到结果集,一种是直接执行查询语句,将结果存储在结果集对象上;另一种是不存储返回结果,而在需要时调用数据库语句的getResultSet方法来返回结果集
结果集
• 结果集指针
由于返回的结果集可能包含多条数据记录,因此ResultSet 接口提供了对结果集的所有数据记录轮询的方法。结果集自动维护了一个指向当前数据记录的指针,初始时这个指针是指向第一行的前一个位置。 next 方法就是用于向前移动指针的
结果集
• 结果集属性
默认情况下,结果集是一个不可更新集,并且结果集的指针也只能向前移动。也就是说,在得到了一个结果集之后,用户只能按照从第一条记录到最后一条记录的顺序依次向后读取,而不能跳到任意条记录上,也不能返回到前面的记录。不仅如此,结果集的这种轮询只能进行一次,而不能再将指针重置到初始位置进行多次轮询
结果集
• 结果集属性
类型
并发性
有效性
• 属性的设置是在生成数据库语句时通过向生成方法传入相应的参数设定的,而当结果集已经返回时就不能够再改变它的属性了。
结果集生成Statement语句共有三种方法
public Statement createStatement() throws SQLException;
public Statement createStatement
(int resultSetType, int resultSetConcurrency)
throws SQLException;
public Statement createStatement
(int resultSetType, int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
结果集
• 生成PreparedStatement语句共有六种方法
public PreparedStatement prepareStatement(String sql) throws SQLException;
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency)
throws SQLException;
public PreparedStatement prepareStatement(String sql, int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
public PreparedStatement prepareStatement(String sql String[] columnNames)
throws SQLException;
结果集
• 生成CallableStatement语句共有三种方法
public CallableStatement prepareCall(String sql)
throws SQLException;
public CallableStatement prepareCall
(String sql, int resultSetType,
int resultSetConcurrency)
throws SQLException;
public CallableStatement prepareCall
(String sql, int resultSetType,
int resultSetConcurrency,
int resultSetHoldability)
throws SQLException;
结果集
结果集类型
• 结果集的类型共有三种,TYPE_FORWARD_ONLY类型的结果集只能向前移动指针,而TYPE_SCROLL_INSENSITIVE类型和TYPE_SCROLL_SENSITIVE类型的结果集则可以任意移动指针。后两种类型的区别在于,前者对来自其它处的修改不敏感(静态),而后者则对于别人的修改敏感(动态视图)。
结果集
结果集类型
• 对于可以任意移动指针的结果集,可以用来移动指针的方法包括:
• next 和previous :
• absolute 和relative :参数可正可负
• afterLast 、beforeFirst 、last 和first :
结果集
结果集并发性
• 结果集的并发性共有两种,CONCUR_READ_ONLY的结果集是只读而不可更新的;而CONCUR_UPDATABLE的结果集则是可以通过update方法进行更新的。
• ResultSet接口提供了一组update方法,用于更新结果集中的数据。这些方法与PreparedStatement接口中定义的setter方法一样,也是与类型相对应的。所有的update方法都以update开头 。
• 所有的update方法都有两个参数,第一个参数用于指定更新的列,它可以是列名称也可以是列的序号;第二个参数则表示将要更新列的值。
结果集
结果集并发性
• Statement stmt = conncreateStatement
• (ResultSetTYPE_SCROLL_SENSITIVE, ResultSetCONCUR_UPDATABLE);
• ResultSet rs = stmtexecuteQuery("SELECT FROM student " +
• "WHERE grade=2 AND math>60 AND physics>60 AND " +
• "chemistry>60 AND english>60 AND chinese>60");
• while(rsnext()){
• rsupdateString("grade", "3");
• rsupdateRow();
• }
结果集
结果集有效性
• 结果集的有效性是指在调用了Connection 接口的commit 方法后,结果集是否自动关闭。所以它只有两个可选值,即HOLD_CURSORS_OVER_COMMIT 和CLOSE_CURSORS_AT_COMMIT 。前者表示调用commit 方法之后,结果集不关闭;而后者则表示关闭结果集。
结果结果集
• 结果集的getter方法
ResultSet接口还提供了一组getter方法,用于返回当前记录的属性值。它们都是以get开头的,后接数据类型。比如,如果要返回一个float类型的列值,则应调用getFloat方法。每一种类型的getter方法都有两种形式,它们的名称相同而参数不同。这两种形式的getter方法都只有一个参数,第一种形式的getter方法参数是String类型的,用于指定列的名称;另外一种形式的getter方法参数则是int类型的,用于指定列的序号。
这个。。。。
做可视化,首先要对swing组件有一定的了解,如果想偷懒,推荐使用MyEclipse来编写,它能自动生成相关代码。。。。
其次就是要熟悉JDBC,熟悉数据库连接原理,推荐使用的数据库为MySQL。。。。
其实这些都不会很难,数据库连接原理,JAVA书籍里面肯定会有的,连接代码其实都差不多。。。。
有啥问题可以QQ 410430209 找我,我也刚做完一个仓库管理系统,其实都大同小异的。。。。
新安装了 jdk 6 的程序员们也许会发现,除了传统的 bin、jre 等目录,jdk 6 新增了一个名为 db 的目录。这便是 java 6 的新成员:java db。这是一个纯 java 实现、开源的数据库管理系统(dbMS),源于 Apache 软件基金会(asf)名下的项目 Derby。它只有 2MB 大小,对比动辄上 G 的数据库来说可谓袖珍。但这并不妨碍 Derby 功能齐备,支持几乎大部分的数据库应用所需要的特性。更难能可贵的是,依托于 asf 强大的社区力量,Derby 得到了包括 ibm 和 Sun 等大公司以及全世界优秀程序员们的支持。这也难怪 Sun 公司会选择其 1022 版本纳入到 jdk 6 中,作为内嵌的数据库。这就好像为 jdk 注入了一股全新的活力:java 程序员不再需要耗费大量精力安装和配置数据库,就能进行安全、易用、标准、并且免费的数据库编程。在这一章中,我们将初窥 java db 的世界,来探究如何使用它编写出功能丰富的程序。
import javaappletApplet;
import javaawt;
import javaawtevent;
import javautil;
import javalang;
public class Students extends Applet implements ActionListener
{
Vector StuInf=new Vector();
StudentInf SI;
String xm;
String bj;
int i,j,xh,cj;
static int mid;
Label prompt1=new Label("学生成绩管理系统");
Label prompt2=new Label(" 用户:");
Label prompt3=new Label(" 密码:");
Label prompt4=new Label(" 班级:");
Label prompt5=new Label(" 成绩:");
TextField input1=new TextField(8);
TextField input2=new TextField(8);
TextField input3=new TextField(8);
TextField input4=new TextField(8);
Button btn1=new Button("登录");
Button btn2=new Button("增加");
Button btn3=new Button("修改");
Button btn4=new Button("删除");
public void init()
{
setLayout(new GridLayout(6,3));
add(new Label());
add(prompt1);
add(new Label());
add(prompt2);
add(input1);
add(new Label());
add(prompt3);
add(input2);
add(btn1);
add(prompt4);
add(input3);
add(new Label());
add(prompt5);
add(input4);
add(new Label());
add(btn2);
add(btn3);
add(btn4);
prompt4setVisible(false);
prompt5setVisible(false);
input3setVisible(false);
input4setVisible(false);
btn2setVisible(false);
btn3setVisible(false);
btn4setVisible(false);
btn1addActionListener(this);
btn2addActionListener(this);
btn3addActionListener(this);
btn4addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
if(egetActionCommand()=="登录")
{
String a,b;
a=input1getText();
b=input2getText();
input1setText("");
if((aequals("12")==true)&&(bequals("12")==true))
{
prompt2setText(" 姓名:");
prompt3setText(" 学号:");
prompt4setVisible(true);
prompt5setVisible(true);
input3setVisible(true);
input4setVisible(true);
btn2setVisible(true);
btn3setVisible(true);
btn4setVisible(true);
btn3setEnabled(false);
btn4setEnabled(false);
btn1setLabel("查询");
input1setText("登录成功");
input1selectAll();
}
else
input2setText("用户名或密码错");
}
if(egetActionCommand()=="增加")
{
boolean scucss=true;
try
{
XingMing();
}
catch(EmptyException as)
{
input1setText("姓名不能为空");
scucss=false;
}
try
{
xh=IntegerparseInt(input2getText());
}
catch(NumberFormatException m)
{
input2setText("学号为空或格式错");
scucss=false;
}
bj=input3getText();
try
{
ChengJi();
}
catch(EmptyException as)
{
cj=-1;
}
catch(OverException dd)
{
input4setText("应在0-100间");
scucss=false;
}
catch(NumberFormatException cm)
{
input4setText("成绩应为数据");
scucss=false;
}
if(scucss==true)
{
SI=new StudentInf(xm,xh,bj,cj);
Insert(SI);
}
}
if(egetActionCommand()=="修改")
{
xm=input1getText();
xh=IntegerparseInt(input2getText());
bj=input3getText();
cj=IntegerparseInt(input4getText());
SI=new StudentInf(xm,xh,bj,cj);
StuInfsetElementAt(SI, mid);
btn3setEnabled(false);
}
if(egetActionCommand()=="删除")
{
StuInfremoveElementAt(mid);
btn4setEnabled(false);
input1setText("删除成功");
input2setText("");
input3setText("");
input4setText("");
}
if(egetActionCommand()=="查询")
{
boolean right=true;
try
{
xh=IntegerparseInt(input2getText());
}
catch(NumberFormatException m)
{
input2setText("学号为空或格式错");
right=false;
}
if(right==true)
{
search(xh);
btn3setEnabled(true);
btn4setEnabled(true);
}
}
}
//查找方法
public void search(int k)
{
boolean exist=false;
int low=0;
int high=StuInfsize()-1;
while(low<=high)
{
mid=(high+low)/2;
StudentInf a1=(StudentInf) StuInfelementAt(mid);
if(a1getStuNo()==k)
{
SI=(StudentInf) StuInfelementAt(mid);
String x = StringvalueOf(SIgetStuNo());
exist=true;
input1setText(SIgetname());
input1selectAll();
input2setText("0"+x);
input3setText(SIgetClassNo());
if(SIgetLevel()==-1)
input4setText("未参加考试");
else
{
String y = StringvalueOf(SIgetLevel());
input4setText(y);
}
break;
}
else if(a1getStuNo()<k)
low=mid+1;
else
high=mid-1;
}
if(exist==false)
{
input1setText("无此学号学生信息");
input1selectAll();
}
}
//添加方法
public void Insert(StudentInf q)
{
int i=0;
if(StuInfisEmpty()==true)
{
StuInfaddElement(q);
input1setText("");
input2setText("");
input3setText("");
input4setText("");
}
else
{
StudentInf xh;
xh=(StudentInf) StuInffirstElement();
while(xhgetStuNo()<qgetStuNo())
{
i++;
if(i<StuInfsize())
xh=(StudentInf) StuInfelementAt(i);
else
break;
}
if(xhgetStuNo()==qgetStuNo())
{
input2setText("此学生信息已存在");
input2requestFocus();
input2selectAll();
}
else
{
StuInfinsertElementAt(q,i);
input1setText("");
input2setText("");
input3setText("");
input4setText("");
}
}
}
//异常类
class OverException extends Exception
{
String over;
}
class EmptyException extends Exception
{
String empty;
}
void XingMing() throws EmptyException
{
if((input1getText())equals(""))
throw (new EmptyException());
else
xm=input1getText();
}
void ChengJi() throws OverException,EmptyException
{
if((input4getText())equals(""))
throw(new EmptyException());
else
cj=IntegerparseInt(input4getText());
if(cj<0||cj>100)
throw (new OverException());
}
//学生信息类
public class StudentInf
{
private String name;
private int StuNo;
private String ClassNo;
private int Level;
StudentInf(String xingming,int xuehao,String banji,int chengji)
{
name=xingming;
StuNo=xuehao;
ClassNo=banji;
Level=chengji;
}
public int getStuNo()
{
return StuNo;
}
public String getname()
{
return name;
}
public String getClassNo()
{
return ClassNo;
}
public int getLevel()
{
return Level;
}
}
}
以上就是关于(高分)急求连接数据库的JAVA学生信息管理系统源代码全部的内容,包括:(高分)急求连接数据库的JAVA学生信息管理系统源代码、java与数据库连接做学生管理系统、Java语言运用derby数据库实现成绩查询管理系统,百分急求可追加等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)