mybatis编程学习


相关配置信息

select 语句传递参数的方式

 <select id="queryUserById" resultType="User">
        select * from user where id=#{arg0}
    </select>

以下所写的内容实在#{}里写的值,如上

  1. arg0 、arg1从0开始代表以一个参数

  2. param1,param2从1开始代表第一个参数

  3. 在定义Dao接口方法的时候,将参数带上注解

    方法名(@Param(" 对应的值") 参数名);‘

  4. 通过Map设定好值传过去,前提是在map里设定好key和value的值,传过来直接抽取就可以了。

  5. 在Dao接口的方法中直接传入实体类也可以。语句中直接调用实例属性就可以
    可用concat来做模糊查询,concat是字符串拼接

增删改

在增删改的过程中需要提交事物,提交的方法为

sqlSession.commit();

主键回填

可在insert标签中添加,他会将参数中的属性名赋值,针对的是自增的主键

<selectKey order="AFTER" resultType="int" keyProperty="id">
select last_insert_id()
<!-- select replace(UUID(),"-","")  这里面after变成before
</selectKey>

Mybatis工具类

package com.lang.utils;

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.InputStream;

public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory;
    private static final ThreadLocal<SqlSession> t1=new ThreadLocal<SqlSession>();
    static {/*加载配置信息*/
        try {
            InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
            sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession openSession(){
       SqlSession sqlSession= t1.get();
       if(sqlSession==null){
           sqlSession=sqlSessionFactory.openSession();
           t1.set(sqlSession);
       }
        return sqlSession;
    }
    public static void commit(){
        SqlSession sqlSession =openSession();
        sqlSession.commit();
        closeSession();
    }
    public static void rollback(){
        SqlSession sqlSession=openSession();
        sqlSession.rollback();
        closeSession();
    }
    public static void closeSession(){
        SqlSession sqlSession=openSession();
        sqlSession.close();
    }
    public static <T> T getMapper(Class<T> mapper){
        SqlSession sqlSession=openSession();
        return sqlSession.getMapper(mapper);
    }
}

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">
<!--namespace写要配置的Dao接口-->
<mapper namespace="com.lang.dao.UserDao">
    <resultMap id="user_resultMap" type="User">
        <!--定义更复杂的映射规则-->
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="password" property="password"></result>
        <result column="gender" property="gender"></result>
    </resultMap>
    <!--描述方法-->
    <select id="queryUserById" resultMap="user_resultMap"> <!-- resultMap-->
        select * from user where id=#{arg0}
    </select>
</mapper>

映射对一

利用标签完成对应的一对多关系

 	 	<association property="entity的实例属性名" javaType="entity的实例属性的类型">
            <id column="列名" property="对应关系的属性名"></id>
            <result column="列名" property="对应关系的属性名" ></result>
        </association>

映射对多

<collection>标签完成
		<collection property="entity的实例属性名" ofType="entity的实例属性的泛型"><!--ofType用来对应泛型的类型-->
            <id column="列名" property="对应关系的属性名"></id>
            <result column="列名" property="对应关系的属性名" ></result>
        </collection>

多对多

一般数据库中要有额外的第三张表,分别是两个关系的主键

mybatis标签

这里面写重复的语句 抽取重复的sql片段

   <sql id="idname">
        select * from user
    </sql>

    <!--描述方法-->
    <select id="queryUserById" resultType="User">
     <include refid="idname"/> where id=#{arg0}
    </select>

标签

    <select id="queryUserById" resultType="User">
     <include refid="idname"/> where
        <if test="id!=null" >id=#{arg0}</if>
        <if test="username!=null"> username=#{username}</if>
    </select>

标签

这个标签可以自动消除紧跟着的字段是or或者and,自动补充where关键字

标签

这个标签会自动把要修改的属性之后存在的逗号删除例如
update user set username=#{ username} , where id=#{id }
多出了一个逗号,所以用set标签可以消除多余的逗号

标签

         /*prefixOverrides="or|and 以or或and开头就替换掉   suffixOverrides=","替换末尾的逗号*/
 <trim prefix="要补充的前缀标签" suffix="要补充的后缀标签" prefixOverrides="or|and" suffixOverrides=","></trim>

forEach标签

 <delete id="deleteUser" parameterType="java.util.List">
        delete from user where id in
        <foreach collection="参数名" open ="(" close=")" item="id" separator=",">/*open代表要生成语句的开头,close就是结尾, item就是一个每次遍历后获得值存入item中 ,separator代表多次遍历的分割 *//* 最后还有index 它是从0开始,一次递增*/
            #{id}
        </foreach>
    </delete>

缓存

首次访问时,查询数据库,将数据存储到缓存中,再次访问时,直接访问缓存,减少IO、硬盘读写次数,提高效率

一级缓存

SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在以及缓存中

二级缓存

SqlSessionFactory级别的缓存,同一个SqlSessionFactory构建的SqlSession发起的多次同构查询,会将数据保存在二级缓存中。

开启二级缓存

  <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

并在相应的mapper文件中加入 标签,否则不会开启二级缓存,二级缓存默认开启,但并不是所有的查询结果都会进入二级缓存的,如果发生增删改会将缓存消除,消除的时同一个Mapper的缓存

Druid

相关配置信息

package com.lang.datasource;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;

public class MyDruidDataSourceFactory extends PooledDataSourceFactory {
   public MyDruidDataSourceFactory(){
       this.dataSource=new DruidDataSource();
   }
}

运用Druid的连接池配置 mybatis-config.xml

<?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>
    <!--导入外部的参数-->
    <properties resource="jdbc.properties">
    </properties>
    <!--mybaits-config.xml中开启全局缓存(默认开启)-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <!--别名-->
    <typeAliases>
      <!--  <typeAlias type="com.lang.entity.User" alias="user"></typeAlias>-->
        <package name="com.lang.entity"/>
    </typeAliases>
    <!--核心配置信息-->
    <environments default="mybatis_config">
        <!--数据库相关配置-->
        <environment id="mybatis_config">
            <!--事物控制类型-->
            <transactionManager type="jdbc"></transactionManager>
            <!--数据库连接参数-->
            <dataSource type="com.lang.datasource.MyDruidDataSourceFactory">
                <property name="driverClass" value="${jdbc.driver}"/>
                <!--& 转译成&amp-->
                <property name="jdbcUrl" value="${jdbc.url}"/><!--通过${}来取配置文件的值-->
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/lang/dao/UserDaoMapper.xml"/>
    </mappers>
</configuration>

分页PageHelper

相关配置信息

    public void testPage(){
        UserDao userDao= MybatisUtil.getMapper(UserDao.class);
        PageHelper.startPage(2,2);/*查询第一页每一页两条数据 ,对其之后的第一个数据,进行分页追加*/
        List<User>  users= userDao.queryUserAll();
        for (User user:users){
            System.out.println(user);
        }
    }

PageHelper使用

page实体类

package com.lang.entity;

public class Page {
    private Integer pageNum;
    private Integer pageSize;

    @Override
    public String toString() {
        return "Page{" +
                "pageNum=" + pageNum +
                ", pageSize=" + pageSize +
                '}';
    }

    public Integer getPageNum() {
        return pageNum;
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
}

UserService

public class UserServiceImpl implements UserService {
    @Override
    public PageInfo<User> quertUser(Page page) {
        UserDao userDao= MybatisUtil.getMapper(UserDao.class);
        PageHelper.startPage(1,2);
        List<User> userList=userDao.queryUserAll();
        PageInfo <User> pageInfo=new PageInfo<>(userList);
        return pageInfo;
    }
}

分页前端代码模板

 <div style="text-align: center">
        <a href="${pageContext.request.contextPath}/users?pageNum=1&pageSize=2">首页</a>
        <c:if test="${requestScope.pageData.hasPreviousPage}">
            <a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.prePage}&pageSize=2">上一页</a>
        </c:if>

        <c:forEach begin="1" end="${requestScope.pageData.pages}" var="i">
            <a href="${pageContext.request.contextPath}/users?pageNum=${i}&pageSize=2">
                <c:if test="${requestScope.pageData.pageNum==i}">
                    <span style="color:red">${i}</span>
                </c:if>
                <c:if test="${requestScope.pageData.pageNum!=i}">
                    <span>${i}</span>
                </c:if>
            </a>
        </c:forEach>
        <c:if test="${requestScope.pageData.hasNextPage}">
            <a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.nextPage}&pageSize=2">下一页</a>
        </c:if>
        <a href="${pageContext.request.contextPath}/users?pageNum=${requestScope.pageData.pages}&pageSize=2">末页</a>
    </div>

延迟加载

<?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>
    <!--导入外部的参数-->
    <properties resource="jdbc.properties">
    </properties>
    <!--mybaits-config.xml中开启全局缓存(默认开启)-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnable" value="true"/><!--延迟加载-->
    </settings>
    <!--别名-->
    <typeAliases>
      <!--  <typeAlias type="com.lang.entity.User" alias="user"></typeAlias>-->
        <package name="com.lang.entity"/>
    </typeAliases>
    <!--pageHelper引入-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>
    <!--核心配置信息-->
    <environments default="mybatis_config">
        <!--数据库相关配置-->
        <environment id="mybatis_config">
            <!--事物控制类型-->
            <transactionManager type="jdbc"></transactionManager>
            <!--数据库连接参数-->
            <dataSource type="com.lang.datasource.MyDruidDataSourceFactory">
                <property name="driverClass" value="${jdbc.driver}"/>
                <!--& 转译成&amp-->
                <property name="jdbcUrl" value="${jdbc.url}"/><!--通过${}来取配置文件的值-->
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/lang/dao/UserDaoMapper.xml"/>
    </mappers>
</configuration>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值