我们学习Mybatis时学过三种方式来实现MyBatis操作数据库
一、配置mapper.xml文件然后使用专有的API
<?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">
<select id="selectAll" parameterType="map" resultType="com.mybatis.vo.User">
select *from user where username like '%${username}%';
<!--
name like"%"#{name}"%"
name like '%${name}%'
name likeconcat(concat('%',#{username}),'%')
name like CONCAT('%','${name}','%')
name like '%'||#{name}||'%'
-->
</select>
</mapper>
@org.junit.Test
public void testFindall() throws IOException {
//1.获取sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();
//2.获取sqlSession对象
SqlSession openSession=sqlSessionFactory.openSession();
Map<String,String> map=new HashMap<>();
map.put("username", "三");
try {
List<User> list=openSession.selectList("com.mybatis.dao.UserMapper.selectAll",map);
for(User user:list) {
System.out.println(user.getUsername());
}
}finally {
openSession.close();
}
}
然后你会想为什么会这么写 底层是如何实现的
public <E> List<E> selectList(String statement) {
return this.selectList(statement, null);
}
@Override
public <E> List<E> selectList(String statement, Object parameter) {
return this.selectList(statement, parameter, RowBounds.DEFAULT);
}
@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
MappedStatement ms = configuration.getMappedStatement(statement);//通过statement在Configuration中查找到对应的MapperStatement
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);//将任务委托给Execute执行器
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);
} finally {
Erro