java+sql java连接mysql数据库
各位老铁们,大家好,今天由我来为大家分享java+sql,以及java连接mysql数据库的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
java如何实现sql连接和查询的代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBCon{
//数据库驱动对象
public static final String DRIVER="oracle.jdbc.driver.OracleDriver";
//数据库连接地址(数据库名)
public static final String URL="jdbc:oracle:thin:@localhost:1521:orcl";
//登陆名
public static final String USER="FM";
//登陆密码
public static final String PWD="FM";
//创建数据库连接对象
private Connection con=null;
//创建数据库预编译对象
private PreparedStatement ps=null;
//创建结果集
private ResultSet rs=null;
//创建数据源对象
public static DataSource source=null;
////静态代码块
// static{
//
////初始化配置文件context
// try{
// Context context=new InitialContext();
// source=(DataSource)context.lookup("java:comp/env/jdbc/webmessage");
//} catch(Exception e){
//// TODO Auto-generated catch block
// e.printStackTrace();
//}
//
//
//}
/**
*获取数据库连接
*/
public Connection getCon(){
try{
Class.forName(DRIVER);
} catch(ClassNotFoundException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
con=DriverManager.getConnection(URL,USER,PWD);
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
///**
//*获取数据库连接
//*/
// public Connection getCon(){
//
// try{
// con=source.getConnection();
//} catch(SQLException e){
//// TODO Auto-generated catch block
// e.printStackTrace();
//}
//
// return con;
//}
/**
*关闭所有资源
*/
public void closeAll(){
if(rs!=null)
try{
rs.close();
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ps!=null)
try{
ps.close();
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
if(con!=null)
try{
con.close();
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*@param sql数据库更新(增、删、改)语句
*@param pras参数列表(可传,可不传,不传为NULL,以数组形式存在)
*@return返回受影响都行数
*/
public int update(String sql,String... pras){
int resu=0;
con=getCon();
try{
ps=con.prepareStatement(sql);
for(int i=0;i<pras.length;i++){
ps.setString(i+1,pras[i]);
}
resu=ps.executeUpdate();
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
closeAll();
}
return resu;
}
/**
*@param sql数据库查询语句
*@param pras参数列表(可传,可不传,不传为NULL,以数组形式存在)
*@return返回结果集
*/
public ResultSet query(String sql,String... pras){
con=getCon();
try{
ps=con.prepareStatement(sql);
if(pras!=null)
for(int i=0;i<pras.length;i++){
ps.setString(i+1, pras[i]);
}
rs=ps.executeQuery();
} catch(SQLException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
}
java 怎么连接sql数据库 帮忙步骤讲解以及代码参考
首先,使用JDBC技术获取数据库连接:
public static Connection getConnection(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","root","root");
return con;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
Class.forName(数据库驱动);
这是JVM在加载数据库驱动。
DriverManager.getConnection(url,username,password);
url是指连接数据库的地址。
像上面我写的URL是这样的:jdbc:oracle:thin:@127.0.0.1:1521:orcl
127.0.0.1是指本机,也可以用localhost代替,1521是数据库端口号(本人用的是oracle10g),orcl是指oracle_sid。username/password数据库的用户名和密码。有的数据库的url可能不是这样。当然可以去网上查一下就知道了。
这种连接方法是一次请求一次连接,是比较浪费资源的。
像tomcat,weblogic等服务器都带有连接池来避免资源的浪费,而且现在好象有规定,只要是服务器就必须带有连接池。
至于连接池的连接方法,不同的服务器有不同的获得方法。建议你用哪个就去学哪个。
有连接就有关闭数据库,获得数据库连接后一定要记得关闭资源。
public static void close(Connection con){
if(con!=null){
try{con.close();}catch(Exception e){}
}
}
为了方便,不防写成一个方法。
获取连接后,然后使用这个连接去创建相应的Statement来操作数据库。
有Statement,PerparedStatement,CallableStatement这几种statement可以用来创建。
我们先看看Statement的使用。
public static void main(String[] args){
Connection con=JDBCUtil.getConnection();
Statement stat=null;
ResultSet rs=null;
try{
String sql="select a_id,a_name,a_no from a";
stat=con.createStatement();
rs=stat.executeQuery(sql);
while(rs.next()){
System.err.println(rs.getInt(1)+"/"+rs.getString(2)+"/"+rs.getInt(3));
}
}catch(Exception e){
e.printStackTrace();
}
JDBCUtil.close(rs,stat,con);
}
注释:
stat=con.createStatement();是用连接创建Statement对象。
stat.executeQuery(sql);是执行查询语句。这个方法返回的是一个结果集。即ResultSet。可以将查询出来的结果放入结果集中。
rs.next()这个方法返回的一个boolean类型的值,即当指针能够往下走时,返回true,否则返回false。这样就可以保证能够遍历这个结果集了。
当然这里出现了Statement,ResultSet,那么close()方法也得变化了。
如下:
public static void close(ResultSet rs,Statement stat,Connection con){
if(rs!=null){
try{rs.close();}catch(Exception e){}
}
if(stat!=null){
try{stat.close();}catch(Exception e){}
}
if(con!=null){
try{con.close();}catch(Exception e){}
}
}
注意关闭顺序,一定是先ResultSet,后Statement,最后Connection.
由于PerparedStatement和CallableStatement都是Statement的实现类,根据JAVA多态的用法,close()方法就算完全写完了,不用改了。
现在来看看结果:
2/all/2
1/hello/1
===================================================================
现在我们用PerparedStatement来查询:
Connection con=JDBCUtil.getConnection();
PreparedStatement stat=null;
ResultSet rs=null;
try{
String sql="select a_id,a_name,a_no from a where a_id=?";
stat=con.prepareStatement(sql);
stat.setInt(1, 1);
rs=stat.executeQuery();
while(rs.next()){
System.err.println(rs.getInt(1)+"/"+rs.getString(2)+"/"+rs.getInt(3));
}
}catch(Exception e){
e.printStackTrace();
}
JDBCUtil.close(rs,stat,con);
这里的sql语句里有一个值是未确定的。这样就可以实现预编译,大大提高了程序的运行效率。流程如下:
stat=con.prepareStatement(sql);这个方法就将这个sql语句进行了一次编译,查看有没有什么明显的语法错误等。
如果没错,再通过stat.setInt(1, 1);将缺失的值补回去然后再执行sql查询。
PreparedStatement为批处理提供了一系统方法,让批查询、批更新等更加的效率。
让我们看看结果:
1/hello/1
==============================================================
CallableStatement是专门用于处理存储过程的。
如果想深入的学习,建议你去查看相关资料。
java防止SQL注入的几个途径
java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数
01importjava.io.IOException;
02importjava.util.Iterator;
03importjavax.servlet.Filter;
04importjavax.servlet.FilterChain;
05importjavax.servlet.FilterConfig;
06importjavax.servlet.ServletException;
07importjavax.servlet.ServletRequest;
08importjavax.servlet.ServletResponse;
09importjavax.servlet.http.HttpServletRequest;
10importjavax.servlet.http.HttpServletResponse;
11/**
12*通过Filter过滤器来防SQL注入攻击
13*
14*/
15publicclassSQLFilterimplementsFilter{
16privateStringinj_str="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|;|or|-|+|,";
17protectedFilterConfigfilterConfig=null;
18/**
19*Shouldacharacterencodingspecifiedbytheclientbeignored?
20*/
21protectedbooleanignore=true;
22publicvoidinit(FilterConfigconfig)throwsServletException{
23this.filterConfig=config;
24this.inj_str=filterConfig.getInitParameter("keywords");
25}
26publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
27FilterChainchain)throwsIOException,ServletException{
28HttpServletRequestreq=(HttpServletRequest)request;
29HttpServletResponseres=(HttpServletResponse)response;
30Iteratorvalues=req.getParameterMap().values().iterator();//获取所有的表单参数
31while(values.hasNext()){
32String[]value=(String[])values.next();
33for(inti=0;i<value.length;i++){
34if(sql_inj(value[i])){
35//TODO这里发现sql注入代码的业务逻辑代码
36return;
37}
38}
39}
40chain.doFilter(request,response);
41}
42publicbooleansql_inj(Stringstr)
43{
44String[]inj_stra=inj_str.split("\\|");
45for(inti=0;i<inj_stra.length;i++)
46{
47if(str.indexOf(""+inj_stra[i]+"")>=0)
48{
49returntrue;
50}
51}
52returnfalse;
53}
54}
也可以单独在需要防范SQL注入的JavaBean的字段上过滤:
1/**
2*防止sql注入
3*
4*@paramsql
5*@return
6*/
7publicstaticStringTransactSQLInjection(Stringsql){
8returnsql.replaceAll(".*([';]+|(--)+).*","");
9}
关于java+sql到此分享完毕,希望能帮助到您。