java-jdbc2

下面要简单的写几个代码的栗子了,小哥哥我喜欢绿色,所以就...看不惯的可以改改色大笑

1.//加载驱动,高版本的就不用写了,不过版本低的不写就错了,所以别省着一行代码了
Class.forName("com.mysql.jdbc.Driver");//这个你要是不会写就去
// Referenced Libraries里面的mysql-connector去看看,找到com.mysql.jdbc的Driver,就行了
// com.mysql.jdbc这个是反着写的千万别写错了,写错了就是 java.lang.ClassNotFoundException: 
// com.jdbc.mysql.Driver特意写错了粘的
//为了代码看起来工整,定义变量写
String url="jdbc:mysql://localhost:3306/java1022";
String name="root";
String pwd="";
//这里注意sql语句引用的代码
String sql="select * from book";
Connection conn=DriverManager.getConnection(url,name,pwd);
Statement st=conn.createStatement();

boolean b=st.execute(sql);//有返回的语句就是true
if(b) {
ResultSet rs=st.getResultSet();//以 ResultSet 对象的形式获取当前结果。
while(rs.next()) {

System.out.println(rs.getRow()+"  \t  ");//获取当前行编号
System.out.println(rs.getString(2));//现在又有获取的是我的表格中的第二列
// 是一个字符串类型
}
}

        st.close();

Statement st2=conn.createStatement();
String sql1="insert into book values (10,'技术之瞳',30,'技术')";
boolean b1=st2.execute(sql1);
System.out.println("影响记录的条数:"+st2.getUpdateCount());//getupdatecount以更新计数的形式获取当前结果;如果结果为ResultSet 对象或没有更多结果,则返回 -1。每个结果只应调用一次此方法。

//这个部分是如果你想弄两个statement的话就这么写,先把第一个关闭,但是conn不关.
conn.close();//千万别忘了关闭啊

咳咳咳,要是真的有童鞋用我的代码通过eclipse向mysql插入了信息,他乱码的话,那就看看我的这篇博客吧....一个让小哥哥们吐了的“快死陈”。点这里

2.对上面的问题进行补充,如果说你要是想知道你当前的自增元素的现在序号是多少怎么办?

st2.execute("insert into book values(null,'了不起的java',21,'技术')",Statement.RETURN_GENERATED_KEYS);
ResultSet r=st2.
getGeneratedKeys();
if(r.next()) {
System.out.println(r.getInt(1));
}
r.close();
现在我们又知道了两个内容,一个是RETURN_GENERATED_KEYS(该常量指示生成的键应该可用于获取。)还有一个是getGeneratedKeys()( 获取由于执行此Statement 对象而创建的所有自动生成的键。)数据库的语句不会的看看基础的DDL和DML语句

3.用for循环来向mysql中插入1000条记录甚至是更多:

for(int i=0;i<1000;i++) {
String s="变形金刚"+i;
String sql2="insert into book values(null,'"+s+"',32,'新增')";
st2.addBatch(sql2);
}
st2.executeBatch();

在这里主要是用了 int[] executeBatch这个方法,其中用addBatch来添加,之后一起用executeBatch来执行,值得注意的是里面的s的定义,我们为了让字符串是可以变换的就加入了变量。就利用了' "+ +" '这样的格式:其中啊,也可以写成是' 变形金刚"+i+" ';这个方法再上一个jdbc1里面没一起说,觉得不常用吧.....

4.异常处理:

一定要保持资源的关闭,所以说用完了怕在close()方法之前就出现异常,所以要想尽办法关上啊!

处理异常可以分成两种方法:

第一个1.7新出的处理异常的方法

Autocloseable--是connection实现的接口。

try(Connection conn=DriverManager.getConnection(url,name1,pwd1);
PreparedStatement stat=conn.prepareStatement(sql);
)
{
stat.setString(1, name);
stat.setString(2, pwd);
ResultSet rs=stat.executeQuery();
if(rs.next()) {
return true;
}else {
return false;
}

}catch(Exception e) {
return false;
}

主要是try是重点,原来我们的try里面是不写东西的,后面根本就没有括号,现在我们在后面加上了括号,里面写定义的要自动关闭的资源,这是JDK1.7之后给我们提供的,要使用的话需要实现AutoCloseable,语法是:

try(定义自动关闭的资源){

//代码

}catch(){

//代码

}
用来这个语法之后你就不用finally了。

可以用isclosed()来判断是不是关闭了。

使用jdbc时会需要很多资源,如connection,statement,ResultSet,使用完一定要释放。无论是否出现异常,所以也可以进行如下的说明:

  Connection conn=null;

  Statement st=null;

  try{


}catch(){


}finally{

st.close();

conn.close();

}//注意关闭的顺序,在finally里面的代码是一定会执行的(只要不是啥jvm整出事了)

5.sql注入:

我们有可能利用jdbc来写一个验证登录的问题就会有sql语句的拼接部分(要验证的是变量,你一定会验证的呀)

那么什么的是sql注入:即使用者都可以给程序传入一些sql的片段来破坏sql语句的执行的目的。

如何解决这个问题?使用preparedStatement;他是Statement的子接口,preparedStatement是预编译的sql,因此执行多次相同的sql时,性能更加好。preparedStatement还可以处理更多的数据类型(如bolb)

主要的语法是PreparedStatement ps=conn.prepareStatement("sql"),里面的sql语句特殊之处在于有“?”占位符

如String sql="insert into book values (null,?,?,null)";

ps.setString(1,"厉害厉害");

ps.setString(2,"我最帅");

其中前面的数字代表第几个问号,后面的就是值啦!

public boolean login(String name,String password) throws Exception {
String sql="select from tb_user where username='"+name+"' and password='"+password+"'";
try (Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/web1613","root","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql);
){
if(rs.next()) {
return true;
}else {
return false;
}
}
}

我们用一个用户名密码登录的例子来试试:

main: Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名");
String name=sc.nextLine();
System.out.println("请输入密码");
String pwd=sc.nextLine();
boolean b=login(name,pwd);
if(b) {
System.out.println("登陆成功");
}else {
System.out.println("请重新验证密码或者是用户名");
}

//现在我还不知道怎么和前端页面结合,所以就先这样......

public static boolean login(String name,String pwd) throws Exception {
String url="jdbc:mysql://localhost:3306/web1613";
String uname="root";
String upwd="";
String sql="select * from t_user where userName='"+name+"' and pwd='"+pwd+"'  ";
try(Connection conn=DriverManager.getConnection(url,uname,upwd);
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery(sql); ){
if(rs.next()) {
return true;
}else {
return false;
}
}
}

当你在数据库里面放值的时候你可以用来试一下,发现真好使这两段代码。可是和我们今天说的啥注入有关系吗?,那你在写密码的时候试试瞎写  如:82999' or '1'='1 试试这个,是不是也成功了?因为我们知道了你拼字符串的套路(可怕不?自己试试就算了,上线的网站早就解决了)该语句后面写了一个恒等式,你写'0'='0也行....这时候就是PreparedStatement用上了:

public static boolean login(String name,String pwd) throws Exception {
String url="jdbc:mysql://localhost:3306/web1613";
String uname="root";
String upwd="";
String sql="select * from t_user where userName=? and pwd=?  ";
try(Connection conn=DriverManager.getConnection(url,uname,upwd);
PreparedStatement st=conn.prepareStatement(sql);
){
st.setString(1, name);
st.setString(2, pwd);
ResultSet rs=st.executeQuery();

boolean f=false;
if(rs.next()) {
f= true;
}else {
f= false;
}
rs.close();
return f;
}catch(Exception e) {
return false;
}
}

这次你再试试,就可以了,SQL注入问题,解决!

还是,文章主要用来给我补记忆,不好之处请指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值