本文主要内容:传统JDBC传统JDBC编码格式publicclassDataBaseUtil{publicstaticfinalStringURL="jdbc:mysql://localhost:3306/mblog";publicstaticfinalStringUSER="root";publicstaticfinalStringPASSWORD="123456";publicstaticvoidmain(String[]args)throwsException{Class.forName("com.mysql.jdbc.Driver");//2.Connectionconn=DriverManager.getConnection(URL,USER,PASSWORD);//3.Statementsstmt=conn.createStatement();//4.ResultSetrs=stmt.executeQuery("SELECTid,name,ageFROMm_userwhereid=1");//如果有数据,rs.next()返回truewhile(rs.next()){System.out.println("name:"+rs.getString("name")+"age:"+rs.getInt("age"));}}}上面代码中的知识就是展示JDBC全流程(异常和资源处理简单粗暴,我们的重点不在这两个)。大致可以分为六个步骤:加载驱动获取数据库连接创建Statement对象操作数据库,实现增删改查,获取结果集,关闭资源从使用层面来说,在项目中使用原来的JDBC成本还是很高的。如果我们项目中的业务比较复杂,数据库表比较多,对数据库的各种增删改查的方??法也会比较多,那么这样的代码重复次数会非常多.传统JDBC存在的问题创建数据库连接有很多硬代码,执行语句时也有硬代码。频繁的打开和关闭数据库连接会严重影响数据库的性能,浪费数据库资源。为了解决上述问题,出现了大量的重复编码,各种替代JDBC的产品应运而生。即ORM框架。什么是ORM?全称是对象关系映射。对象映射关系数据库。对象-关系映射(或简称ORM,或O/RM,或O/R映射)用于以面向对象的编程语言实现不同类型系统之间的数据转换。简单的说,ORM通过描述对象与数据库之间映射关系的元数据,将程序中的对象映射到关系数据库中。ORM提供了另一种实现持久层的模式。它使用映射元数据来描述对象关系的映射,使ORM中间件可以充当任何应用程序的业务逻辑层和数据库层之间的桥梁。我们的项目是这样的:例如:ApacheDbUtils、SpringJDBC、Hibernate、Ibatis(Mybatis的前身)、SpringDataJpa等。目前最流行的Mybatis和SpringDataJpa。本系列先讲解Mybatis,再讲解Jpa。ORM的优缺点优点1.提高开发效率。由于ORM可以自动映射Entity对象和数据库中Tables之间的字段和属性,我们实际上可能不需要一个专门的、庞大的数据访问层。2、ORM提供了一个到数据库的映射,不用直接编码sql,可以像操作对象一样从数据库中获取数据。缺点是牺牲了程序的执行效率,固定了思维模式,降低了开发的灵活性。从系统结构来看,使用ORM的系统一般都是多层系统。如果系统中有更多层,效率会降低。ORM是一种完全面向对象的方法,面向对象的方法也会对性能产生一定的影响。我们在开发系统的时候,一般都会出现性能问题。性能问题主要是由于算法不正确和数据库使用不当引起的。ORM生成的代码一般不太可能写出非常高效的算法,在数据库应用中更容易被误用,主要体现在持久化对象的提取和数据处理上。如果使用ORM,程序员很可能会将所有数据抽取到内存对象中,然后进行过滤处理,容易出现性能问题。当持久化一个对象时,ORM通常会持久化所有的属性,有时这是不希望的。但是ORM是一个工具,工具确实可以解决一些重复简单的劳动。这是不可否认的。但我们不能指望工具能一劳永逸地解决所有问题。有些问题还是需要特殊处理的,但是对于大部分系统来说,需要特殊处理的部分应该很少。什么是MyBatis?如果在面试的时候被问到,你只需要说出以下三个即可。MyBatis是一个优秀的持久层框架,支持自定义SQL、存储过程和高级映射。MyBatis省去了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解将原始类型、接口和JavaPOJO(PlainOldJavaObjects,PlainOldJavaObjects)配置映射为数据库中的记录。来自官网。MyBatis的优缺点优点:(1)基于SQL语句编程,相当灵活,不会对现有的应用程序或数据库设计造成任何影响。SQL使用XML编写,将sql与程序代码解耦,便于统一管理;提供XML标签,支持编写动态SQL语句,可重复使用。(2)与JDBC相比,代码量减少50%以上,剔除了JDBC的大量冗余代码,不需要手动切换连接;(3)对各种数据库的兼容性非常好(因为MyBatis使用JDBC连接数据库,所以只要支持JDBC的数据库MyBatis都支持)。(4)可以很好的与Spring集成;(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象-关系映射标签,支持对象-关系组件维护。缺点(1)编写SQL语句的工作量比较大,尤其是字段多、关联表多的情况下,对开发人员编写SQL语句有一定的要求。(2)SQL语句依赖于数据库,导致数据库可移植性差,不能随意更换数据库。Mybatis环境搭建及简单示例创建数据库表使用MySQL数据库创建m_user表。CREATETABLE`m_user`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(255)DEFAULTNULL,`age`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;添加依赖org.mybatismybatis<版本>3.5.2mysqlmysql-connector-java8.0.16runtime项目结构如下:创建一个mybatis-config.xml实体类UserublicclassUser{privateIntegerid;privateStringname;privateIntegerage;//setget@OverridepublicStringtoString(){return"User{"+"id="+id+",name='"+name+'\''+",age="+age+'}';}}创建UserMapper.javaimportcom.tian.mybatis.entity.User;publicinterfaceUserMapper{UserselectUserById(Integerid);}创建UserMapper.xmlselect*fromm_userwhereid=#{id}创建测试类importcom.tian.mybatis.entity.User;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importjava.io.IOException;importjava.io.InputStream;publicclassMybatisApplication{publicstaticvoidgmains(字符串]){Stringresource="mybatis-config.xml";InputStreaminputStream=null;SqlSessionsqlSession=null;try{inputStream=Resources.getResourceAsStream(resource);//工厂模式SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);//sql操作SessionsqlSession=sqlSessionFactory.openSession();//获取数据并解析成User对象Useruser=sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById",1);System.out.println(user);}catch(Exceptione){e.printStackTrace();}finally{try{inputStream.close();}catch(IOExceptione){e.printStackTrace();}sqlSession.close();}}}输出结果:User{id=1,name='tian',age=22}整体步骤:其他一种启动方式importcom.tian.mybatis.entity.User;importorg.apache.ibatis.builder.xml.XMLConfigBuilder;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.Configuration;importorg.apache。ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.apache.ibatis.session.defaults.DefaultSqlSessionFactory;importjava.io.IOException;importjava.io.InputStream;importjava.util.Properties;publicclassMybatisApplication{publicstaticvoidmain(String[]args){Stringresource="mybatis-config.xml";InputStreaminputStream=null;try{inputStream=Resources.getResourceAsStream(resource);}catch(IOExceptione){e.printStackTrace();}//解析xml文件XMLConfigBuilderparser=newXMLConfigBuilder(inputStream,null,null);//构建一个SqlSessionFactory工厂类SqlSessionFactorysqlSessionFactory=build(parser.parse());//CreateASqlSessionSqlSessionsqlSession=sqlSessionFactory.openSession();//获取数据并解析成User对象Useruser=sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById",1);System.out.println(用户);}publicstaticSqlSessionFactorybuild(Configurationconfig){returnnewDefaultSqlSessionFactory(config);}}输出同上,可以直接使用Java代码代替mybatis-config.xml。//创建数据源DataSourcedataSource=getDataSource();TransactionFactorytransactionFactory=newJdbcTransactionFactory();Environmentenvironment=newEnvironment("development",transactionFactory,dataSource);Configurationconfiguration=newConfiguration(environment);configuration.addMapper(BlogMapperSsionesqFactoryBuildesqFactory=SqlSessionFactory).build(configuration);小结从上面的案例我们可以大致猜到Mybatis中最重要的组件是:SqlSessionFactoryBuilderSqlSessionFactorySqlSessionMapperSqlSessionFactoryBuilder这个类可以被初始化,使用和丢弃。如果您已经创建了一个SqlSessionFactory,则不需要保留它。所以SqlSessionFactoryBuilder的最佳作用域是方法体,比如定义一个方法变量。可以复用SqlSessionFactoryBuilder生成多个SqlSessionFactory实例,但最好不要强行保留,因为XML解析资源要用于其他更重要的事情。一旦SqlSessionFactory被创建,SqlSessionFactory将一直存在于整个应用进程中。所以没有理由销毁并重新创建它,也不建议在应用程序运行期间多次创建SqlSessionFactory。如果那样做会显得很笨拙。所以SqlSessionFactory的最佳作用域是Application。有很多方法可以实现这一点。最简单的方法是单例模式或静态单例模式。然而,这既没有被广泛接受也不容易使用。相反,使用GoogleGuice或Spring进行依赖反射。这些框架允许您生成管理器来管理SqlSessionFactory的单例生命周期。SqlSession的每个线程都有自己的SqlSession实例。SqlSession实例不能共享并且不是线程安全的。所以最好使用请求范围或方法体范围。不要使用类的静态变量来引用SqlSession实例,甚至不要使用类的实例更改来引用它。永远不要在托管范围内引用SqlSession,例如Servlet中的HttpSession。如果您使用的是Web框架,则应该让SqlSession遵循与HTTP请求类似的范围。也就是说,收到HTTP请求后,打开SqlSession,返回响应后立即关闭SqlSession。关闭SqlSession非常重要。您必须确保SqlSession在finally方法的主体中正确关闭。SqlSessionsession=sqlSessionFactory.openSession();try{//dowork}finally{session.close();}在所有代码中使用此模式以确保所有数据库资源都已完全关闭。MapperMapper是您创建的用于绑定映射语句的接口。Mapper接口的实例是使用SqlSession获取的。此外,从技术上讲,最广泛的Mapper实例范围,如SqlSession,使用请求范围。准确的说是在调用方法时调用Mapper实例,使用完后自动销毁。无需使用显式注销。当一个请求被正确执行时,比如SqlSession,你可以很容易地操作这一切。保持简单并将Mapper保持在方法主体的范围内。//获取数据并解析成User对象Useruser=sqlSession.selectOne("com.tian.mybatis.mapper.UserMapper.selectUserById",1);System.out.println(用户);这里映射涉及到四个主体:实体类User。接口UaerMapper。xml配置文件UserMapper.xml数据库表m_userMybatis的五个部分:总结回顾JDBC的demo,JDBC中的问题,创建一个Mybatis的例子,总结四个重要的组件,以及每个组件的作用。本文转载自微信公众号《Java后端技术全栈》,可通过以下二维码关注。转载本文请联系Java后端技术全栈公众号。