个人笔记Mybatis2
4.配置解析
4.1核心配置文件
mybatis-config.xml
MyBatis配置包含对MyBatis行为方式有显著影响的设置和属性
在 MyBatis 中有两种类型的事务管理器 (也就是 type="[JDBC|MANAGED]”
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器)
4.2environments(环境配置)
Mybatis可以配置成适应多种环境
虽然可以配置多个环境,但每个SqlSessionFactory实例只能选择一个环境。
Mybatis默认的事务管理器就是JDBC,连接池:POOLED
4.3 configuration(配置)
我们可以通过properties属性来实现引用配置文件
这些是可外化的、可替换的属性,可以在典型的Java属性文件实例中配置,也可以通过properties元素的子元素传入(db.properties)
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF8 username=root password=123456
官网:引入外部配置文件,这里面的优先级没有外部配置文件高(db.properties)
<properties resource="org/mybatis/example/config.properties"><property name="username" value="dev_user"/><property name="password" value="F2Fa3!33TYyg"/>这里面的优先级没有外部配置文件高(db.properties) </properties>
<!--引入外部配置文件--> <properties resource="db.properties"><property name="username" value="root"/><property name="pwd" value="11111"/> </properties>
可以直接引入外部文件
可以在其中增加一些属性配置
如果两个文件有同一个字段,优先使用外部配置文件的
实际应用1.加入了<properties resource="db.properties"/>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!--<!– 引入外部配置文件–>--> <!-- <properties resource="db.properties"/>--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource> <!-- <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> <!-- 每一个Mapper.xml都需要再Mybatis核心配置文件中注册--><mappers><mapper resource="com/lyj/dao/UserMapper.xml"/></mappers> </configuration>
4.4typeAliases(类型别名)
类型别名是为Java类型设置一个短的名字
存在的意义仅在与用来减少类完全限定名的冗余
1.第一种
<typeAliases><typeAlias alias="Author" type="domain.blog.Author"/><typeAlias alias="Blog" type="domain.blog.Blog"/><typeAlias alias="Comment" type="domain.blog.Comment"/><typeAlias alias="Post" type="domain.blog.Post"/><typeAlias alias="Section" type="domain.blog.Section"/><typeAlias alias="Tag" type="domain.blog.Tag"/> </typeAliases>
例子
<!-- 可以给实体类起别名--> <!-- <typeAliases>--> <!-- <typeAlias type="com.lyj.pojo.User" alias="User"/>--> <!-- </typeAliases>-->
2.第二种
也可以指定一个包名,Mybatis会在包名下面搜索需要的Java Bean,比如:扫描实体类的包,它的默认别名就是这个类的类名,首字母小写
<typeAliases><package name="domain.blog"/> </typeAliases>
例子
<typeAliases><package name="com.lyj.pojo"/></typeAliases>
在实体类比较少的时候,使用第一种方法
如果实体类十分多,建议使用第二种
第一种可以DIY别名,第二种则不行
如果非要改,泽需要在实体类上增加注解
3.第三种
在第二种包之中,如果@Alias
注释被发现其值将被用作别名
@Alias("author") public class Author {... }
import org.apache.ibatis.type.Alias;@Alias("hello") public class User {......}
Alias(别名) | Mapped Type(映射类型) |
---|---|
_byte | byte |
_char (since 3.5.10) | char |
_character (since 3.5.10) | char |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
char (since 3.5.10) | Character |
character (since 3.5.10) | Character |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
biginteger | BigInteger |
object | Object |
date[] | Date[] |
decimal[] | BigDecimal[] |
bigdecimal[] | BigDecimal[] |
biginteger[] | BigInteger[] |
object[] | Object[] |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
4.5settings(设置)
设置 | 描述 | 有效值 | 默认 |
---|---|---|---|
logImpl | 指定MyBatis应使用的日志记录实现。如果不存在此设置,则将自动发现日志记录实现。 | SLF4J | LOG4J (自3.5.9起已弃用) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |
4.6其他配置
typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件)
mybatis-generator
mybatis-plus
通用mapper
4.7mappers(映射器)
可以使用类路径相对资源引用,完全限定的url引用 (包括file:///
Url) 、类名或包名
1.使用类路径相对资源引用
<!-- Using classpath relative resources --> <mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
例子
<mappers><mapper resource="com/lyj/dao/UserMapper.xml"/></mappers>
2.使用class文件绑定注册
<!-- Using mapper interface classes --> <mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/> </mappers>
注意点:
接口和它的Mapper配置文件必须同名
接口和它的Mapper配置文件必须在同一个包下
3.使用URL
<!-- Using url fully qualified paths --> <mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/> </mappers>
4.8生命周期和作用域
生命周期类和作用域是非常重要的。不正确地使用它们会导致严重的并发问题
MyBatis 核心对象作用域说明
SqlSessionFactoryBuilder
一旦创建了
SqlSessionFactory
,就不再需要它了通常作为局部变量使用,仅用于构建
SqlSessionFactory
实例
SqlSessionFactory
可类比为数据库连接池,负责创建
SqlSession
实例一旦创建,应在应用运行期间全程存在,无需(也不应)丢弃或重建实例
最佳作用域:应用作用域(与应用同生命周期)
实现方式:常用单例模式或静态单例模式保证全局唯一
SqlSession
可理解为连接池的一次请求 / 会话,用于执行 SQL 操作
实例非线程安全,不能跨线程共享
最佳作用域:请求 / 方法作用域(随请求或方法结束销毁)
注意:使用后需主动关闭,避免资源泄漏
每一个Mapper就代表一个具体的业务
5.解决属性名和字段名不一致的问题
5.1
public class User {private int id;private String name;private String password; }
类型处理器
select * from mybatis.user where id = #{id}select id,name,pwd from mybatis.user where id = #{id}
解决方法
起别名
<selece id="getUserById" resultType = "com.lyj.pojo.User">select id,name,pwd as password from mybatis.user where id = #{id} </selece>
5.2resultMap
resultmap 元素是 MyBatis 中最重要最强大的元素
ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
结果集映射
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.lyj.dao.UserMapper"> <!-- 结果集映射 --><resultMap id="UserMap" type="User"><!-- column 数据库中的字段,property 实体类中的属性 --><result column="id" property="id"/><result column="name" property="name"/><result column="pwd" property="password"/></resultMap> <select id="getUserById" resultMap="UserMap">select * from mybatis.user where id = #{id}</select> </mapper>
6.日志
6.1日志工厂
如果一个数据库操作,出现了异常,我们需要排错,就需要用到日志
SLF4J
LOG4J (自3.5.9起已弃用) ???
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING (需要掌握)
NO_LOGGING
STDOUT_LOGGING (需要掌握)
<settings> <!-- 标准的日志工厂实现--><setting name="logImpl" value="STDOUT_LOGGING"/></settings>
LOG4J (自3.5.9起已弃用)
LOG4J (自3.5.9起已弃用)是Apache的一个开源项目,通过使用Log4j,
我们可以控制日志信息输送的目的地是控制台、文件GUI组件
我们也可以控制每一条日志的输出格式;
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
使用:
1.在要使用Log4j的类中,导入包import org.apache.log4j.Logger;
2.日志对象,参数为当前类的class
static Logger logger = Logger.getLogger(UserDaoTest.class);
3.日志级别
logger.info("info:进入了testLog4j");logger.debug("debug:进入了testLog4j");logger.error("error:进入了testLog4j");