Mybatis
持久层框架,ORM框架,核心对象为sqlsession
核心对象的创建方式,抽取为工具类
package cn.itsource.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public enum MyBatisUtils {
INSTANCE;
private static SqlSessionFactory sqlSessionFactory;
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("MyBatis-Config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("配置文件解析异常"+e.getMessage());
}
}
//写方法
public SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
细节
得到主键的方式
在mapper里面配置三个属性
useGeneratedKey 设置这个使用生成键为true
keyColumn 数据库的列id
keyProperty 实体类的属性id
日志框架log4j
通过日志,把信息打印出来,方便查看错误
导包,写一个log4j.properties配置文件,然后测试就可以看信息了
# 日志输出级别 输出到控制
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=TRACE
# 输出到控制台的配置信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 输出到控制台的 格式类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
别名
内置别名和自定义别名
<!--配置别名-->
<!--直接将包下所有的类都设置了别名-->
<typeAliases>
<package name="cn.itsource.domain"></package>
<package name="cn.itsource.query"></package>
</typeAliases>
$和#的区别
$ 是拼接字符串的方式,类似于statement,sql注入危险
# 是占位符,类似于preparedStatement
平时用#比较多,排序和分页的时候使用$
批量操作
使用in,在mapper里面使用foreach
<!--批量删除-->
<delete id="deleteBatch" parameterType="list">
delete from t_user where id in
<!--
使用foreach遍历传入ids
collection指定输入对象中集合属性
item每次遍历生成的对象名
open开始遍历时要拼接的串
close开始遍历时要拼接的串
separator遍历的两个对象中间需要拼接的串
-->
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
高级查询(动态sql)
使用where和if标签 外部sql标签写一次可以多次引用
<!--
一般在sql中不会加入where,一般我们定义sql片段是为了可重用性,
是基于单表来定义sql片段,这样的话这个sql片段可重用性才高
-->
<sql id="test">
<if test="name!=null">
and name like #{name}
</if>
</sql>
<!--高级查询-->
<select id="queryAllByName" parameterType="userQuery" resultType="User">
select * from t_user
<where>
<include refid="test"></include>
</where>
</select>
ResultMap结果集映
嵌套结果和嵌套查询
<?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">
<!-- orm框架 sql的映射
namespace:命名空间 namespace路径+ id值
namespace怎么配置 包名.接口名 + queryAll
-->
<mapper namespace="cn.itsource.ssm.mapper.EmployeeMapper">
<!-- 查询所有
parameterType 参数类型 mybatis有内置的简写 比如long对应的是java.lang.Long
resultType 返回类型
-->
<!--嵌套结果-->
<!--<resultMap id="employeeMap" type="employee">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<association property="dept" javaType="dept">
<id property="id" column="dept_id"></id>
<result property="name" column="dept_name"></result>
</association>
</resultMap>
<select id="queryList" resultMap="employeeMap">
select e.id,e.name,e.age,d.id dept_id,d.name dept_name from t_employee e join t_dept d on e.dept_id = d.id
</select>-->
<!--嵌套查询-->
<resultMap id="employeeMap" type="employee">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="age" column="age"></result>
<association property="dept" column="dept_id" javaType="dept" select="selectById"></association>
</resultMap>
<select id="queryAll" resultMap="employeeMap">
select * from t_employee
</select>
<select id="selectById" parameterType="long" resultType="dept">
select * from t_dept where id = #{id}
</select>
</mapper>
缓存
一级缓存
sqlsession级别,1:1:1
mybatis自带一级缓存
二级缓存
sqlsessionfactory级别 1:0:1
在配置文件中设置cache标签即可使用二级缓存
序列化和反序列化
将对象转换成二进制形式,方便传输,保存到磁盘或者硬盘上,实现serializable接口就可以进行序列化
SSM集成
框架的集成第一步基本都是导包,此处省略
然后是配置文件,最后是测试
跟之前SSJ框架不一样的地方在于核心对象从entityManager成为了sqlSession,目录结构也发生了一些变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6NxxRlcn-1575460214458)(E:\ITSource\homework\JavaEE\1127MyBatis\doc\1.PNG)]
在资源文件夹中有一层专门放mapper.xml的地方
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!--扫描service层-->
<context:component-scan base-package="cn.itsource.ssm.service"></context:component-scan>
<!-- (1)jdbc.properties (2)dataSource (3)sqlSessionFactory (4)Tranactions-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--(2)dataSource连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!--(3)sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置DataSource-->
<property name="dataSource" ref="dataSource"/>
<!--配置mapper映射文件-->
<property name="mapperLocations" value="classpath:cn/itsource/ssm/mapper/*Mapper.xml"/>
<!--别名配置-->
<property name="typeAliasesPackage">
<value>
cn.itsource.ssm.domain
cn.itsource.ssm.query
</value>
</property>
</bean>
<!-- 处理mapper接口 spring会扫描包产生很多子类 注入到service层 一劳永逸-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.itsource.ssm.mapper"></property>
</bean>
<!--事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 开启注解支持-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
applicationContext-mvc.xml和web.xml不再赘述,与之前的SSJ集成基本一致。配置完毕后,mapper层相当于dao层,与数据库打交道。