发表于: 2017-10-11 11:28:50

3 810


今天完成的事

【关于mysql的深度思考】

一,如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?


我觉得是需要的,如果设置了唯一索引,我在插入一个数据的时候,数据库会自动检索这个新字段的值是否存在,如果存在,那么拒绝插入。其实唯一索引的不光提高了数据访问速度,还确定了唯一性。


***经老大指点,我理解有误区,指的是代码里是否需要判断。

和师兄交流了一下。

我觉得如果我插入一个QQ号,如果这个QQ号没有唯一索引,那么插入的时候需要用代码做判断,存在这个QQ,那么拒绝插入。(QQ唯一)

如果这个QQ有唯一索引了,那么就不要代码做判断,存在这个QQ,拒绝,不存在,插入。

请师兄判断一下这次理解的对么。


二,为什么不可以用Select * from table?


参阅文档http://blog.csdn.net/tongyu2009/article/details/8252418

1、SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。

2、如果表的结构在以后发生了改变,那么SELECT * 语句可能会取到不正确的数据甚至是出错。

3、执行SELECT * 语句时,SQL Server首先要查找出表中有哪些列,然后才能开始执行SELECT * 语句,这在某些情况会产生性能问题。

4、使用SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化。

5、在文档角度来看,SELECT * 语句没有列明将要取出哪些字段进行操作,所以也是不推荐的。

【maven的安装】

*之前是用idea自带的,来体验一下本地安装。


顺路copy一下maven的目录结构。

Project

  |-src

  |   |-main

  |   |  |-java        —— 存放项目的.java文件

  |   |  |-resources   —— 存放项目资源文件,如spring, hibernate配置文件

         |-webapp     —— webapp目录是web工程的主目录

            |-WEB-INF

              |-web.xml

  |   |-test

  |      |-java        ——存放所有测试.java文件,如JUnit测试类

  |      |-resources   —— 测试资源文件

  |-target             —— 目标文件输出位置例如.class.jar.war文件

  |-pom.xml           ——maven项目核心配置文件

编写DAO,使用JDBC链接数据库

public class JdbcTemplate {
   @Test
       public void test() throws Exception{
           //注册驱动
           Class.forName("com.mysql.jdbc.Driver");
           //获取链接
           Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123");
           //编写sql
           String sql = "select * from student3 ";
           //创建语句执行者
           PreparedStatement ps = c.prepareStatement(sql);
            //执行语句
           ResultSet rs = ps.executeQuery();
           //处理结果
           while (rs.next()) {
               System.out.println(rs.getString("id") + ":" + rs.getString("user_name"));
           }
           rs.close();
           ps.close();
           c.close();
      }
   }


然后实现增删改查。发现获取链接和创建语句执行者和执行语句都是需要的,避免重复编写我就顺便建了个工具类。



import com.sun.org.apache.regexp.internal.RE;


import java.sql.*;

public class JdbcTemplateUtils {
   public static Connection getConnection() throws SQLException {
       //加载驱动
       try {
           Class.forName("com.mysql.jdbc.Driver");
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
       //获取链接
       return DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "123");
   }

   //释放资源
   public static void closeResource(Connection c, PreparedStatement ps, ResultSet rs ){
       closeResult(rs);
       closePreparedStatement(ps);
       closeConnection(c);
   }

   private static void closeResult(ResultSet rs) {
       if(rs!=null){
           try {
               rs.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
   }

   private static  void closePreparedStatement(PreparedStatement ps) {
       if(ps!=null){
           try {
               ps.close();
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
   }

   public static void closeConnection(Connection c){
           if(c!=null){
               try {
                   c.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }
   }



然后通过工具类实现了增删改。


 @Test
       public void test2() {
           Connection c=null;
           PreparedStatement ps=null;
           ResultSet rs=null;

           try {
               c=JdbcTemplateUtils.getConnection();
               //编写sql
               String sql="insert into student3 values(?,?,?,?,?,?,?)";

               //获取语句执行者
               ps=c.prepareStatement(sql);
               //设置参数
               ps.setString(1,"19");
               ps.setString(2,"小张");
               ps.setString(3,"8888");
               ps.setString(4,"上海交大");
               ps.setString(5,"修真");
               ps.setString(6,"999");
               ps.setString(7,"888");
               int i=ps.executeUpdate();
               if(i==1){
                   System.out.println("执行成功数据插入成功");
               }else{
                   System.out.println("数据插入失败");
               }
               //处理结果
           } catch (SQLException e) {
               e.printStackTrace();
           }
           finally{
               JdbcTemplateUtils.closeResource(c,ps,rs);
           }
       }
       @Test
       public void test3(){
           Connection c=null;
           PreparedStatement ps=null;
           ResultSet rs=null;

           try {
               c=JdbcTemplateUtils.getConnection();
               String sql="update student3 set user_name=? where id= ?";
               ps=c.prepareStatement(sql);
               ps.setString(1,"小李");
               ps.setString(2,"19");
               int i=ps.executeUpdate();
               if(i==1){
                   System.out.println("执行成功数据改变成功");
               }else{
                   System.out.println("数据改变失败");
               }

           } catch (SQLException e) {
               e.printStackTrace();
           }finally {
               JdbcTemplateUtils.closeResource(c,ps,rs);
           }

       }
       @Test
       public void test4(){
           Connection c=null;
           PreparedStatement ps=null;
           ResultSet rs=null;

           try {
               c=JdbcTemplateUtils.getConnection();
               String sql="delete from student3  where id=?";
               ps=c.prepareStatement(sql);
               ps.setString(1,"19");
               int i=ps.executeUpdate();
               if(i==1){
                   System.out.println("删除数据成功");
               }else{
                   System.out.println("删除数据失败");
               }

           } catch (SQLException e) {
               e.printStackTrace();
           }finally {
               JdbcTemplateUtils.closeResource(c,ps,rs);
           }
       }

}

暂时也算把JDBCTemplate自己编写了一遍,感觉比之前照着模板誊写印象深刻许多。

收获

jdbctemplateJDBC搭建过程重新对一些JAVA语句进行了一些理解。

一,class.forName

Class.forName("com.mysql.jdbc.Driver");

这句话是加载类,class.forName的作用是加载驱动,具体操作是这样的(源码):

static
{
    try
    {
        DriverManager.registerDriver(new Driver());
    catch (SQLException e) {
        throw new RuntimeException("Can't register driver!");
    }
}

DriverManager.registerDriver(new Driver());熟悉的加载驱动语句,好理解了一点点。。。

二,

ResultSet rs=ps.executeQuery();

executeQuery();的用途是把数据库响应的查询结果存放在ResultSet类对象中供我们使用。

ResultSet的作用是结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。

三,

while(rs.next())

中的.next()方法。

ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
光标向前移动一位后,发现这个位置有对象,那么rs.next 就返回true,否则返回false。

出现的问题

1,用try...catch和throw抛出异常的区别是什么?

  1.    throw是在程序中明确引发异常。
  2.        main方法处理该异常,使用try…..catch语句,将可能会出现的异常的代码放在try块内,将处理异常的代码放在catch块内,并指明catch能够捕获的异常的类型,当异常被捕获时,执行catch块内的语句。
  3.    throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法。
  4.         main方法不处理该异常,将异常向外层程序抛出。在方法声明中使用throws关键字抛出异常,方法体中不需要使用try…catch语句

2,注意使用JDBCTemplate的时候分离Interface和Imple

      学哥看这里我按照博客说的和自己理解的,我没用到Interface和Imple啊,还是说任务里说的JDBC是spring框架的jdbcTemplate啊,我理解错了,如果理解错了,希望学哥说一声,我明天用spring框架的jdbcTemplate的再链接一遍。

明天的计划

继续任务,争取把mybatis解决掉。



返回列表 返回列表
评论

    分享到