目录:
配置之属性优化
1,环境配置environments
2,属性(properties)
3,typeAliases优化
4,设置
5,映射器(Mapper)
ResultMap结果集映射
分页的几种方式
1,日志工厂,
2,Log4j讲解
3,Limit实现分页
Mybatis执行流程剖析
配置之属性优化
xml配置文件,见官方文档
configuration(配置)
properties(属性)*
settings(设置)*
typeAliases(类型别名)*
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)*
environment(环境变量)*
transactionManager(事务管理器)*
dataSource(数据源)*
databaseIdProvider(数据库厂商标识)
mappers(映射器)*
1,环境配置environments
Mybatis可以配置成适应多种环境,但每个SqlSessionFactory实例只能选择一种环境。default改变就可以
学会使用配置多套运行环境
Mybatis默认的事务管理器是JDBC
连接池是POOLED,
2,属性(properties)
我们可以通过properties属性来实现引用配置文件
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
编写一个配置文件
db.properties
driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mybatistest?useSSL=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8"
username="root"
password="root"
在核心配置文件中引入
<configuration>
<!--导入properties文件-->
<properties resource="db.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
3,typeAliases优化
类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。
<!--配置别名,注意顺序-->
<typeAliases>
<typeAlias type="com.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,他会取这个默认别名班委这个类的类名,首字母小写比如:
<typeAliases>
<package name="com.pojo"/>
</typeAliases>
4,设置
设置(settings)相关 => 查看帮助文档
懒加载
日志实现
缓存开启关闭
5,映射器(Mapper)
MapperRefistry:注册绑定Mapper文件:
方式一:
<!--每一个Mapper.xml都要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="dao/UserMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<!--每一个Mapper.xml都要在Mybatis核心配置文件中注册-->
<mappers>
<mapper class="dao.UserMapper"/>
</mappers>
注意点:
接口和他的Mapper配置文件必须同名
接口和他的Mapper配置文件必须 同一个包下面
方式三:
<mappers>
<package name="dao"/>
</mappers>
注意点和class一样。
ResultMap结果集映射
要解决的问题:属性名和字段名不一致
环境:新建一个项目,将之前的项目拷贝过来
public class User {
private int id; //id
private String name; //姓名
private String password; //密码和数据库不一样!
//构造
//set/get
//toString()
}
方案一:为列名指定别名 , 别名和java实体类的属性名一致
<select id="selectUserById" resultType="User">
select id , name , pwd as password from user where id = #{id}
</select>
方案二:使用结果集映射->ResultMap 【推荐】
<resultMap id="UserMap" type="pojo.User">
<!--column数据库中的字段,poperty实体类中的属性-->
<result column="pwd" property="password"/>
<result column="id" property="id"/>
<result column="name" property="name"/>
</resultMap>
<select id="getUserID" resultMap="UserMap">
select * from user where id=#{id}
</select>
分页的几种方式
日志工厂
如果一个数据库操作,出现了异常,我们需要排除错误,日志就是最好的助手
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具(setting中):
SLF4J
Apache Commons Logging
Log4j 2
Log4j 【掌握】
JDK logging
STDOUT_LOGGING 【掌握】
NO_LOGGING
在Mybatis中具体使用哪一个日志实现,在设置中设定
STDOUT_LOGGING 标准日志,直接用
核心配置文件中添加:
(生怕读者不知道核心配置文件顺序,人家是有顺序的!!!)
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
用其他的在value中改变值:
Log4j日志讲解:
简介:
- Log4j是Apache的一个开源项目
- 通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件…
- 我们也可以控制每一条日志的输出格式;
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
- 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
使用步骤:
1、导入log4j的包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2,配置文件编写log4j.properties,网络上都是大同小异,这些就够用了
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
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/qinqin .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
3,peizhi wei log4j为日志实现
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
4,直接测试运行,测试类test运行
简单实用:
1,在要实用日志的类中Log4j的类中,导入包
import org.apache.log4j.Logger;
不要导错了。
2在要输出日志的类中加入相关的语句
定义属性:
static Logger logger = Logger.getLogger(UserDaoTest.class);//UserDaoTest为相关的类
3,日志对象,参数为当前类的class
代码:
@Test
public void log4jtest(){
logger.info("info:进入了testlof4j");
logger.debug("debaug进入了");
logger.error("error进入了");
}
@Test
public void getUserID(){
SqlSession session = MybatisUtils.getSession();
logger.info("测试进入getUserID方法成功");
UserMapper mapper = session.getMapper(UserMapper.class);
User userID = mapper.getUserID(2);
System.out.println(userID);
}
Limit实现分页
减少数据的处理量
#语法
SELECT * FROM table LIMIT stratIndex,pageSize
SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
#如果只给定一个参数,它表示返回最大的记录行数目:
SELECT * FROM table LIMIT 5; //检索前 5 个记录行
#换句话说,LIMIT n 等价于 LIMIT 0,n。
步骤:
1,Mapper接口,参数为map
//分页
List getUserLimit(Map<String,Integer> map);
2,修改Mapper文件,resultMap 可以不要,看了上面就知道是什么
<resultMap id="UserMap" type="pojo.User">
<!--column数据库中的字段,poperty实体类中的属性-->
<result column="pwd" property="password"/>
<result column="id" property="id"/>
<result column="name" property="name"/>
</resultMap>
<!--分页-->
<select id="getUserLimit" resultMap="UserMap" parameterType="map">
select *from user limit #{startIndex},#{pageSize}
</select>
3,在测试类中传入参数测试
推断:起始位置 = (当前页面 - 1 ) * 页面大小
@Test
public void getUserLimit(){
SqlSession session = MybatisUtils.getSession();
UserMapper mapper = session.getMapper(UserMapper.class);
HashMap<String, Integer> stringIntegerHashMap = new HashMap<String, Integer>();
stringIntegerHashMap.put("startIndex",0);
stringIntegerHashMap.put("pageSize",2);
List<User> userLimit = mapper.getUserLimit(stringIntegerHashMap);
for (User user : userLimit) {
System.out.println(user);
}
}