Mybatis,动态代理方式的CRUD

1. 如何实现mapper.xml文件和接口中方法的映射关系

如图所示:一一对应,完全一致

namespace=接口的全类名

id=方法名

parameterType=参数类型,resultType=返回类型

 mapper.xml和接口放在同一个包里面,在mappers标签中定义一下:

也可以批量定义:

需要注意一点:使用package批量定义,UserDao要于UserMapper.xml文件同名,所以我这里要把UserDao接口名改写为UserMapper

 2. 别名

 使用package,会制动将该包中的所有类批量定义别名:别名就是类名(不带包名)

3. 类型处理器

  例如StringTypeHandler会自动把char类型转换为varchar类型

示例:实体类和数据库表的字段类型不同,进行转换

如上面约定:true为男=》数据库中为1,false=》数据库中为0

我们以Client类为例,实现增加数据和查看数据

3.1 自定义类型转换器(boolean->number)步骤【java类型=>jdbc数据库类型】

  1.  创建转换器:需要实现TypeHandler接口
  2. 实现TypeHandler接口太复杂,我们实现他的实现类BaseTypeHandler
  3. 第一个set方法,如图:
  4. 其他get方法,如图:
  5. 新建列sex,性别
  6.  自定义的BooleanToIntConverter类型转换类写好了。下面配置:

 

复制类名,在mybatis-config.xml文件中配置在typeHandlers标签中

    7. UserMapper.xml文件中使用

    8. 测试,如图,插入时sex的值为true,布尔类型,类型转换后在数据库显示是1

     9. 测试,数据库里t_sex是1,实体类Client的sex属性输出是true

   10. 再看一眼映射文件

 4. resultMap

如果 类中属性和表中的字段类型能够合理识别(String-varchar),则可以使用resultType,否则(boolean-number)使用resultMap

如果类中属性名和表中的字段名能够合理识别(stuNo-stuno)则可以使用resultType;否则(id-stuno)使用resultMap

 上诉情况,需要使用resultMap

 ClientDao层代码如下:方法名和ClientMapper.xml文件中标签的id一致

5. 实现代码:类型转换(t_clientt_sex是integer类型,Client的sex属性是Boolean类型)以及在查询返回结果封装时,属性名与字段名不一致

实现步骤:

1. 使用上面创建的表t_client、Client类和ClientMapper.xml文件

 注意对于sex字段,在mapper文件中,resultMap标签,以及insert标签中,都要加上javaType和jdbcType属性,如图所示

(jdbcType属性值:Interger要全部大写)

 

2. 如图:

 其中的typeHandler标签的handler属性值,是上诉类型转换器,代码如下

package com.lyx.mybatis.change;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

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

public class BooleanToIntConverter extends BaseTypeHandler<Boolean> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) throws SQLException {
        if (aBoolean) {
            preparedStatement.setInt(i, 1);
        } else {
            preparedStatement.setInt(i, 0);
        }
    }

    @Override
    public Boolean getNullableResult(ResultSet resultSet, String s) throws SQLException {
        int anInt = resultSet.getInt(s);
        return anInt == 1 ? true : false;
    }

    @Override
    public Boolean getNullableResult(ResultSet resultSet, int i) throws SQLException {
        int anInt = resultSet.getInt(i);
        return anInt == 1 ? true : false;
    }

    @Override
    public Boolean getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        int anInt = callableStatement.getInt(i);
        return anInt == 1 ? true : false;
    }
}

3. 测试

import com.lyx.mybatis.dao.ClientDao;
import com.lyx.mybatis.entity.Client;
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 class ClientTest {
    public static void main(String[] args) throws IOException {
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Client client = new Client("liuyuxin","123456",14,true);
        ClientDao mapper = sqlSession.getMapper(ClientDao.class);
        int i = mapper.insertClient(client);
        if(i!=0){
            System.out.println("增加成功!");
        }
        sqlSession.commit();
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素心如月桠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值