为什么要学习mybatis
学习 mybatis之前肯定要先有jdbc编程根底,不然你就不能很好的了解为什么要学习mybatis。
所以思考到初学者可能没有jdbc肯定的根底,所以尽量让大家都能看懂,能深刻理解学习mybatis的
作用,我在上面应用jdbc的原始办法(未经封装),让初学者也能有jdbc的肯定了解!
jdbc编程步骤:
1、加载数据库驱动
2、创立并获取数据库链接
3、创立jdbc statement对象
4、设置sql语句
5、设置sql语句中的参数(应用preparedStatement)
6、通过statement执行sql并获取后果
7、对sql执行后果进行解析解决
8、开释资源(resultSet、preparedstatement、connection)
jdbc的原始办法(未经封装)实现查询数据库表记录
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 通过驱动治理类获取数据库链接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root"); // 定义sql语句 ?示意占位符 String sql = "select * from user where username = ?"; // 获取预处理statement preparedStatement = connection.prepareStatement(sql); // 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值 preparedStatement.setString(1, "王五"); // 向数据库收回sql执行查问,查问出后果集 resultSet = preparedStatement.executeQuery(); // 遍历查问后果集 while (resultSet.next()) { System.out.println(resultSet.getString("id") + " " + resultSet.getString("username")); }} catch (Exception e) { e.printStackTrace();} finally { // 开释资源 if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
}
jdbc问题总结:
1、数据库连贯创立、开释频繁造成系统资源节约,从而影响零碎性能。如果应用数据库连接池可解决此问题。
2、Sql语句在代码中硬编码,造成代码不易保护,理论利用中sql变动的可能较大,sql变动须要扭转java代码。
3、应用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不肯定,可能多也可能少,批改sql还要批改代码,零碎不易保护。
对后果集解析存在硬编码(查问列名),sql变动导致解析代码变动,零碎不易保护,如果能将数据库记录封装成pojo对象解析比拟不便。
Mybatis解决jdbc编程的问题
1、数据库连贯创立、开释频繁造成系统资源节约从而影响零碎性能,如果应用数据库连接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据连接池,应用连接池治理数据库链接。
2、Sql语句写在代码中造成代码不易保护,理论利用sql变动的可能较大,sql变动须要扭转java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码拆散。
3、向sql语句传参数麻烦,因为sql语句的where条件不肯定,可能多也可能少,占位符须要和参数一一对应。
解决:Mybatis主动将java对象映射至sql语句,通过statement中的parameterType定义输出参数的类型。
4、对后果集解析麻烦,sql变动导致解析代码变动,且解析前须要遍历,如果能将数据库记录封装成pojo对象解析比拟不便。
解决:Mybatis主动将sql执行后果映射至java对象,通过statement中的resultType定义输入后果的类型。
jdbc存在的各种问题,然而在mybatis中能够失去很好地解决,所以咱们要学习mybatis框架,在企业应用mybatis框架也是十分宽泛的。
Mybatis是什么
MyBatis 本是apache的一个开源我的项目iBatis, 2010年这个我的项目由apache software foundation 迁徙到了google code,并且改名为MyBatis 。2013年11月迁徙到Github。
MyBatis是一个优良的长久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只须要关注 SQL 自身,而不须要破费精力去解决例如注册驱动、创立connection、创立statement、手动设置参数、后果集检索等jdbc繁冗的过程代码。
Mybatis通过xml或注解的形式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最初由mybatis框架执行sql并将后果映射成java对象并返回。
Mybatis外围架构
1、mybatis配置
SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件须要在SqlMapConfig.xml中加载。
2、通过mybatis环境等配置信息结构SqlSessionFactory即会话工厂
3、由会话工厂创立sqlSession即会话,操作数据库须要通过sqlSession进行。
4、mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是根本执行器、一个是缓存执行器。
5、Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、Mapped Statement对sql执行输出参数进行定义,包含HashMap、根本类型、pojo,Executor通过Mapped Statement在执行sql前将输出的java对象映射至sql中,输出参数映射就是jdbc编程中对preparedStatement设置参数。
7、Mapped Statement对sql执行输入后果进行定义,包含HashMap、根本类型、pojo,Executor通过Mapped Statement在执行sql后将输入后果映射至java对象中,输入后果映射过程相当于jdbc编程中对后果的解析处理过程。
mybatis与hibernate区别
Mybatis和hibernate不同,它不齐全是一个ORM框架,因为MyBatis须要程序员本人编写Sql语句。mybatis能够通过XML或注解形式灵便配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最初将sql执行的后果再映射生成java对象。
Mybatis学习门槛低,简略易学,程序员间接编写原生态sql,可严格控制sql执行性能,灵便度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业经营类软件等,因为这类软件需要变动频繁,一但需要变动要求成绩输入迅速。然而灵便的前提是mybatis无奈做到数据库无关性,如果须要实现反对多种数据库的软件则须要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需要固定的定制化软件)如果用hibernate开发能够节俭很多代码,提高效率。然而Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何衡量,以及怎么用好Hibernate须要具备很强的教训和能力才行。
总之,依照用户的需要在无限的资源环境下只有能做出维护性、扩展性良好的软件架构都是好架构,框架只有适宜才是最好。
其实很多根本都是引入各自的jar包,从而调用各自特有的性能。