[数据库 06] Mybatis 配置优化 字段名不对应 日志 分页
Mybais 优化使用
1. 配置优化
mybatis-config.xml文件配置标签:
- properties 属性
- settings 设置
- typeAliases 类型别名
- environments 环境配置
- mappers 映射器
配置xml文件中,configure的顺序:
"configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"的顺序
1. environments 环境变量
默认事务管理器JDBC,默认数据源是 pooled
结构:
<environments default="">//用于切换默认的环境,选择id值
<environment id="">//一般有两套,一套开发,一套测试
<transactionManager type="JDBC|MANAGED"></transactionManager></transactionManager>
//事务管理器有两种类型, JDBC和managed
<dataSource type="UNPOOLED|POOLED|JNDI"> //用于选择数据源,连接池(DBCP, C3P0, Druid, Hikari(Spring默认)
// 默认时pooled,连接之后回收,可以多个连接
<property></property>
<property></property>
</dataSource>
</environment>
</environments>
2. 属性(properties):
- 可以用过
db.properties
文件来动态配置,降低配置文件的耦合性,方便维护。
drive=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=123456
- xml配置中引入外部配置文件:
<properties resource="db.properties"></properties>
properties中可以继续定义name,value键值对,但优先走外部配置文件中的键值对。
3. typeAliases 类型别名
用来减少完全限定名(全路径名)的冗余设置,如返回值resultType参数后的类型不用写全部包名.实体类名。
有两种方式:
- 在typeAlias标签中定义 别名:类型
<typeAliases>
<typeAlias alias="user" type="com.roy.pojo.User"/>
</typeAliases>
- 指定pachage标签,在标签中写入实体类的包名,则可以直接使用
<typeAliases>
<package name="com.roy.pojo"/> // 只指定到实体类的包名
</typeAliases>
在实体类比较少,使用第一种:属性alias中直接指定别名
实体类比较多,使用第二种:使用注解,在实体类添加 @Alias("another_name")
,则可以在UserMapper.xml中使用返回值对象为resultType = another_name
4. settings 设置
暂时不用
5. mappers 映射器 映射方法
-
使用完全限定名加载UserMapper.xml文件
<mappers> <mapper resource="com/roy/dao/UserMapper.xml"/> </mappers>
-
使用class文件去加载(加载的是接口)
两个问题:接口和Mapper.xml必须同名, 以及两个文件必须在同一个包下
<mappers> <mapper class="com.roy.dao.UserMapper"/> </mappers>
-
使用package将接口都注册为映射器,条件同上2点。
<mappers> <package name="com.roy.dao"/> </mappers>
6. 生命周期和作用域
-
mybatis的流程:
SqlSessionFactoryBuilder: 一旦创建出SqlSessionFactory, 就不需要了,局部变量
SqlSessionFactory: 相当于连接池,一旦被创建,就一直存在于运行期间,最好使用单例模式
SqlSession: 连接池的一个连接,不是线程安全的,用完之后需要尽快关闭
-
SqlSessionFactory和SqlSession 的关系:
SqlSessionFactory 相当于web中的ServletContext, 每一个SqlSession相当于一个个Servlet, Mapper则执行每一个业务
2. 解决属性名和字段名不一致问题
1. 原始方法:
修改sql语句,修改为select 字段名 as 属性名
2. 结果集映射
在UserMapper.xml文件中添加结果映射:
<resultMap id="UserMap" type="User"> // id为返回结果map标签所定义的
<result column="数据库中的字段" property="实体类中的属性"/>
<result column="" property=""/>
<result column="" property=""/>
</resultMap>
<select id="getUserList" resultMap="UserMap"> // 修改返回标签为resultMap,定义一个名称
select * from mybatis.user
</select>
3. 日志
1. 日志工厂
之前用sout和debug
Setting标签中,使用logImpl标签
2. STDOUT_LOGGING 标准日志输出
在setting中添加
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
3. Log4j 日志
不是标准的包,需要导入。
- 可以控制日志信息输送的目的地,
- 可以控制输出格式,
- 可以定义日志信息的级别,
- 可以使用配置文件灵活配置,不需要修改应用代码。
-
导入maven依赖,选2012May版本 1. 2
-
resources文件夹下添加log4j.properties文件,配置日志输出设置
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.olog4j.appender.console.Threshold=DEBUG log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/roy.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
-
mybatis-config.xml 文件中的setting标签中设置日志类型
<settings> <setting name="logImpl" value="LOG4J"/> </settings>
4. 简单使用
在要输出日志的类中定义属性:(导入的包一定是import org.apache.log4j.Logger;
)
static Logger logger = Logger.getLogger(UserMapperTest.class);
在@Test的方法中输出日志:可以设置不同的等级。
logger.info("info进入");
logger.debug("debug入");
logger.error("error进入");
4. 分页实现
1. Limit
sql中:
select *from User
limit 0,2
UserMapper.java接口:
List<User> getUserByLimit(Map<String, Integer> map);
UserMapper.xml接口实现类:
<select id="getUserByLimit" parameterType="map" resultType="com.roy.pojo.User">
select * from mybatis.user limit #{startIndex}, #{pageSize}
</select>
测试:
@Test
public void testGetUserByLimit(){
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", 3);
List<User> userList = userMapper.getUserByLimit(map);
for(User user: userList){
System.out.println(user);
}
sqlSession.close();
}
2. RowBounds(了解)
3. PageHelper插件
自己下载导入maven配置,导入plugin配置