一、初识Mybatis
1.简介
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
Mybatis官方文档:https://mybatis.org/mybatis-3/zh/index.html
持久化:
将数据瞬时状态(内存)和持久状态转换的机制,持久状态可以理解为如硬盘的存储设备。
为什么需要持久化?
内存断电数据即失,而硬盘可以长久的保存数据。
其次,内存成本过高,不能存大量数据。
持久层:
即完成持久化的代码块,我们的Dao层(Date Access Object)即持久层;
Mybatis可以帮助开发人员减去在Dao层一些重复的操作。
2.入门
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>
二、第一个Mybatis程序
1.配置mybatis-cofig.xml
当我们在pom.xml中引入了mybatis的依赖后,建立一个新项目取名mybatis-01。

在src/main/resources中新建一个mybatis-config.xml文件并添加以下代码
<!--configuration核心配置文件--> <configuration> <!-- environments环境配置--> <environments default="development"> <!-- environment环境变量--> <environment id="development"> <!-- transactionManager事务管理器--> <transactionManager type="JDBC"/> <!-- dataSource数据源--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value=你数据库的连接/> <property name="username" value=你的数据库名/> <property name="password" value=你数据库的密码/> </dataSource> </environment> </environments> </configuration>
注意:xml文件中数据库连接里面的分号需要用&来代替
之后,就可以去数据库建立一张表供我们测试,我这里建了一个user表,有三个字段:id、name、pwd
随便填一些数据,再去建立对应的实体类User,有了实体类就可以去写dao层了
在dao文件夹新建一个UserMapper接口
public interface UserMapper { //查询所有用户 List<User> getUserList(); }
接着,在这个文件夹新建一个UserMapper.xml文件
<!--namespace=绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.gsy.dao.UserMapper"> <!-- select 查询语句 id对应方法名
resultType写你自己建的实体类的全限定类名。 --> <select id="getUserList" resultType="com.gsy.pojo.User"> select * from mybatis.user </select> </mapper>
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
SqlSessionFactory由SqlSessionFactoryBuild构建,一旦SqlSessionFactory产生,SqlSessionFactoryBuild也就没用了,所以它最好是存在局部作用域中。
而SqlSessionFactory一旦被创建就应该在运行期间一直存在且不要多次重复创建,所以它的最佳作用域是应用作用域,最简单的就是使用单例模式或者静态单例模式。
我们把它提取成公共类:MybatisUtils.java
public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //使用Mybatis第一步:获取sqlSessionFactory对象 String resource="mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { throw new RuntimeException(e); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。 // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 // 可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
这时我们写一个测试类UserMapperTest.java
public class UserMapperTest { @Test public void test(){ //第一步获得SqlSession对象 SqlSession sqlSession= MybatisUtils.getSqlSession(); //方式一:getMapper UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } //关闭SqlSession sqlSession.close(); } }
这时运行肯定会报错,因为我们的mybatis-config.xml文件中没有为UserMapper.xml注册,我们在mybatis-config.xml末尾加上:
<!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中注册--> <!-- mappers映射器--> <mappers> <mapper resource="com/gsy/dao/UserMapper.xml"/> </mappers> </configuration>
这时再去运行就能拿到全部用户了。
三、配置
1.environments(环境)
Mybatis可以配置多种环境,但是每个SqlSessionFactory实例只能选择一种环境,每个数据库对应一个SqlSessionFactory实例。
如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。
2.properties(属性)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
<properties resource="db.properties"></properties>
db.properties是我们在resources文件夹下新建的配置文件,用来存放连接数据库的信息:dirver、url、username、password
设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如:
<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>标签中添加一些信息:
<properties resource="db.properties"> <property name="username" value=你数据库名/> <property name="password" value=你数据库密码/> </properties>
这时删掉db.properties中的username和password还能成功运行。
这个例子中的 username 和 password 将会由 properties 元素中设置的相应值来替换。 driver 和 url 属性将会由 config.properties 文件中对应的值来替换。这样就为配置提供了诸多灵活选择。
值得注意的是,当我们已经引入了外部配置文件,mybatis数据库配置的参数会优先去找外部配置文件 而不是上方在<properties>标签中的参数。
3.typeAliases(别名)
1>(java bean较少时适合)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:
<!-- 类型别名--> <typeAliases> <typeAlias type="com.gsy.pojo.User" alias="user"></typeAlias> </typeAliases>
这样一来,我们在UserMapper.xml中写的resultType可以直接写别名而不用写全限定名了
这个别名可以使用在任何使用 com.gsy.pojo.User 的地方
2>(java bean较多时适合)
也可以通过扫描包的方式来取别名,Mybatis会在包名下搜索需要的Java Bean
<typeAliases> <package name="com.gsy.pojo"/> </typeAliases>
在没有注解的情况下,会自动使用类名的首字母小写的非限定类名来作为别名(当然大写也没关系,为了规范统一首字母小写)
如果有注解,则别名为其注解值。
4.mappers(映射器)
可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。例如:
<!-- 使用相对于类路径的资源引用 --> <mappers> <mapper resource="com/gsy/dao/UserMapper.xml"/> </mappers>
<!-- 使用映射器接口实现类的完全限定类名 --> <mappers> <mapper class="com.gsy.dao.UserMapper"/> </mappers>
<!-- 将包内的映射器接口全部注册为映射器 --> <mappers> <package name="com.gsy.dao"/> </mappers>
需要注意的是:使用class或扫描包的方式注册mapper 需要接口和其对应的mapper配置文件在同一包下而且同名。