好像很多spring项目都会用到mybatis,但是一直不确定用到这个东西的作用。
所以,索性自己再了解总结一下,mybatis在spring中的作用。
首先需要导入 依赖,诸如此类:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
2.用来连接数据库的数据源:
db.username=root
db.password=admin
db.url=jdbc:mysql://localhost:3306/meeting?serverTimezone=GMT%2B8
3.主要的xml配置
<context:property-placeholder location="classpath:db.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="url" value="${db.url}"/>
</bean>
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="org.javaboy.meeting.model"/>
<property name="mapperLocations">
<value>
classpath*:org/javaboy/meeting/mapper/*.xml
</value>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="mapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
<property name="basePackage" value="org.javaboy.meeting.mapper"/>
</bean>
第一行:
context:property-placeholder的作用:是为了方便编码人员在一个阶段内不需要频繁书写一个参数的值,而在不同阶段间又可以方便的切换参数配置信息。
为此提供了这个元素,在配置文件里加入这个,并输入对应的location,就是参数配置文件的位置,而这个参数配置文件一般都是放在src目录下,并且参数配置文件的格式也是和java通用的参数配置文件相同,也就是键值对的形式,例如:
#jdbc配置
test.jdbc.driverClassName=com.mysql.jdbc.Driver
test.jdbc.url=jdbc:mysql://localhost:3306/test
test.jdbc.username=root
test.jdbc.password=root
下一个bean,DruidDataSource:
就只能单纯理解为 这是一个数据库连接池。
第二个bean是sqlSessionFactoryBean,转载自网上:
SqlSessionFactoryBean的主要作用便是用来创建SqlSessionFactory,在它的构建过程中会解析MyBatis所需要的配置文件,将所有配置都封装到Configuration类中,最后返回SqlSessionFactory实例。SqlSessionFactoryBean实现了Spring中两个用于初始化Bean的接口FactoryBean、InitializingBean.
所以可以理解为是用来创建SqlSessionFactory,而SqlSessionFactory的作用是:其实也就是获得sqlsession;
网上有说到一个具体的步骤:
第一步首先是sqlSessionFactoryBuilder去读取mybatis的配置文件,然后build一个defaultSqlSessionFactory,即得到SqlSessionFactory (而在spring这边是通过 sqlSessionFactoryBran来创建sqlSessionFactory)
第二步,获取到SqlSessionFactory之后,就可以利用sqlSessionFactory方法的openSession来获取SqlSession对象了
SqlSession对象就可以调用其中的内部方法进行curd操作了(而SqlSession也是调用Executor执行器 ,这就是底层的知识了)
他有三个参数,分别是:
- datasource:用来进行数据库连接,(解决数据库频繁创建连接、释放资源 这个问题),但是在小项目中其实用不太到吧
- mapperLocations
:他是使用一个资源位置的list,这个属性可以用来指定MyBatis的xml映射器的文件位置。(小细节就是classpath后面的*必不可少) - typeAliasesPackage:是自动配置别名,也就是设置这个之后,在Mybatis的Mapper文件里就可以写对应的类名,而不用写全路径名了
例如:
typeAliasesPackage: xyz.hashdog.modules.*.bean
配置后
<select id="findById" parameterType="int" resultType="xyz.hashdog.modules.User.bean">
select * from items where id = #{id}
</select>
就可以写成
<select id="findById" parameterType="int" resultType="User">
select * from items where id = #{id}
</select>
再是mapperlocation那边记录的对应的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="org.javaboy.meeting.mapper.MeetingRoomMapper">
<select id="getAllMrs" resultType="org.javaboy.meeting.model.MeetingRoom">
select * from meetingroom;
</select>
<select id="getMrById" resultType="org.javaboy.meeting.model.MeetingRoom">
select * from meetingroom where roomid=#{roomid};
</select>
<update id="updateRoom" parameterType="org.javaboy.meeting.model.MeetingRoom">
update meetingroom set roomnum=#{roomnum},roomname=#{roomname},capacity=#{capacity},status=#{status},description=#{description} where roomid=#{roomid};
</update>
<insert id="addmrs" parameterType="org.javaboy.meeting.model.MeetingRoom">
insert into meetingroom (roomnum,roomname,capacity,status,description) values (#{roomnum},#{roomname},#{capacity},#{status},#{description});
</insert>
</mapper>
这些就都可以进行对应的数据库操作了
这应该就是对于mybatis和数据库在spring中的相对完整的操作了
看到一个说的特别好的
MyBatis的持久化解决方案是将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以以面向对象的方式来进行持久化层操作.底层数据库连接的获取,数据访问的实现,事务控制等都无须用户关心,从而将应用层从底层的JDBC/JTA API抽取出来.通过配置文件管理JDBC连接,让MyBatis解决持久化的实现.
简单来说就是:封装了jdbc很多细节,使开发者只需要关注sql语句本身,无需关注注册驱动,创建连接等过程,而为什么能实现这样,主要还是sqlSession的操作。在MyBatis中的常见对象有SqlSessionFactory和SqlSession.
mybatis为什么能封装JDBC
网上还有对应的解释: