提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
Mybatis
例如:随着大数据的不断发展,Mybaties这门技术也越来越重要,很多人都开启了学习框架,本文就介绍了Mybaties的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用简单的XML或注解来配置和映射原生信息,将jav中的普通对象映射成数据库中的记录。
简单的说:MyBatis 是一个半自动 ORM 框架,其本质是对 JDBC 的封装。使用 MyBatis重点需要程序员编写 SQL 命令,不需要写一行 JDBC 代码。
相反Hibernate是一个全自动的ORM框架;因为 Hibernate 创建了 Java 对象和数据库表之间的完整映射,可以完全以面向对象的思想来操作数据库,程序员不需要手写 SQL 语句,而 MyBatis 中还需要手写 SQL 语句,所以是半自动化的,工作量要大于 Hibernate。
为什么半自动化的 Mybatis 比自动化的 Hibernate 受欢迎?
由于MyBatis 需要手写 SQL 语句,所以工作量要大于 Hibernate。但是也正是由于自定义SQL 语句,所以其灵活性、可优化性就超过了 Hibernate;MyBatis 将手写 SQL 语句的工作丢给开发者,可以更加精确的定义 SQL,更加灵活,也便于优化性能。完成同样功能的两条 SQL 语句的性能可能相差十几倍到几十倍,在高并发、快响应要求下的互联网系统中,对性能的影响更明显
总之,因为 MyBatis 具有封装少、映射多样化、支持存储过程、可以进行 SQL 语句优
化等特点,符合互联网高并发、大数据、高性能、高响应的要求,使它取代 Hibernate 成
为了 Java 互联网中首选的持久框架。而对于对性能要求不高的比如内部管理系统、ERP 等
可以使用 Hibernate。
使用框架的好处:
https://github.com/mybatis/mybatis-3/releases
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 的作用是使用构建者模式创建 SqlSessionFactory 接口对象。
SqlSessionFactory
SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession接口对象
SqlSession
如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的commit、rollback 方法提交或者回滚事务
Mapper
映射器。由一个 Java 接口和 XML 文件(或者注解构成),需要给出对应的 SQL 和映射规则,负责发送 SQL 去执行并返回结果
SqlSessionFactoryBuilder:
该类用来创建 SqlSessionFactory 对象,当 SqlSessionFactory 对象被创建后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域。
SqlSessionFactory:
SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。由于 SqlSessionFactory是 一 个 对 数 据 库 的 连 接 池 , 所 以 它 占 据 着 数 据 库 的 连 接 资 源 。 如 果 创建多个SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。因此 SqlSessionFactory 是一个单例,让它在应用中被共享。
SqlSession:
SqlSession 应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
所以 SqlSession 的最佳的作用域是请求或方法作用域。
Mapper:
由于 SqlSession 的关闭,它的数据库连接资源也会消失,所以它的生命周期应该小于等于 SqlSession 的生命周期。Mapper 代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关的业务,就应该废弃它。
4 Mybatis 的配置文件
https://mybatis.org/mybatis-3/zh/configuration.html
在 Mybatis 中配置文件有两种:
全局配置文件
映射配置文件
4.1全局配置文件
全局配置文件的名称是自定义的,在 JavaProject 项目中需要放到 src 目录下。
全局配置文件的作用是完成一些全局性的配置,如:对 Mybatis 框架的设置、别名设置、环境设置、指定映射配置文件等相关配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
4.1.1 properties 标签
Mybatis 配置文件中的属性定义。properties 标签中允许内部定义属性,也可以是外部的properties 文件定义属性。无论是内部定义还是外部定义,都可以使用${name}获取值。
配置文件中内部定义
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url"
value="jdbc:mysql://localhost:3306/bjsxt"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
配置文件中外部定义
<properties resource="db.properties"></properties>
db.properties文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bjsxt
jdbc.username=root
jdbc.password=3306
4.1.2 typeAliases 标签
类型别名可为 Java 类型设置一个缩写名
<typeAliases>
<typeAlias alias="user" type="com.bjsxt.pojo.User" />
</typeAliases>
也可以指定一个包名,MyBatis 会在包名下面搜索需要的Java Bean
<typeAliases>
<package name="com.bjsxt.pojo"/>
</typeAliases>
4.1.4.1 transactionManager 节点
事务处理器。
在MyBatis 中有两种类型的事务管理器(也就是type="[JDBC|MANAGED]")
JDBC :这个配置直接使用了JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED :不做事务处理。
4.1.4.2 dataSource 标签
dataSource 元素使用标准的JDBC 数据源接口来配置JDBC 连接对象的资源。
UNPOOLED:使用直连。
POOLED:使用池连。
JNDI :使用JNDI 方式连接
4.1.5 mapper 标签
指定映射配置文件
使用相对于类路径指定映射配置文件
<mappers>
<mapper resource="com/zhang/mapper/UserMapper.xml"/>
</mappers>
使用filter:///协议指定映射配置文件
<mappers>
<mapper
url="file:///D:\code\mybatis\src\com\zhang\mapper\UserMapper.xml"
/>
</mappers>
指定映射接口
<mappers>
<mapper class="com.zhang.mapper.UserMapper"/>
</mappers>
通过包名指定映射接口
<mappers>
<package name="com.zhang.mapper"/>
</mappers>
4.2映射配置文件
映射配置文件主要是用来编写sql 语句的,结果集的映射关系的指定,以及缓存的一些配置等等。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhang.mapper.UserMapper">
</mapper>
4.2.1 resultMap 标签
指定查询结果集与对象的映射关系,是最复杂也是最强大的标签。
id:唯一标识。
type:类的完全名, 或者一个类型别名
<resultMap id="userMapper" type="com.zhang.pojo.User">
<id property="userid" column="user_id"/>
<result property="username" column="user_name"/>
</resultMap>
4.2.1.1 id 标签
指定主键中的值,用于标识一个结果映射。
4.2.1.2 result 标签
指定非主键中的值,用于标识一个结果映射。
4.2.1.3 association 标签
通常用来映射一对一的关系。
4.2.1.4 collection 标签
通常用来映射一对多的关系。
4.2.2 select 标签
查询语句。
id:当前查询语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型。该属性是可选属性。因为MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数。
resultType:期望从这条语句中返回结果的类全名或别名。
resultMap:使用resultMap 标签来处理结果集映射。
<select id="selectUser" parameterType="int" resultType="com.zhang.pojo.User">
select * from users where userid = #{userid}
</select>
4.2.3 insert 标签
添加语句。
id:当前添加语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型,可以给定别名。该属性是可选属性。
<insert id="insertUser" parameterType="com.zhang.pojo.User">
insert into users values(default ,#{username},#{usersex})
</insert>
4.2.4 update 标签
更新语句。
id:当前更新语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型,可以给定别名。该属性是可选属性。
<update id="updateUser" parameterType="com.bjsxt.pojo.User">
update users set username=#{username},usersex=#{usersex} where
userid =#{userid}
</update>
4.2.5 delete 标签
删除语句。
id:当前删除语句的唯一标识,该属性的值不能重复。
parameterType:指定参数类型,可以给定别名。该属性是可选属性。
<delete id="deleteUser" parameterType="int">
delete from users where userid = #{userid}
</delete>
4.2.6 sql 标签
可以用来定义可重用的SQL 代码片段。通过标签引入该片段。
id:当前SQL 片段的唯一标识,该属性的值不能重复。
<sql id="userColumns">
userid,username,usersex
</sql>
<select id="selectUser" parameterType="int" resultType="com.zhang.pojo.UserMapper">
select <include refid="userColumns"/> from users
</select>
第一步是,首先要配置全局配置文件
全局配置的单独文件头已在上面记录,小伙伴们可以复古一波;
本人的全局配置文件代码如下:(可借鉴哈)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入db文件-->
<properties resource="db.properties"></properties>
<!--配置环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<environment id="text">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射配置文件-->
<mappers>
<mapper class="com.zhang.Mapper.UserMapper"/>
</mappers>
</configuration>
第二步是配置映射配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD com.zhang.Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhang.Mapper.UserMapper">
<resultMap id="userMapper" type="com.zhang.POJO.Users">
<id property="userid" column="userid"/>
<result property="username" column="username"/>
<result property="usersex" column="usersex"/>
</resultMap>
<select id="selectUsers" parameterType="int" resultType="com.zhang.POJO.Users">
select * from users where userid = ${userid}
</select>
<insert id="insertUser" parameterType="com.zhang.pojo.User">
insert into users values(default ,#{username},#{usersex})
</insert>
</mapper>
需要注意的地方是namespace那里的配置是否正确,刚入门的小伙伴可能会在全局配置文件中的Mapper标签配置错误;如果在运行代码时出现找不到配置文件的记得回头看看Mapper标签是否正确哈;
提示:以上就是本人对Mybatis的总结,第一部分已过一万字,第二部分将于3天后更新哈,喜欢的小伙伴,关注收藏哈: