定制化网站开发公司,设计加盟,沈阳做网站开发公司,百度账号登陆入口看过之前的蜕变系列文章#xff0c;相信你对mybatis有了初步的认识。但是这些还不够#xff0c;我们今天进一步来了解下mybatis的一些用法。猿蜕变同样是一个原创系列文章#xff0c;帮助你从一个普通的小白#xff0c;开始掌握一些行业内通用的框架技术知识以及锻炼你对系…看过之前的蜕变系列文章相信你对mybatis有了初步的认识。但是这些还不够我们今天进一步来了解下mybatis的一些用法。 猿蜕变同样是一个原创系列文章帮助你从一个普通的小白开始掌握一些行业内通用的框架技术知识以及锻炼你对系统设计能力的提升完成属于你的蜕变更多精彩内容还是私信我吧黑机构太多老是举报我大号都被封号了(由此可见对这些黑机构的伤害有多深)。我们第一个程序存在很多问题每一次操作都需要读取配置文件、初始化mybati框架。这样搞出来的程序上就一个字——渣这让我想起了多年以前某个小伙伴告诉我spring的正确使用一样每次方法都让spring框架重新初始化了一次。哈哈知道你也在看的又是一波回忆杀。在第一个mybatis程序中获取SqlSession对象的方式也比较复杂获取SqlSession对象的操作比较复杂由于SqlSessionFactory本身就是用来管理SqlSession对象的应用中一般情况下有一个就足够了我们做一个小优化——使用单利模式来封装下让一个SqlSessionFactory对象去管理SqlSession对象。1.创建一个MyBatisUtil工具类package com.pz.route.util;import java.io.IOException;
import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static{//读取主配置文件InputStream input null;if (sqlSessionFactory null) {try {input Resources.getResourceAsStream(mybatis.xml);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}synchronized (MyBatisUtil.class) {if (sqlSessionFactory null){sqlSessionFactory new SqlSessionFactoryBuilder().build(input);}}}}publicstatic SqlSession getSqlSession() {returnsqlSessionFactory.openSession();}}上面的例子使用了静态代码块的方式创建了一个SqlSessionFactory对象,将SqlSession交给SqlSessionFactory进行管理。2.修改TravelRouteDaoImpl类package com.pz.route.dao.impl;import org.apache.ibatis.session.SqlSession;import com.pz.route.dao.TravelRouteDao;
import com.pz.route.domain.TravelRoute;
import com.pz.route.util.MyBatisUtil;public class TravelRouteDaoImpl implements TravelRouteDao {private SqlSession sqlSession;Overridepublic void add(TravelRoute travelRoute) {try {sqlSession MyBatisUtil.getSqlSession();//新增数据操作sqlSession.insert(com.pz.route.dao.TravelRouteDao.add, travelRoute);//提交SqlSessionsqlSession.commit();//无需再做关闭SqlSessionFactory会自动关闭sqlSession} catch (Exception e) {e.printStackTrace();}}}SqlSession继承了AutoCloseable接口SqlSessionFactory会自动关闭SqlSession。数据库的一些信息最好不要写死在xml里大家基本上都是通过配置的方式读取数据库相关信息。在resources目录下创建db.properties配置文件里面填写下面内容jdbc.driverClassNamecom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://127.0.0.1:3306/route?characterEncodingutf8
jdbc.usernameroot
jdbc.password123456修改mybatis.xml文件使用将数据库连接信息修改为使用配置文件的方式?xml version1.0encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 引入数据库配置信息 --properties resourcedb.properties/environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedrivervalue${jdbc.driverClassName}/property nameurlvalue${jdbc.url}/property nameusernamevalue${jdbc.username}/property namepasswordvalue${jdbc.password}//dataSource/environment/environmentsmappers!--注册映射文件--mapper resourcemapper/TravelRouteMapper.xml//mappers
/configuration 我们新建了Mybatis.xml作为使用Mytatis的主配置文件那么这个主配置文件应该干些什么事情呢 1.配置外部配置文件方便程序使用比如配置db.properties2.设置全局Domain类JavaBean的别名每次使用类的名称空间写起来太麻烦了3.配置运行环境4.配置mapper文件有哪些数据操作使用了mybatis需要要告诉框架5. 设置全局的数据库操作配置比如事务超时时间等等信息我们看看mybatis.xml中的内容properties resourcedb.properties/这样配置以后mybatis就可以从db.properties中获取数据库信息了。我们看看这个配置我们在mapper文件中的写法insert idaddparameterTypecom.pz.route.domain.TravelRoute在mapper中的parameterType需要使用类的名称空间包名类名的方式。每次这样写比较麻烦也比较容易写错。MyBatis提供了typeAliases标签用以定义别名。 typeAliasestypeAlias typecom.pz.route.domain.TravelRoutealiasTravelRoute//typeAliases这样子在mapper中就可以直接使用TravelRoute来代替之前的 com.pz.route.domain.TravelRoute。一个项目上线需要经历多个阶段一般来讲一个项目需要经过开发测试上线的生命周期。那么不可避免的一个项目会有多个运行环境。比如在开发阶段应用往往运行在本地测试阶段会运行在测试服务器到了应用上线之后应用自然运行在生产机器上。在不同的环境下数据库也会有多个比如开发环境在A库测试时在B库项目上线以后在生产库C,那么为了支持不同的环境mybatis提供了environments标签来支持多个环境的问题。environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC /dataSource typePOOLEDproperty namedrivervalue${jdbc.driverClassName} /property nameurlvalue${jdbc.url} /property nameusernamevalue${jdbc.username} /property namepasswordvalue${jdbc.password} //dataSource/environment!--测试环境 --environment idtesttransactionManager typeJDBC /dataSource typePOOLEDproperty namedrivervalue${jdbc.test.driver} /property nameurlvalue${jdbc.test.url} /property nameusernamevalue${jdbc.test.user} /property namepasswordvalue${jdbc.test.password} //dataSource/environment/environments大家可以看到再environments标签中有两个environment子标签配置了两个数据库信息environments标签中的default属性用于选择到底使用的是哪个环境。transactionManager标签用于设置事务管理器用于MyBatis的事务管理。MyBatis 支持两种事务管理器类型 JDBC需要再程序中使用通过SqlSession对象的commit()方法提交通过rollback()方法回滚默认情况下是需要手动提交的。MANAGED由Mybatis来管理事务的整个事务的生命周期默认情况下每次操作都会关闭数据库连接。dataSource标签主要用于配置应用的数据源连接方式和数据库连接信息使用type属性来设置数据源类型UNPOOLED表示不使用数据库连接池每次数据库操作Mybatis都需要创建一个Connection对象。POOLED使用Mybatis提供的数据库连接池。JNDI使用JNDI数据源JNDI的方式一般是配置在应用服务器中Mapper标签的作用就是通知Mybatis使用哪些mapper文件一共有四种写法第一种使用mapper文件的相对路径这个路径是相对于classpath而言的。!--注册映射文件 --mapper resourcemapper/TravelRouteMapper.xml /第二种使用url!--注册映射文件 --mapper urlD://xxx/xxxMapper.xml /第三种使用类的名称空间使用这种方式需要满足以下几个规约 1.Mapper文件名要与 Dao 接口名相同 2.Mapper文件要与接口在同一包中 3.Mapper文件中的 namespace 属性值为 Dao 接口的类的名称空间!--注册映射文件 --mapper classcom.pz.route.dao.TravelRouteDao /第四种使用mybatis提供的动态代理实现无需自己实现xxxDaoImpl使用这种方式需要满足以下几个规约 1dao 使用 mapper 的动态代理实现(后面再将) 2Mapper文件名与 Dao 接口名相同 3Mapper文件与接口放在同一包中 4Mapper文件中的 namespace 属性值为 Dao接口的类的名称空间!--注册映射文件 --
mapper packagecom.pz.route.dao /我们编写的第一个MyBatis程序实现了一个向route数据库travel_route表中新增一条数据的功能有一些比较值得注意的地方大家一起来看下insert idaddparameterTypecom.pz.route.domain.TravelRouteINSERTINTO travel_route(travel_route_name,travel_route_price,travel_route_introduce,travel_route_flag,travel_route_date,isThemeTour,travel_route_count,travel_route_cid,travel_route_image,travel_route_seller_id)values(#{travelRouteName},#{travelRoutePrice},#{travelRouteIntroduce},#{travelRouteFlag},#{travelRouteDate},#{isThemeTour},#{travelRouteCount},#{travelRouteCid},#{travelRouteImage},#{travelRouteSellerId})/insertid需要执行的SQL语句的唯一标识实际上它mybatix被识别的方式是namespaceid,一个id可被用代表一段需要执行的sql语句在一个mapper文件中对id值的要求是不能重复出现的。parameterType:sql语句中参数的类型实际上MyBatis利用反射机制感知dao接口的参数类型不写这个配置也是可以的#{ }这个符号表示参数支持el表达式我们通过JavaBean的方式做参数传递花括号里的值为JavaBean的属性如果属性也是对象支持对象名.方法名的形式。Mybatis事务提交我们看TravelRouteDaoImpltry {sqlSession MyBatisUtil.getSqlSession();//新增数据操作sqlSession.insert(com.pz.route.dao.TravelRouteDao.add, travelRoute);//提交SqlSessionsqlSession.commit();//无需再做关闭SqlSessionFactory会自动关闭sqlSession} catch (Exception e) {e.printStackTrace();}默认情况下Mybatis的事务是不会自动提交的如果想自动提交事务可以在MyBatisUtil中修改openSession的方法传入参数true。如果不传入任何参数或者传入false,mybatis无法自动提交事务。 public static SqlSession getSqlSession() {return sqlSessionFactory.openSession(true);}如果不提交事务数据是不会持久化到数据库的。travel_route表我们设置的主键是自增长类型所以在编写SQL的时候我们不用写入主键travel_route_id如果我们想在插入数据后获取主键我们可以使用下面的方式 selectKey resultTypeLongkeyPropertytravelRouteId orderAFTERSELECT identity/selectKey这样子在mybatis完成insert操作之后后会将当前写入数据的ID查询出来重写Travle的toString方法再编写一段程序看下效果 Testpublic void testAddTravelRoute(){TravelRouteDao travelRouteDao new TravelRouteDaoImpl();TravelRoute travelRoute new TravelRoute();travelRoute.setTravelRouteName(新增线路2);travelRoute.setTravelRoutePrice(999d);travelRoute.setTravelRouteDate(2019-10-26);travelRoute.setTravelRouteFlag(1);travelRoute.setIsThemeTour(1);travelRoute.setTravelRouteCount(0);travelRoute.setTravelRouteCid(1);travelRoute.setTravelRouteIntroduce(双导游服务免收服务小费周全照顾贴心服务随心出游品尝越南特色国宝美食升级一餐越式炸鸡火锅宴);travelRoute.setTravelRouteImage(img/product/small/m3db4d2277b5df3d98597f79082ef92d6d.jpg);travelRoute.setTravelRouteSellerId(1L);System.out.println(before insert);System.out.println(travelRoute);travelRouteDao.add(travelRoute);System.out.println(after insert);System.out.println(travelRoute);}我们再在TravelRouteDaoImpl中commit打印增加两行打印代码Overridepublic void add(TravelRoute travelRoute) {try {sqlSession MyBatisUtil.getSqlSession();//新增数据操作sqlSession.insert(com.pz.route.dao.TravelRouteDao.add, travelRoute);System.out.println(before commit);System.out.println(travelRoute);//提交SqlSessionsqlSession.commit();//无需再做关闭SqlSessionFactory会自动关闭sqlSession} catch (Exception e) {e.printStackTrace();}}运行程序后我们可以清晰地看到在commit之前id已经有值了实际上当insert语句执行后commit之前主键id已经返回了数据这个事务不管是commit或者是rollbacktravel_route的主键已经使用掉一个了再做insert操作mysql只会分配一个新的主键。由此我们得出一个结论数据库主键的分配和是否提交无关只要执行了insert操作mysql就会分配一个主键。