week17_day03_Mybatis05

昨天内容需要注意的点:执行增删改操作并提交sqlSession时,二级缓存失效。


typehandler 类型转换器.
week17_day03_Mybatis05_第1张图片
week17_day03_Mybatis05_第2张图片


  1. jackson提供的api
    a. 字符串转javabean
    week17_day03_Mybatis05_第3张图片
    b. javabean转换为字符串
    week17_day03_Mybatis05_第4张图片

  1. typehandler使用
    a. 注册typehandler
    week17_day03_Mybatis05_第5张图片
    b. 自定义typehandler
    类上加两个注解:
    在这里插入图片描述
    输入映射对应的方法:
    week17_day03_Mybatis05_第6张图片
    输出映射对应的方法:
    week17_day03_Mybatis05_第7张图片
    自定义typehandler的完整代码:
package com.cskaoyan.typehandler;
import com.cskaoyan.bean.UserDetail;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.apache.ibatis.type.*;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes(UserDetail.class)//查询结果对应的类型 → UserDetail
@MappedJdbcTypes(JdbcType.VARCHAR) //在数据库中对应的类型 → varchar
//public class UserDetailTypehandler implements TypeHandler{
     
public class UserDetailTypehandler extends BaseTypeHandler<UserDetail>{
     

    ObjectMapper objectMapper = new ObjectMapper();
    //输入映射的过程 UserDetail → String
    @SneakyThrows
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int index, UserDetail userDetail,
                                    JdbcType jdbcType) throws SQLException {
     
        //获得字符串形式的userDetail信息。
        String value = objectMapper.writeValueAsString(userDetail);
        //preparedStatement设置预编译参数给到value
        preparedStatement.setString(index,value);
    }

    //输出映射过程  String → UserDetail
        //首先要拿到查询结果:
            //String value = resultSet.getString(columnLabel); 通过列名拿到
            //String value = resultSet.getString(index);
            //String value = callableStatement.getString(index);
            //→ 接着写转换逻辑
    @Override
    public UserDetail getNullableResult(ResultSet resultSet, String columnLabel) throws SQLException {
     
        String value = resultSet.getString(columnLabel);
        return transfer(value);
    }

    @Override
    public UserDetail getNullableResult(ResultSet resultSet, int index) throws SQLException {
     
        //拿到value,给第index个参数进行赋值
        String value = resultSet.getString(index);
        return transfer(value);
    }

    @Override
    public UserDetail getNullableResult(CallableStatement callableStatement, int index) throws SQLException {
     
        String value = callableStatement.getString(index);
        return transfer(value);
    }
    private UserDetail transfer(String value){
     
        if (value != null && !"".equals(value)){
     
            UserDetail userDetail = null;
            try {
     
                userDetail = objectMapper.readValue(value, UserDetail.class);
            } catch (JsonProcessingException e) {
     
                e.printStackTrace();
            }
            return userDetail;
        }
        return null;
    }
}


给第一个参数设置userDetail转换成json字符串的值。

测试类:

package com.cskaoyan;

import com.cskaoyan.bean.User;
import com.cskaoyan.bean.UserDetail;
import com.cskaoyan.mapper.UserMapper;
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 org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.IOException;

public class MyTest {
     
    static SqlSessionFactory sqlSessionFactory;
    SqlSession sqlSession;
    UserMapper userMapper;
    Logger logger = Logger.getLogger(this.getClass());
    @BeforeClass
    public static void initFactory() throws IOException {
     
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
    }
    @Before
    public void init(){
     
        sqlSession = sqlSessionFactory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
    }
    @After
    public void commit(){
     
        if (sqlSession != null){
     
            sqlSession.commit();
            sqlSession.close();
        }
    }
    @Test
    public void mytest1(){
     
        User user = userMapper.selectUserById(1);
        System.out.println(user);
    }

    @Test
    public void mytest2(){
     
        UserDetail userDetail = new UserDetail();
        userDetail.setId(2);
        userDetail.setPhone("120");
        userDetail.setEmail("[email protected]");

        int update = userMapper.updateUserDetailById(2, userDetail);
    }

}

debug一下test1:
week17_day03_Mybatis05_第8张图片
week17_day03_Mybatis05_第9张图片
debug一下test2:
week17_day03_Mybatis05_第10张图片
week17_day03_Mybatis05_第11张图片
给第一个参数设置userDetail转换成json字符串的值。


ssm整合
Spring SpringMVC Mybatis

在Spring的环境下注册组件:

SqlSessionFactory
MapperScannerConfigurer

mapper接口对应的对象 通过Spring管理起来


generator工具
生成数据库表 对应的
1、javabean
2、接口
3、映射文件

  1. 导包
    week17_day03_Mybatis05_第12张图片

  2. main方法
    不需要自己写 → 复制进来
    复制进课件中的Generator.java和generatorConfig.xml。
    week17_day03_Mybatis05_第13张图片Application就是启动main方法的,我们在这配置main方法。
    week17_day03_Mybatis05_第14张图片

  3. 配置文件
    week17_day03_Mybatis05_第15张图片
    配置生成数据库表 对应的
    1、javabean
    2、接口
    3、映射文件

    week17_day03_Mybatis05_第16张图片
    week17_day03_Mybatis05_第17张图片


  1. example
    实际上就是一个辅助类,要做的事就是帮我们构造一个where条件,数据库表中的任意条件都可以帮我们构造。
    在这里插入图片描述
    对应include标签:
    week17_day03_Mybatis05_第18张图片

  2. Selective
    if标签
    week17_day03_Mybatis05_第19张图片

  3. byPrimaryKey
    主键
    week17_day03_Mybatis05_第20张图片


  1. 如何使用example
    week17_day03_Mybatis05_第21张图片

  1. 注意事项
    1、不要已有的项目上使用逆向工程,单独创建一个项目使用 → 会覆盖文件
    2、javabean、接口、映射文件文件的package配置和你已有的项目的包目录
    3、逆向工程生成过文件,现在要重新生成时,就先删除掉已有的文件。如果不删除的话1映射文件中会存在相同id的表,因为做的是增量更新。

作业: 在springmvc阶段我们使用interceptor做的登录案例使用JavaConfig重构,并且整合mybatis
1、service层调用mapper层的方法,controller层调用service层组件的方法
2、登录使用mapper接口中的方法查询数据库中user表的用户名和密码进行匹配

你可能感兴趣的:(Spring)