SSM里的mybatis

122 阅读4分钟

Mybatis架构

image.png

  1. mybatis 配置 mybatis-config.xml,此文件作为 mybatis 的全局配置文件,配置了 mybatis 的运行环境等信息。 mapper.xml 文件即 sql 映射文件,文件中配置了操作数据库的 sql 语句。此文件需要在 mybatis-config.xml 中加载。
  2. 通过 mybatis 环境等配置信息构造 SqlSessionFactory 即会话工厂
  3. 由会话工厂创建 sqlSession 即会话,操作数据库需要通过 sqlSession 进行。
  4. mybatis 底层自定义了 Executor 执行器接口操作数据库,Executor 接口有两个实现,一个 是基本执行器、一个是缓存执行器。
  5. Mapped Statement 也是 mybatis 一个底层封装对象,它包装了 mybatis 配置信息及 sql 映射信息等。mapper.xml 文件中一个 sql 对应一个 Mapped Statement 对象,sql 的 id 即 是 Mapped statement 的 id。
  6. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 前将输入的 java 对象映射至 sql 中,输入参数映射就 是 jdbc 编程中对 preparedStatement 设置参数。
  7. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor 通过 Mapped Statement 在执行 sql 后将输出结果映射至 java 对象中,输出结果映射过程 相当于 jdbc 编程中对结果的解析处理过程。

基本流程

通过maven搭建自己的项目

  • 1:引入mybatis依赖
  • 2:编写mybatis的主要配置文件(主要是environment节点)
  • 3:pojo对象
  • 4:编写mapper映射文件
  • 5:将mapper引入到主配置文件
  • 6:编写程序调用sql语句

演示

1:引入依赖

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
  </dependency>

  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.2.1</version>
    <scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>
</dependencies>

2:主配置文件

<?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>
    <!--配置db.properties-->
    <properties resource="db.properties"></properties>
    <!--配置别名-->
    <typeAliases>
        <!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)-->
        <package name="com.etime.pojo"/>
    </typeAliases>
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理-->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>

        <environment id="test">
            <!-- 使用jdbc事务管理-->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mappers/SysRoleMapper.xml"></mapper>
        <mapper resource="mappers/SysUserMapper.xml"></mapper>
    </mappers>

</configuration>

3:SysRole类

/**
 * @author 17268
 * 角色
 */
public class SysRole{
    private Integer roleid;
    private String rolename;
    private String roledesc;
    private Integer rolestate;

    public Integer getRoleid() {
        return roleid;
    }

    public void setRoleid(Integer roleid) {
        this.roleid = roleid;
    }

    public String getRolename() {
        return rolename;
    }

    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    public String getRoledesc() {
        return roledesc;
    }

    public void setRoledesc(String roledesc) {
        this.roledesc = roledesc;
    }

    public Integer getRolestate() {
        return rolestate;
    }

    public void setRolestate(Integer rolestate) {
        this.rolestate = rolestate;
    }

    @Override
    public String toString() {
        return "SysRole{" +
                "roleid=" + roleid +
                ", rolename='" + rolename + ''' +
                ", roledesc='" + roledesc + ''' +
                ", rolestate=" + rolestate +
                '}';
    }
}

4:SysRoleMapper.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="com.etime.dao.SysRoleMapper">

    <select id="selectSysRole" resultType="sysRole">
        select roleid,rolename,roledesc,rolestate from sysrole
    </select>

    <insert id="insertSysRole" parameterType="sysRole">
        insert into sysrole(rolename,roledesc,rolestate) values (#{rolename},#{roledesc},#{rolestate})
    </insert>

    <select id="selectSysRoleById" parameterType="int" resultType="sysRole">
        select roleid,rolename,roledesc,rolestate from sysrole where roleid=#{roleid}
    </select>

    <update id="updateSysRole" parameterType="sysRole">
        update sysrole set rolename=#{rolename},roledesc=#{roledesc},rolestate=#{rolestate}
        where roleid=#{roleid}
    </update>

    <select id="selectSysRoleByState" resultType="sysRole">
        select roleid,rolename from sysrole where rolestate=1
    </select>
</mapper>

5:SysRoleMapper

/**
 * @author 17268
 * 角色dao层mybatis实现
 */
public interface SysRoleMapper {
    /**
     * 查询所有角色
     * @return
     */
    List<SysRole> selectSysRole();

    /**
     * 增加角色
     * @return
     */
    int insertSysRole(SysRole sysRole);

    /**
     * 根据id查询一个角色
     * @param id
     * @return
     */
    SysRole selectSysRoleById(int id);

    /**
     * 根据id修改角色
     * @param sysRole
     * @return
     */
    int updateSysRole(SysRole sysRole);

    /**
     * 根据状态为1查询角色名
     * @return
     */
    List<SysRole> selectSysRoleByState();
}

注意

  • 1:mapper.xml文件中的namespace与mapper接口的类路径相同
  • 2:mapper.xml中的每个statement的id与mapper接口的方法名相同
  • 3:mapper.xml中的每个statement的parameterType与mapper接口的传入参数相同
  • 4:mapper.xml中的每个statement的resultType与mapper接口的返回类型相同
  • 5:在mapper.xml中sql使用#,相当于占位符有效防止sql注入。在不能传递sql参数的时候使用,相当于字符串拼接,如:orderby,相当于字符串拼接,如:order by {value}
  • 6:在传入多个参数将多个参数封装到一个map中;或者在mapper接口中使用@param注解
  • 7:只有select操作才需要指定resultType,其它的有默认值

6:使用单例模式创建SqlSessionFactory对象

/**
 * @author 17268
 * 单例创建sqlsessionfactory实例
 */
public class CreateSqlSessionFactory {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        String config = "mybatis-config.xml";
        try {
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(config));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取sqlsessionfactory
     * @return
     */
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
}

7:其它的和上阶段的jsp和servlet差不多,但是要在jsp中的page标签加入isELIgnored="false"才能使用表达式

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

8:效果

image.png

9:其它

9-1:动态mysql标签

  • <where>:拼接mysql中的where
  • <if>:判断是否有此条件
  • <foreach>:迭代操作,主要运用在in
  • collection 迭代对象 item迭代的每个对象 open以什么开头 close以什么结尾 separator 分隔符
  • <trim>

9-2:resultMap

可以将数据库查询出来的结果的列名和java实体类中的属性名不一样也能映射过去,如在执行sql时使用了as取了别名。

关联查询

在一对一关系中使用association标签 在一对多关系中使用collection标签 在多对多关系中使用嵌套collection标签

9-3:缓存机制

sqlsession执行insert,update,delete等操作commit提交后会清空缓存区域,缓存机制比较粗糙,所以在开发过程中不会使用