mybatis自学笔记-1

  从昨天开始对mybatis突然有了很深的兴趣,主要原因在于这几天的项目采用的是smm,以后使用mybatis的概率也是非常大,抱着一劳永逸的想法,选了这几天的黄道吉日就把mybatis给办了吧。笔记主要参考mybatis的官网,在此给出链接,以防忘记:http://www.mybatis.org/mybatis-3/zh/getting-started.html.

一、maven依赖

  maven中使用mybatis十分简单,只需要指定依赖即可,可以省去很多麻烦。maven是十分方便且简单的代码管理工具,可以省去很多找资源的时间,想起之前为了搭建ssh框架四处找依赖包,心疼自己一秒。比学习更重要的是眼界,使用一些有用的工具可以是开发效率事半功倍,以此为戒;

1 <dependency>
2   <groupId>org.mybatis</groupId>
3   <artifactId>mybatis</artifactId>
4   <version>x.x.x</version>
5 </dependency>
mybatis依赖包

 

二、构造SqlSessionFactory

每个基于mybatis的应用都是以一个SqlSessionFactory的实例为中心的。通过SqlSessionFactory可以构造出Session,通过Session可以与后端数据库进行交互,因此SqlSessionFactory是业务逻辑与后端数据库进行沟通的关键桥梁。Session的生命周期较短,并且不安全,因此每个线程都应该有自己的SqlSession实例。SqlSssion的最佳作用域是请求或方法作用域。而SqlSessionFactory对于每次请求都要建立一个Sqlsession,因此SqlSessionFactory的生命周期应为应用的生命周期。SqlSessionFactory贯穿这个应用,因此构造SqlSessionFactory是一个关键所在。mybatis提供了两种构造途径。

1、通过xml构造SqlSessionFactory(推荐)

对于SqlSessionFactory的相关配置可以定义在mybatis-config.xml中,通过输入流(inputStream)可以读取文件中的内容。SqlSessionFactoryBuilder拥有一个静态方法build,接收一个输入流,并返回SqlSessionFactory。至此,SqlSessionFactoryBuilder完成任务,一般情况下SqlSessionFactoryBuilder只出现少数几次。

//mybatis-config.xml的一般配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers> </configuration>

 

1 String resource = "org/mybatis/example/mybatis-config.xml";
2 InputStream inputStream = Resources.getResourceAsStream(resource);
3 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

 2、通过Java代码构建SqlSessionFactory(较少使用)

对于上面mybatis-config.xml文件中的配置,java都提供了相对于的类用于SqlSessionFactory的配置。很容易可以猜到,一个标签对应一个类,标签的包含关系对应于类的依赖关系。因此使用到的类主要有Configuration,Environment,TransactionFactory,Mapper以及DataSource。代码如下

1 DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
2 TransactionFactory transactionFactory = new JdbcTransactionFactory();
3 Environment environment = new Environment("development", transactionFactory, dataSource);
4 Configuration configuration = new Configuration(environment);
5 configuration.addMapper(BlogMapper.class);
6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

 

 

三、SqlSession与Mapper

1、获取SqlSession。Sqlsession可以通过前面构建的SqlSessionFactory获得,调用openSession返回一个SqlSession类

SqlSession session = sqlSessionFactory.openSession();
try {Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {session.close();
}

 

2、Mapper是Service层调用Dao层的接口,Mapper只是定义了一系列Service提供服务需要使用的接口,不参与接口的实现,Mapper接口的实现主要使用了mybatis的SQL功能,在mapper.xml中动态定义一些需要使用的SQL语句并执行。Mapper类有SqlSession获得,并完成对数据库的一次操作,具体如下:

SqlSession session = sqlSessionFactory.openSession();
try {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
} finally {session.close();
}

 

下面附上一个Mapper的简单例子,BlogMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>

 

3、作用域及生命周期

类的作用域与生命周期取决于类在应用的发挥的作用

3.1、SqlSessionFactoryBuilder,这个类可以被实例化,主要是为了通过配置构造SqlSessionFactory类,之后便没有什么作用。故生命周期应为方法作用域,只调用一次或少数几次,方法完成后自动销毁。

3.2、SqlSessionFactory,这个类在应用运行期间为每次请求分配一个Sqlsession进行处理,因为客户端请求在应用运行周期内都可能发生,故该类的生命周期应为应用的生命周期。一般来说,一个应用中值含有一个SqlSessionFactory。

3.3、SqlSession,这个类主要在一次请求中构造各个相关的Mapper来为请求服务,因此该类的生命周期为一次请求或者方法作用域。并且该类线程不安全,因此不能被共享,当请求完成响应,该类的一次实例的任务也便完成,故而应该关闭,减少数据库的开销。

3.4、Mapper,该类从SqlSession类中获得,为SqlSession类服务,故该类的生命周期不应大于SqlSession类的生命周期,一般Mapper放在方法作用域中,在调用它的方法中执行,方法结束便自动销毁。

 

四、XML映射配置文件

mybatis使用配置管理应用,是的配置信息与代码分开,便于修改以及扩展,十分方便。虽然现在注解越来越盛行,但xml配置的简单性,全局性的优点也是注解无法取代的。

mybatis-config.xml是mybatis的主要配置文件,配置项很多,但真正用到的却不多。官网下列出的配置项主要有如下几个

1、configuration 配置

1.1 properties

1.2 settings

1.3 typeAliases

1.4 typeHandlers

1.5 objectFactory

1.6 plugins

1.7 environments

1.8 databaseIdProvider

1.9 mappers

 

2、properties

定义了一些可外部配置且动态替换的属性,可以通过子元素的方式配置,也可以引入外部的properties文件。这些属性在整个配置文件中可被用来替换需要动态配置的属性值,类似于C语言中的宏,主要是为了方便修改以及统一配置。

<properties resource="org/mybatis/example/config.properties"><property name="username" value="dev_user"/><property name="password" value="F2Fa3!33TYyg"/>
</properties>
<dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>

 

 值得注意的是,properties元素中指定的属性优先级最低。Mybatis中properties的加载顺序如下:

  • 在 properties 元素体内指定的属性首先被读取。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

 

 同时,在属性没有找到想要的属性值时,可以指定一个默认的属性值(默认冒号:后面为默认值),需要打开一个属性值并可以使用该特征

<properties resource="org/mybatis/example/config.properties"><!-- ... --><property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- Enable this feature -->
</properties>

 

 

 3、settings

该表现在的设置为mybatis的全局设置,可以改变mybatis的运行时行为,下面粘上经常使用的配置项,其他可以根据需要到官网查找

<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="useGeneratedKeys" value="false"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25"/><setting name="defaultFetchSize" value="100"/><setting name="safeRowBoundsEnabled" value="false"/><setting name="mapUnderscoreToCamelCase" value="false"/><setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="OTHER"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

 

 

4、typeAliases

从名字可以知道,该标签配置的是Java类型别名,主要作用是减少类完全限定名的冗余,对于常用的类名进行配置,可以带来很多方便,特别是在mapper.xml中时。下面附上一个使用的实例

<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/><typeAlias alias="Blog" type="domain.blog.Blog"/><typeAlias alias="Comment" type="domain.blog.Comment"/><typeAlias alias="Post" type="domain.blog.Post"/><typeAlias alias="Section" type="domain.blog.Section"/><typeAlias alias="Tag" type="domain.blog.Tag"/>
 <package name="domain.blog"/> </typeAliases>

 

配置上包名时,可以在类的上方使用@Alias(“别名”)注解添加别名,否则,会使用类的首字母小写的非限定类名作为别名,eg:

@Alias("author")
public class Author {...
}

 

 

5、mappers

该标签主要用于告诉mybatis去哪里寻找匹配的sql语句,通常使用类路径的资源引用,或者完全限定资源定位符,或者类名,及包名等。下面附上两种常用的方式:

<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

 

 

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers><package name="org.mybatis.builder"/>
</mappers>

 

 

6.environment

mybatis可以配置多种环境,有助于将SQL映射应用于多种数据库中。在mybatis-config.xml中可以配置多个environment,但是构造SqlSessionFactory时只能指定一种环境,可以通过SqlSessionFactory的构造函数传入使用的environment,否则使用默认的environment

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, properties);

 

下面附上environments的一个实例

<environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="..." value="..."/></transactionManager><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>
</environments>

 

转载于:https://www.cnblogs.com/hi-dongshen/p/9863274.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迈向智能世界2030的九大技术挑战与研究方向

来源&#xff1a;华为在2021华为全球分析师大会上&#xff0c;华为董事、战略研究院院长徐文伟发布了迈向智能世界2030的九大技术挑战与研究方向&#xff0c;呼吁产学研精诚合作&#xff0c;以开放包容、协同创新的机制&#xff0c;汇集全人类的智慧和创新能力&#xff0c;满足…

VM虚拟机下配置centos linux系统

如果配置中出现错误,请参照下列文档参照: 1. linux关于connect: network is unreachable 问题的解决 https://blog.csdn.net/liu911025/article/details/73431468/ 2. Centos 配置eth0 提示Device does not seem to be present https://blog.csdn.net/xiaobei4929/article/de…

2021年AI将改变制造业的6大应用趋势

来源&#xff1a;先进制造业▍一、用于缺陷检测的深度学习在制造中&#xff0c;生产线中的缺陷检测过程变得越来越智能。深度神经网络集成使计算机系统可以识别诸如刮擦&#xff0c;裂纹&#xff0c;泄漏等表面缺陷。通过应用图像分类&#xff0c;对象检测和实例分割算法&#…

RequestMapping注解的继承问题

RequestMapping注解被用来注明访问路径&#xff0c;例如: RequestMapping("/data") RequestMapping("/user/list") 在写代码的时候遇到了there is already xxxx been method的错误&#xff0c;显示之前已经被注入&#xff0c;发现是父类中有相同的Reque…

神经科学家为视力受损的人研发新技术

来源&#xff1a;IEEE电气电子工程师作者&#xff1a;Megan Scudellari有许多可穿戴和便携式设备&#xff0c;旨在改善盲人和视力受损者的生活&#xff08;在某些情况下&#xff0c;甚至恢复视力&#xff09;。这些装置已经被开发用于身体的几乎每个部位&#xff1a;手指、手腕…

用机器指令和汇编指令编程(修改版)

实验名称 用机器指令和汇编指令编程(1)实验日期 2018.10.22 学院&#xff1a;计软院 专业&#xff1a;计算机科学与技术 年级&#xff1a;2017级班次&#xff1a;5班 姓名&#xff1a;陈奕明 学号 20171308194一、实验目的 1. 掌握使用debug工具编写和调试汇编命令的方…

学术交流丨魏子卿院士:北斗坐标系

来源&#xff1a;微信公众号中国测绘学会引文格式&#xff1a;魏子卿, 吴富梅, 刘光明. 北斗坐标系[J]. 测绘学报&#xff0c;2019&#xff0c;48(7)&#xff1a;805-809. DOI: 10.11947/j.AGCS.2019.20190131第一作者&#xff1a;魏子卿&#xff08;中国工程院院士&#xff0c…

centos 安装MySQL报错You could try using --skip-broken to work around the problem You could try running:

centos 安装MySQL报错You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum …

​马斯克的全球上网计划:月费646元,网速可达200Mbps

SpaceX创始人兼首席执行官埃隆马斯克来源&#xff1a;腾讯科技审校作者&#xff1a;金鹿腾讯科技讯 4月16日消息&#xff0c;美国太空探索技术公司SpaceX在六个月前向公众推出了Starlink Early Access计划。在最初的几个月里&#xff0c;这项卫星互联网服务的用户增长到了1万多…

剑指 Offer 68 - II. (二叉树)二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

从狼群智能到无人机群协同决策

来源&#xff1a;飞思实验室文&#xff1a;小翼生物群集行为是自然界存在的一种普遍现象 ,先前的研究已表明人们可以通过模仿鸟群、鱼群、蜂群等行为, 研究其群体性决策机制, 进而用于构建集群系统的决策系统框架. 狼群在认知、分工, 以及复杂环境适应性等方面具有突出的优势, …

华为自动驾驶实车实路测试视频曝光!

来源&#xff1a;量子位、物联网智库等自动驾驶的风又刮起来了&#xff0c;这次处在风暴中心的是华为。4月15日&#xff0c;消息称配备华为自动驾驶技术的北汽新能源极狐阿尔法S的HI版车型在上海进行了公开试乘&#xff0c;这也是华为自动驾驶技术公开试乘的全球首秀。就试乘效…

未来智能:人有人用,机有机用

来源&#xff1a; 苇草智酷作者&#xff1a;王飞跃当今最好的人工智能程序到底有多智能&#xff1f;它们是如何工作的&#xff1f;能做些什么&#xff1f;我们有必要担心机器比人类聪明且将很快夺取我们的工作吗&#xff1f;以上这些问题都颇受人们的关注&#xff0c;梅拉妮米歇…

因果作用推断、因果网络学习及其他

来源&#xff1a;久章智能 未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱…

通信人工智能的下一个十年(上)

来源&#xff1a;电信科学欧阳晔1, 王立磊1, 杨爱东1, 马利克萨哈2, 大卫贝兰格3,4, 高同庆5, 韦乐平6, 张亚勤71 亚信科技&#xff08;中国&#xff09;有限公司&#xff0c;北京 1001932 美国威瑞森电信公司&#xff0c;美国 纽约 100363 美国电话电报公司&#xff0c;美国 得…

大脑使用交叉存储,来区分现在和过去

来源&#xff1a;混沌巡洋舰在每一个清醒的时刻&#xff0c;人类和其他动物必须在我们对过去的记忆和对现在的意识两者中保持平衡。我们必须吸收关于周围世界的新的感官信息&#xff0c;同时保持对早期观察或事件的短期记忆。我们理解周围环境、学习、行动和思考的能力都依赖于…

对象在内存中的存储布局

对象头包含&#xff1a; markword(和锁相关的信息) 8字节 class pointer(说明对象属于哪个类)&#xff0c;jvm指针八字节&#xff0c;但是默认压缩&#xff0c;所有4个字节 对象体包含&#xff1a; instance word实例数据(例如int&#xff0c;这就占四个字节&#xff0c;l…

用研究新范式破解生命科学难题

来源&#xff1a;中国科学报 作者&#xff1a;丛斌&#xff08;中国工程院士&#xff09;采访整理&#xff1a;张思玮&#xff08;本报记者&#xff09;当今&#xff0c;世界科技正处于重大变革前夕。各领域科学家们一直积极地探索物质本质、宇宙本源、生命本质&#xff0c;并迫…

synchronized与volatile

synchronized实现过程&#xff1a; 1.Java代码&#xff1a;synchronized 2.字节码层级&#xff1a;monitorenter&#xff0c;monitorexit 3.执行过程中自动升级&#xff08;偏向->自旋->重量级锁&#xff09; 4.cpu汇编层级:lock comxchg 上图为双核cpu的内部构造&am…

AI 技术与人类主体想象 ——基于人工直觉在线讨论的研究

来源&#xff1a; 人工智能哲学探索作者&#xff1a;雅克布约翰森&#xff08;英国圣玛丽大学&#xff09; 王鑫&#xff08;辽宁大学&#xff09;一、引言:AI、神经形态硬件、人工直觉AI 在媒体上的讨论越来越多,很多广为流行的专业网站上的相关探讨涵盖了 AI 发展的最新趋势和…