mybatis 使用jdbc_MyBatis笔记一
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data...
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
MyBatis 的基本要素
三个基本要素:
1.核心接口和类
2.MyBatis 核心配置文件 (mybatis-config.xml)
3.SQL 映射文件 (Mapper.xml)
使用mybatis
如果使用Maven来构建项目,只需要将下面的依赖代码放置于pom.xml中即可:
<dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>3.2.6version>dependency>
如果不使用Maven来构建则需要手动下载并导入mybatis的jar包。
ORM 即对象/关系映射 ,是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。
基于ORM,MyBatis在对象模型和关系数据库的表之间建立了一座桥梁,通过MyBatis建立SQL关系映射,以便捷地实现数据存储,查询,更改和删除等操作。
MyBatis核心配置文件
创建mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?><configuration> <settings> <setting name="logImpl" value="LOG4J"/> settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3307/smbms?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> dataSource> environment> environments> <mappers> <mapper resource="sql映射文件路径"/> mappers>configuration>
mybatis-config.xml文件需配置一些基本元素,需要注意的是,该配置文件的元素节点是有先后顺序的,层次结构如下:
configuration 配置
properties 可以配置在Java属性配置文件中
settings 修改MyBatis在运行时的行为方式
typeAliases 为Java类型命名一个别名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
configuration
根节点,MyBatis的所有配置信息都在这里面。
properties
使用 resource 属性引用外部的 Java属性配置文件或在子节点中设置值。
<properties resource="db.properties"> <property name="user" value="root"/> <property name="password" value="root"/>properties>
需要注意的是,resource的值优先级高于其子节点的值。
settings
| 设置项(部分) | 描述 | 允许值 | 默认值 |
|---|---|---|---|
| cacheEnabled | 对在此配置文件下的所有cache进行全局性开/关设置 | true|false | true |
| lazyLoadingEnabled | 全局性设置懒加载。如果设为false,则所有相关联的都会被初始化加载 | true|false | true |
| autoMappingBehavior | MyBatis对于resultMap自动映射的匹配级别 | NONE|PARTIAL|FULL | PARTIAL |
NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。FULL 会自动映射任何复杂的结果集(无论是否嵌套)。
一个配置完整的 setting 元素示例:
<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>
typeAliases
作用是配置类型别名,通过MyBatis的SQL映射文件相关联,减少输入多余的完整类名
<typeAliases> <typeAlias type="com.shudong.pojo.User" alias="User" />typeAliases>
这种写法可以在写SQL映射文件的时候简写类名,但有一个弊端,就是当有多个pojo的时候,需要一个一个的取别名。这个时候我们就可以使用下面这种方式:
<typeAliases> <package name="com.shudong.pojo" />typeAliases>
当通过package的name属性直接指定包名时,MyBatis会自动扫描指定包下的 JavaBean 并设置一个别名,默认别名为 类名。
即 com.shudong.pojo下有User类,那它的别名就是User,别名忽略大小写。
若有注解,则别名为其注解值 (别名为author)
@Alias("author") public class Author { ... }
typeHandlers
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。
提示从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。
由于这个还没用到,所以暂时不做笔记。
objectFactory
每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。
默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。比如:
// ExampleObjectFactory.java public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(Class type, List constructorArgTypes, List<Object> constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } public boolean isCollection(Classtype) { return Collection.class.isAssignableFrom(type); } }
<objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/>objectFactory>
ObjectFactory 接口很简单,它包含两个创建实例用的方法,一个是处理默认无参构造方法的,另外一个是处理带参数的构造方法的。另外,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。
plugins
插件.
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
-
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
-
ParameterHandler (getParameterObject, setParameters)
-
ResultSetHandler (handleResultSets, handleOutputParameters)
-
StatementHandler (prepare, parameterize, batch, update, query)
这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。这些都是更底层的类和方法,所以使用插件的时候要特别当心。
environments
MyBatis 可以配置多套运行环境,如开发环境,测试环境,生成环境等,我们可以灵活选择不同的配置,从而将sql映射应用到不同的数据库环境上。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推,记起来很简单。
如果忽略了环境参数,则会加载默认的环境,如果需要指定创建某一种环境,则需要将环境ID参数传递给SqlSessionFactoryBuilder:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(读取配置信息, 环境ID);SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(读取配置信息, 环境ID, 属性);
mybatis-config.xml中的具体配置:
<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="test"> environment> environments>
默认的环境通过 default 属性设置
transactionManager
事务管理器,设置其类型为 JDBC 或 MANAGED.
-
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
-
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接。
dataSource
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
MyBatis提供了三种数据源类型。
UNPOOLED – 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。
POOLED – 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。这种处理方式很流行,能使并发 Web 应用快速响应请求。
JNDI – 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。
mappers
映射器,我们需要告诉 MyBatis 到哪里去找到SQL语句。
我们可以使用相对于类路径的资源引用,或完全限定资源定位符(包括file:///形式的 URL),或类名和包名等
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/>mappers>
<mappers> <mapper url="file:///D:/mappers/AuthorMapper.xml"/> <mapper url="file:///D:/mappers/BlogMapper.xml"/> <mapper url="file:///D:/mappers/PostMapper.xml"/>mappers>
<mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/>mappers>
<mappers> <package name="org.mybatis.builder"/>mappers>
MyBatis 的核心对象
1.每个MyBatis的应用程序都以一个 SqlSessionFactory 对象的实例为核心。
2.获取 SqlSessionFactoryBuilder 对象,可以根据xml配置文件或Configuration类的实例构建对象。
3.然后获取 SqlSessionFactory 对象,该对象实例可以通过 SqlSessionFactoryBuilder 对象获得。
4.进而获得 SqlSession 实例,SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。通过 SqlSession 实例来直接执行已映射的 SQL 语句。
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,它提供了多个build()方法的重载。
build() 方法读取配置文件的方式主要分为 InputStream(字节流)、Reader(字符流)、Configuration(类)。
以下通过字节流读取xml配置文件的方式来构造SqlSessionFactory:
private static SqlSessionFactory factory; static { try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); factory = new SqlSessionFactoryBuilder().build(is); is.close(); } catch (IOException e) { e.printStackTrace(); } }
SqlSessionFactoryBuilder 的生命周期是一旦创建了 SqlSessionFactory 对象后,就不需要存在了。因此SqlSessionFactoryBuilder 的最佳作用域范围就是存在于方法体当中。
SqlSessionFactory
SqlSessionFactory 是用来创建 SqlSession 实例的工厂(译为中文差不多的意思)。
所有的 MyBatis 应用都是以 SqlSessionFactory 实例为中心。
我们可以通过 SqlSessionFactory 提供的 openSession() 方法来获取 SqlSession.
SqlSessionFactory 对象一旦创建,因为没有理由去销毁或是再创建,所以 SqlSessionFactory 的生命周期是同应用程序共存亡,并且同时只能存在一个对象实例,所以采用单例模式或者静态单例模式创建。SqlSessionFactory 的最佳作用域即是Application(应用的作用域)。
SqlSession
SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的Connection .提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。
SqlSession对应着一次数据库会话。每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。
在所有代码中都遵循以下这种使用模式,可以保证所有数据库资源都能被正确地关闭。
try (SqlSession session = sqlSessionFactory.openSession()) { // 你的应用逻辑代码}
映射文件
以下是一个简单的 SQL 映射文件,更多的映射文件笔记将会在下次揭晓。
<?xml version="1.0" encoding="UTF-8" ?> <mapper namespace="mapper.UserMapper"> <select id="getAllUser" resultType="user"> select * from smbms_user; select> mapper>

分享、点赞、在看三连
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)