新的一年了,手里的工作也陆续完工了,在北京漂了快4年了,明年可能有新的打算,考虑回到我梦开始的地方。为了把握住金三银四,打算从今天开始,温习一下自己掌握的技术栈。就先拿mybatis开刀~
Mybatis是当今最流行的持久层框架之一,优秀的半自动ORM设计,可以让我们灵活的通过配置来完成数据库与java实体类的映射,免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,使我们的代码与sql分离,更好的管理项目。
首先,我们要使用mybatis很简单,只要引入相应的jar包即可,拿maven项目来说,只需要引入其gav依赖,我们的例子中要结合mysql来学习mybatis,所以还需要引入mysql相关的驱动包:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency>
每个基于mybatis的应用都是以一个 SqlSessionFactory 的实例为核心的,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder(建造者模式) 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件(传统spring项目,官方建议)或一个预先配置的 Configuration 实例(springboot项目)来构建出 SqlSessionFactory 实例。
这里提到了SqlSessionFactoryBuilder,SqlSessionFactory ,XML 配置文件三个重要的元素,首先从配置文件说起。
打开IDEA,创建一个普通的maven项目,在resource文件夹下创建一个名为mybatis-config.xml的配置文件(名字随便取,建议使用mybatis-config.xml),内容如下:
<?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> <properties resource="config.properties"> <property name="username" value="root"/> <property name="password" value="root"/> </properties> </typeHandlers> <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="mapper/divLayoutInfoMapper.xml"/> </mappers> </configuration>
配置文件的详细内容在下节详细讨论,这里就创建好该配置文件,便于我们能够拿到SqlSessionFactoryBuilder类,进而获取到SqlSessionFactory类。
代码如下:
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这样,我们就能拿到SqlSessionFactory对象了,接下来,从 SqlSessionFactory 中获取 SqlSession,再通过SqlSession拿到相应的mapper,调用其方法即可
try (SqlSession session = sqlSessionFactory.openSession()) { DivLayoutInfoDao mapper = session.getMapper(DivLayoutInfoDao.class); List<DivLayoutInfo> divLayoutInfos = mapper.selectOne(); }
那么问题来了,sql在哪里执行的呢?mapper怎么和sql绑定的呢?怎么就通过调用方法的方式就实现了sql的执行呢?,那就是mybatis的核心之一,mapper.xml映射文件
<?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="mybatis.dao.DivLayoutInfoDao"> <resultMap id="result" type="mybatis.pojo.DivLayoutInfo"> <result property="id" column="id" /> <result property="modeName" column="mode_name"/> </resultMap> <select id="selectOne" resultMap="result"> select * from div_layout_info </select> </mapper>
头文件也是mapper特有,表示该配置文件为mybatis的mapper配置文件,mapper标签中的namespace属性值对应与该mapper绑定的接口类,resultMap标签中的type属性值为查询结果集对应的java实体类路径,sql标签中的id对应接口中的方法名,这样,我们就能够把mapper接口和mapper.xml配置关联起来了,这也是为什么我们可以通过调用接口中的方法就能实现执行sql的原因了。
至此,一个简单的hello,mybatis的demo就完成了~