生命周期、作用域
SqlSessionFactoryBuilder:只是用来创建SqlSessionFactory,创建完毕后就不需要了
SqlSessionFactory:可以理解为数据库连接池,完整贯穿整个应用运行期间,不可丢弃创建
SqlSession:相当于数据库连接请求,每次需要操作数据库就用一次,用完马上关闭,相当于释放,避免并发问题
而SqlSession每一次连接Mapper,都在处理一个业务
ResultMap结果集映射
专门用于解决数据库字段和属性名不一致的问题。
解决方法一:可以在SQL中直接用别名
解决方法二:在Mapper.xml文件中,直接不用resultType,而使用resultMap
<resultMap id="UserMap" type="User">
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
日志工厂
如果一个数据库操作出现异常,需要排错
问题:怎么打印SQL?
在Settings中可以进行设置,主要有STDOUT_LOGGING标准输出,可以不用配直接使用
另外一个就是LOG4J
<!-- 记住一定要放在properties和typeAliases标签中间,有先后顺序设定的 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
这个是标准的日志工厂实现
Log4j讲解
上面那个是标准工厂实现,但是Log4j需要导包等步骤
建立log4j.properties文件,然后填入内容
测试类中:
导包:
import org.apache.log4j.Logger;
根据不同的情况,使用其日志打印信息:
public static Logger logger = Logger.getLogger(UserMapper01.class);
@Test
public void test(){
//通过工具类获得sqlsession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> Userlist = userMapper.getUserList();
logger.info(Userlist);
logger.debug(Userlist);
logger.error(Userlist);
for (User user : Userlist) {
System.out.println(user);
}
//关闭sqlsession
sqlSession.close();
}
Limit分页
分页主要是减少数据的处理量
select * from user limit 0,5;
//接口中:
List<User> getUserByLimit(Map<String,Integer> map);
//Mapper.xml中:
<resultMap id="UserMap" type="User">
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
//测试方法:
public void getUserBylimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("startIndex",0);
map.put("pageSize",2);
System.out.println(map);
List<User> list = userMapper.getUserByLimit(map);
for(User user : list){
System.out.println(user);
}
sqlSession.close();
}
尤其注重Mapper.xml中的标签名参数:
一)、parameterType代表了参数的类型。它是通过HashMap的形式传入了两个键值对,代表limit方法的下标
二)、resultMap代表返回结果的映射,因为返回结果的类型名和数据库不一样,所以用了ResultMap来映射,UserMap是在UserMapper中配置的ID,注意看
RowBounds分页
是面向对象思想做的,基本不会使用,已淘汰
直接创建RowBounds类,使用方法来进行实现,可以直接点进方法看使用方法
分页插件
Mybatis PageHelper
使用注解执行整个查询过程
@select(“select * from user”)
这里底层主要是使用反射的机制来读取接口的方法、参数、执行体等等,这样就做完了全部功能
但是使用注解,对于参数、返回值等操作就很会很麻烦,复杂的SQL语句还是要用XML配置文件来使用
记得一定要在核心配置文件中进行配置
<mappers>
<mapper resource="com/wang/Dao/UserMapper.xml"/>
</mappers>
<mappers>
<mapper class="com.wang.Dao.UserMapper"/>
</mappers>
静态代理/动态代理