发表于: 2018-03-08 23:14:21

1 735


今天完成的事情: 

一、继续昨天的先研究jdbc

1.仿照教程按照自己情况插入数据并关闭连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


public class JdbcTest {
    public  static void main(String[]args) throws SQLException {
       Connection c=null;//创建连接对象c
       Statement st=null;//创建声明对象st
       try {
           Class.forName("com.mysql.jdbc.Driver");//加载驱动
           c= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","1024");
           //建立连接,url为jdbc:mysql://127.0.0.1:3306/test,user为root,passward为1024
           System.out.println("连接成功,获取连接对象:"+c);
           st=c.createStatement(); //创建Stanment对象,使用Connection接口的creatStatement()方法创建对象给s
           System.out.println("获取连接对象:"+st);

           String sql="insert into person1 values(4,"+"'chenliu'"+","+14+","+"'20110606')";

            //创建sql语句对象并录入要执行的语句,注意字符串要用单引号

           st.execute(sql);//调用Statement接口的execute()方法执行sql
           System.out.println("执行插入语句成功");

          }

           catch (ClassNotFoundException e){

               e.printStackTrace();

               }

           catch (SQLException e){

                e.printStackTrace();

               }

          finally {

                if(st !=null){ //如果声明已建立,关闭它
                  try{
                      st.close();
                     }catch(SQLException e){
                        e.printStackTrace();

                      }

               if (c!=null){         //如果连接已建立,关闭它

                   try{
                      c.close();
                     }catch (SQLException e){
                        e.printStackTrace();
}
}
}
}
}
}

以下其他语句的demo

输出表中数据:

sql1="update person1 set age=15 where id = 3";
st.execute(sql1);
System.out.println("执行修改语句成功");
sql1="delete from person1 where id=1";
st.execute(sql1) ;
System.out.println("执行删除语句成功");
sql1="SELECT * from person1";
ResultSet res=st.executeQuery(sql1);
while (res.next()){                 //遍历表中的数据,只要下一行不是空就会继续往下一行移动
int id =res.getInt("id");
String name=res.getString("name");
int age=res.getInt(3);
String personID=res.getString(4);
System.out.println("id:"+id);
System.out.println("name:"+name);
System.out.println("age:"+age);
System.out.println("personID:"+personID);

循环插入100条语句,用到了Prepared Statement接口和for语句以及通配符?

public class JdbcTest2 {
public static void main(String[] args) {
String sql1="insert into person1 values(null,?,?,?)";//先写好sql语句,其中使用通配符来代替需要改变的变量
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}try (Connection c= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","1024");
PreparedStatement p = c.prepareStatement(sql1);
)
{ for (int i = 0; i < 100; i++) {
p.setString(1,"lisi"+i);        //直接利用PS接口中的设置参数的方法,设置指定位置通配符的值
p.setInt(2,15+i);
p.setString(3,"20111111");
p.execute();               //这里因为直接执行语句就行,不需要方法中带参数sql1
}
} catch (SQLException e) {
e.printStackTrace();
}
}}

此方法可以避免另外一种长语句插入数据时age变量的值无法与i发生数学运算互动的问题,用之前demo里面的插入方法,在age后面“+i+”,其实是将age和i中内容以字符串形式连接起来,如果想要"age+i"则会提示mql中没有i变量,所以用PS接口处理大批量数据时更方便。

相比Statement接口,PreparedStatement接口具有①使用参数设置,可读性好,不易犯错②有预编译机制,性能比Statement更快③可以防止SQL注入式攻击。

在每次连接数据库后都要记得关闭数据库,否则会平白占用数据库连接资源。

在输入接口时要注意选择正确的,因为同名的接口不止一个,选错了系统就会报错,此时可以利用系统的便捷方法修改。

2.jdbc相关知识点

a.jdbc(Java DataBase Connectivity)是一种可用于执行SQL语句的Java API(Application Programming Interface,应用设计程序接口),是连接数据库和java的纽带。

b.jdbc技术主要完成以下三步任务:与数据库建立连接;向数据库发送SQL语句;处理从数据库返回的结果。

c.JDBC并不能直接访问数据库,必须依赖与数据库厂商提供的JDBC驱动程序,这也是为什么上面第一步是加载驱动的原因了,而驱动的加载只需在第一次访问数据库时进行一次即可。

3.DAO:Data Access Object,数据库访问对象,其实就是一个接口,其中整合了操作JDBC所要用到的各种方法,将其封装到一起,这样就将复杂繁琐的操作方法放在了后面,而只需要在DAO类中简单改变数据就能实现对数据库不同的操作了



明天计划的事情:

今天看了很多jdbc的操作,对于DAO的编写脑子里有一个模糊的概念,知道得写一个接口界面,包含各种方法,然后在实现类里面重写各种方法,最后在demo里面利用DAO来操作数据库,但是具体怎么做还是有点无从下手,所以明天要先编写DAO来利用JDBC连接数据库实现对数据库的增删修改。


遇到的问题:

不太清楚sql语句在这里为什么有时候要用+号连接,有时候又不用,然后试验了一下,发现其实不用+连接根本没有影响啊

String sql1="insert into person1 values(6,'zhaoliu',30,'20070606')";//将插入id=4时候的+全都去掉了,也顺势去掉了很多双引号

操作结果并没有什么不同,但是看到后面我知道这样操作是为了批量插入数据的时候可以和for循环中的i结合起来插入


收获:

1.冥思苦想了很久,突然参悟了一个之前一直没太看懂的事:A   a=b.methodb();这种情况下,通过A类,创建一个新的a,此a属于A类,但是不是通过构造方法New A();构造的,而是通过b调用了B类的方法methodb();并将得到的结果赋值给了a,此时a就可以调用A的方法,将得到的结果再去赋值给其他类的变量,比如C   c=a.methoda();其实在jdbc的编码中存在很多这个例子,一定要弄明白哪个变量属于哪个类(接口),而这个变量只能调用同类(接口)的方法。

2.通过ResultSet接口创建的对象res,其实是RS类的,可以把它理解为一张表,表上记载了之前的SQL语句执行的结果,但是这个结果是不能直接展示出来的,可以理解为是抽象的一张表,因此我们需要遍历来得到我们需要的值,比如遍历各列字段名得到对应的变量的值,或者在用count语句后遍历res表中id数目得到需要的count数目,而这个while(res.next())语句,其实就是判断下一行是否还有值,只要还有值,返回的就是ture,就会继续进行循环,如果没有值到头了,就会跳出循环,这就是遍历的本质。如果res只有一条记录,则可以用if来代替while。

3.理解上面两个问题之后,再看jdbc的例子就会感觉简单很多了剩下的就是对各个方法的理解和整体流程的把握了。


返回列表 返回列表
评论

    分享到