Mybatis

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层,与数据库打交道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值