Frame 框架

原生

MVC

作用

  1:数据访问层:主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。

  2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

  3:界面层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务

优缺点

优点

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、有利于标准化;

5、利于各层逻辑的复用。

6、结构更加的明确

7、在后期维护的时候,极大地降低了维护成本和维护时间

缺点

1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

3、增加了开发成本


JavaEE-frame

优势:公共问题,专心业务

1.SpringMVC     表现层

2.Spring             服务层

3.SpringData      持久层

4.Hibernate

5.Mybatis

6.Activiti工作流

 

 


jdbc、dbutils、mybatis的比较

Jdbc

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

  1 //JDBC的步骤,1.加载驱动。2.获取连接。3.执行sql语句。4.处理结果集。5.关闭资源

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

   3 Connection conn=DrivateManager.getConnection(url,username,password);

   4 java.sql.PrepareStatement st=conn.prepareStatement(sql);

   5 st.setInt(0,1);

   6 st.execute();

   7 java.sql.ResultSet rs=st.getResultSet();

   8 while(rs.next()){

   9   String resultString=getString(columnname);     

  10 }

 

jdbc整合c3p0

1.C3P0只需给出配置了信息的数据源  ComboPooledDataSource

2.根据数据源得到连接。

3.执行sql语句

4.处理结果集

5.关闭连接(从连接池获取的连接不是真正的关闭)

C3P0Util.java

private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

//空参,自动到classpath目录下面加载“c3p0-config.xml”配置文件---配置文件的存储位置和名称必须是这样,且使用“默认配置”

 

public static Connection getConnection()  {   //获取连接

    try {

            return dataSource.getConnection();

        } catch (SQLException e) {

            e.printStackTrace();

            throw new RuntimeException("服务器繁忙");

        }

}

2.dbutils

Apache出品的极为轻量级的Jdbc访问框架,核心类只有两个:QueryRunnerResultSetHandler


各类ResultSetHandler
1. ArrayHandler:把结果集中的第一行数据转成对象数组。
2. ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。

3.BeanHandler: 把结果集中的第一行数据封装到一个对应的JavaBean实例中。

(注意:JavaBean中的属性名必须和表中字段名一致,不然映射不成功,对比表现出了

Mybatis的优势,当不一致时,可以设置别名)
4. BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

5.ScalarHandler 用于返回单行单列的结果集

 

 

dbutils整合C3P0连接池以后,通过C3P0配置文件得到数据源:

QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());

return (long)qr.query("SELECT COUNT(*) FROM products",new ScalarHandler());

 

1   import com.mchange.v2.c3p0.ComboPooledDataSource;

2   private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

//空参,自动到classpath目录下面加载“c3p0-config.xml”配置文件---配置文件的存储位置和名称必须是这样,且使用“默认配置”

4

public static ComboPooledDataSource getDataSource() {

        return dataSource;

      }

 

3    c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>

     <default-config>

         <property name="driverClass">com.mysql.jdbc.Driver</property>

         <property name="jdbcUrl">jdbc:mysql://localhost:3306/mhg</property>

         <property name="user">root</property>

         <property name="password">k9718</property>

         <property name="initialPoolSize">10</property>

         <property name="maxIdleTime">30</property>

         <property name="maxPoolSize">100</property>

         <property name="minPoolSize">10</property>

         <property name="maxStatements">200</property>

     </default-config>

 </c3p0-config>

 

 

相比于jdbc

1.dbutils只需通过QueryRunner的实例对象(如qr)获取数据源

(封装了通过数据源获取连接的部分,封装了PreparedStatement完成预编译,封装了对结果集的处理)

2.再通过qr.update(sql,params)完成增删改操作,  qr.query(sql,ResultSetHandler,params)完成查询操作。     (封装了资源的释放,连接池的连接不是真正的关闭,是放回了连接池)

 

安全性:         对SQL注入的处理

 1.Jdbc使用preparestatement进行处理。

 2.dbutils底层也是使用了prepareStatement

 3.mybatis中,相比于#{}${}存在SQL注入的问题。

 

StatementpreparedStatement的比较

1.代码的可读性和可维护性.

虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: 
stmt.executeUpdate(“insert into tb_name (col1,col2,col2,col4) values (‘”+var1+”’,’”+var2+”’,”+var3+”,’”+var4+”’)”);//stmt是Statement对象实例

perstmt = con.prepareStatement(“insert into users (col1,col2,col2,col4) values (?,?,?,?)”); 
perstmt.setString(1,var1); 
perstmt.setString(2,var2); 
perstmt.setString(3,var3); 
perstmt.setString(4,var4); 
perstmt.executeUpdate(); //prestmt
是 PreparedStatement 对象实例

 

  1. 语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行.(不止是一次connection,整个DB有效)
  2. 最重要的一点是极大地提高了安全性,解决了SQL注入的问题,在编译 

时使用占位符代替参数,进行预编译。

预编译:select * from users where uname = ? and psw = ? ;

直接编译:select * from users where = ‘随意’ and passwd = ” or ‘1’ = ‘1’; 

 

JDBC应用中,任何时候PreparedStatement都是优先于Statement

mybatis

   1 //JDBC的步骤,1.加载驱动。2.获取连接。3.执行sql语句。4.处理结果集。5.关闭资源

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

   3 Connection conn=DrivateManager.getConnection(url,username,password);

   4 java.sql.PrepareStatement st=conn.prepareStatement(sql);

   5 st.setInt(0,1);

   6 st.execute();

   7 java.sql.ResultSet rs=st.getResultSet();

   8 while(rs.next()){

   9   String resultString=getString(columnname);     

  10 }

 

作为使用jdbc做内核的mybatis,与jdbc有哪些区别

 mybatis是将JDBC的几行代码分解包装

   2,3行: 是对数据库的数据源管理, 包括事务管理

   4,5行: mybatis通过配置文件来管理Sql以及输入参数的映射

   7,8,9行: mybatis获取返回结果到java对象的映射, 也通过配置文件管理

 

mybatis和dbutils的比较

      1.mybatis的SQL是可以写在配置文件中,并且可以支持动态SQL.

      2.dbutils比较轻量,它的sql是直接传递进去,不支持动态sql.

      3.如果想要将sql从代码中分离出来,或是要进行动态sql,那么就用mybatis.

      4.如果应用很小,基本不需要考虑分离sql集中管理,也基本没啥复杂的sql,那么就使用 dbutils,直接将sql写在java代码里.

      5.推荐使用mybatis,一是他的sqlMap功能可以将Sql分离集中管理,而且还支持动态SQL,让你的java代码更加简洁,二是有时候修改SQL不需要重新编译,方便上线后做微调.

       6.相比于dbutils,mybatis具有一级缓存(sqlSession级别)二级缓存(mapper级别),延迟加载等功能,这是dbutils不具备的。

 

 


 

 

 

 

 

   

猜你喜欢

转载自blog.csdn.net/ddhmbbklyk2018/article/details/81206562