Mybatis,动态代理方式的CRUD
1. 如何实现mapper.xml文件和接口中方法的映射关系
如图所示:一一对应,完全一致
namespace=接口的全类名
id=方法名
parameterType=参数类型,resultType=返回类型
mapper.xml和接口放在同一个包里面:
2. 别名
使用package,会制动将该包中的所有类批量定义别名:别名就是类名(不带包名)
3. 类型处理器
例如StringTypeHandler会自动把char类型转换为varchar类型
示例:实体类和数据库表的字段类型不同,进行转换
如上面约定:true为男=》数据库中为1,false=》数据库中为0
3.1 自定义类型转换器(boolean->number)步骤【java类型=>jdbc数据库类型】
- 创建转换器:需要实现TypeHandler接口
- 实现TypeHandler接口太复杂,我们实现他的实现类BaseTypeHandler
- 第一个set方法,如图:
- 其他get方法,如图:
- 新建列sex,性别
- 配置:
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();
}
}