Mybatis是基于ORM(对象关系映射,即Java对象和数据库关系映射)模型,它是一种半自动映射的框架,除了提供Java对象和映射关系外还需要提供SQL。全表映射的Hibernate不需要提供SQL,但是也失去了Mybatis的很多灵活性。
配置Mybatis很简单,只需要去github上的Mybatis官网下载Mybatis,里面包括Mybatis的源码和jar包,只需要将jar包导入项目即可使用了,还要注意将对应数据库驱动的jar包也倒入项目,否则Mybatis也无法连接数据库。
Mybatis的基本构件:
SqlSessionFactoryBuilder:它根据配置文件或代码,使用它的build方法来生成SqlSessionFactory。使用完就废弃掉了。
SqlSessionFactory:依靠工厂方法来生成SqlSession会话,所有的SqlSession都是一个Factory生成的,所以对它采用单例模式。
SqlSession:通常是来执行一个SQL,或者获取Mapper接口,在不使用缓存的情况下每个sql对应一个Session,使用完毕后关闭。
SQL Mapper:由一个mapper接口和XML文件构成,需要给出SQL和映射规则,当SQL字段和java bean字段一致时会自动映射。
基本的文件目录:
- 1.mybatis-config.xml配置文件,SqlSessionFactoryBuilder通过读取配置文件输入流生成SqlSessionFactory,对Mybatis有重要影响。
- 2.POJO为java bean
- 3.SqlSessionFactoryUtil类实现了生成SqlSessionFactory单例的方法和打开一个SqlSession会话的方法。
- 4.Mapper接口和XML配置文件构成的SQL Mapper,提供SQL和映射关系。通常将sql语句的结果赋给java bean。
- 5.test类中用SqlSessionFactoryUtil对象打开SqlSession会话,然后用SqlSession获取Mapper,调用Mapper的方法执行sql语句并返回结果。
配置文件
Mybatis中比较重要的一部分:配置文件
<configuration>
<!--配置元素,通常使用properties文件配置-->
<propertises resource="jdbc.properties" />
<!--设置Mybatis参数,如缓存开关,延迟加载开关等-->
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
</settings>
<!--配置别名,基本的类为系统自带别名如_int为int的别名,通常给全限定名过长的类一个别名-->
<typeAliases>
<typeAlias alias="student" type="com.study.POJO.Student"/>
</typeAliases>
<!--类处理器,在javaType和jdbcType间进行切换,同样有系统自带的typeHandler-->
<typeHandlers>
<typeHandler jdbcType="VARCHAR" javaType="String" handler="MyTypeHandler" />
</typeHandlers>
<objectFactory />
<plugin />
<!--配置环境,主要是数据源(dataSource)和数据库事务的配置(transactionManager)-->
<environments default="develop">
<environment id="develop">
<transactionManager type="JDBC">
<property name="autoCommit" value="false"/>
</transactionManager>
<dataSource type="POOLED">
<!--引用properties文件的配置-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--数据库厂商标识-->
<databaseIdProvider/>
<mappers>
<!--引入映射器有三种方式-->
<mapper resource="com/study/mapper/StudentMapper.xml" />
<package name="com.study.mapper" />
<mapper resource="com.study.mapper.StudentMapper" />
</mappers>
</configuration>
映射器
Mybatis中最重要的就是映射器了,包括一个Mapper接口申明数据库操作的一些方法,然后就是含有具体SQL的XML文件。
映射器包含select,insert,update,delete,parameterMap,resultMap,sql,cache,等元素。可以将映射器中四个包含SQL的元素分为三部分,传递的参数映射+结果的映射+SQL语句。
自动映射:
当数据库和javaBean的字段一致时Mybatis会自动映射二者,即使不一致也可以使用:
role_name(数据库列名) as rolename来将二者映射起来
参数映射:
<resultMap id="studentMap" type="com.study.POJO.Student">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<collection property="lessons" column="id" select="com.study.mapper.LessonMapper.getBySid"></collection>
</resultMap>
<select id="getById" parameterType="_int" resultMap="studentMap">
SELECT id, name FROM student WHERE id = #{id}
</select>
传递的参数parameterType为mabatis-config.xml配置文件中的typeAliases的别名,使用时在SQL语句中用#{ }表示传入的参数。这是在一个参数传递的情况。当有多个参数传递时:
1.使用Map传递参数
parameterType="map"
接口中的方法改为 Student getStudent( Map<String, String> params);
2.使用注解的方法传递
接口中的方法改为 Student getStudent( @Param("id") int id, @Param("name") String name);
SQL语句中以@Param("")中的别名表示参数#{id},#{name}
3.用参数构建一个javaBean再将这个javaBean作为一个参数传入
结果映射:
resultType="student"
有时候结果集非常复杂可以使用resultMap="studentMap",studentMap为resultMap元素中注册的id。resultMap里还有以下元素:
<resultMap>
<!--构造方法-->
<constructor >
<idArg column="id" javaType="_int"/>
<arg column="name" javaType="string"/>
</constructor >
<!--主键-->
<id />
<!--列名映射-->
<result />
<!--一对一-->
<association />
<!--一对多-->
<collection />
<!--鉴别器,类似于switch-->
<discriminator >
<case />
<discriminator >
</resultMap >
其实结果映射也可以使用map和创建POJO获取多个参数的结果集
SQL语句网上资料较多,可以使用if test,choose when otherwise,where,set,foreach等标签实现动态SQL。
获取Session
编写一个工具类获取session:
public class SqlSessionFactoryUtil {
private SqlSessionFactory factory;
public void init() throws IOException {
String resource = "database/mybatis/mybatis-config.xml";
// 配置文件输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过输入流构建SessionFactory
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
public SqlSession getSession() {
// 打开一个Session
return factory.openSession();
}
}