原生
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访问框架,核心类只有两个:QueryRunner和ResultSetHandler。
3.BeanHandler: 把结果集中的第一行数据封装到一个对应的JavaBean实例中。 (注意:JavaBean中的属性名必须和表中字段名一致,不然映射不成功,对比表现出了 Mybatis的优势,当不一致时,可以设置别名) 5.ScalarHandler: 用于返回单行单列的结果集
当dbutils整合C3P0连接池以后,通过C3P0配置文件得到数据源: 5 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注入的问题。
Statement和preparedStatement的比较 1.代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: perstmt = con.prepareStatement(“insert into users (col1,col2,col2,col4) values (?,?,?,?)”);
时使用占位符代替参数,进行预编译。 预编译: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不具备的。 |