这里写目录标题
BUG
正确:
<select id="getStudent" resultType="com.mystudy.pojo.Student">
select * from mybatis.student
</select>
resultType这里要使用全类名
如果在配置里使用了别名,如下,那么resultType后可以直接跟类名
<typeAliases>
<package name="com.mystudy.pojo"/>
</typeAliases>
maven中资源过滤配置
- maven中写的配置文件无法导出或者失效时,解决方案:
- 在build中配置resources,防止导出失败
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
Map和模糊查询扩展
Map
- 当实体类或数据库中的表,字段或者参数过多时,考虑使用Map传参
- Map传递参数,直接在sql中取出key即可, parameterType="map"
- 对象传递参数,直接在sql中取出对象属性, parameterType="Object"
- 只有一个类型参数的情况下,可以直接在sql中取到
- 多个参数用Map,或者注解
/**
* addUser2
* @param map
* @return
*/
int addUser2(Map<String,Object> map);
@Test
public void addUser2(){
SqlSession sqlSession = MyBatils.getSqlSession();
UserDaoMapper mapper = sqlSession.getMapper(UserDaoMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("u",5);
map.put("n","mane2");
map.put("p","password");
int addUser2 = mapper.addUser2(map);
if(addUser2 > 0){
System.out.println("successful add");
}
sqlSession.commit();
sqlSession.close();
}
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id, name, pwd) values (#{u},#{n},#{p})
</insert>
模糊查询
- java代码执行的时候,传递通配符 % %
- 在sql拼接中使用通配符
配置解析
核心配置文件
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
环境配置
- MyBatis 可以配置成适应多种环境
- 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
- MyBatis默认事务管理器是JDBC,连接池:POOLED
事务管理器
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
属性properties
- 通过properties属性实现引用配置文件
- 属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
- 编写一个db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username=root
password=123456
- 引入核心配置文件
配置文件属性必须按照以下顺序写
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,
typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,
databaseIdProvider?,mappers?)".
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--core congfig file-->
<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<typeAlias type="com.mystudy.pojo.User" alias="User"/>
</typeAliases>
<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="\com\mystudy\dao\userMapper.xml"/>
</mappers>
</configuration>
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
- 首先读取在 properties 元素体内指定的属性。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
- 因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
类型别名(typeAliases)
- 类型别名是为java类型设置一个短的名字
- 存在意义是减少类完全限定的冗余
<!--给实体类起别名-->
<typeAliases>
<typeAlias type="com.mystudy.pojo.User" alias="User"/>
</typeAliases>
也可以指定一个包名,Mybatis会在包名下搜索需要的javabean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名
<!--给实体类起别名-->
<typeAliases>
<typeAlias package="com.mystudy.pojo"/>
</typeAliases>
- 实体类较少时 用第一种方式
- 实体类多,建议使用第二种
- 第一种可以diy别名,第二种不可以,非要改客户以使用注解
@Alias("user")
public class User{}
映射器
MapperRegistry:注册绑定Mapper文件
方式一:推荐
<mappers>
<mapper resource="\com\mystudy\dao\userMapper.xml"/>
</mappers>
方式二: 使用class文件绑定注册
<mappers>
<mapper class="com.mystudy.dao.userMapper"/>
</mappers>
方式二注意点:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
方式三:使用扫描包进行注入绑定
<mappers>
<mapper package="com.mystudy.dao"/>
</mappers>
注意:
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
生命周期和作用域
每个mappper对应一个业务
ResultMap结果集映射
resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
ResultMap 的设计思想是,对简单的语句做 到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了
日志工厂
- SLF4J
- LOG4J (掌握)
- LOG4J2
- JDK_LOGGING
- COMMONS_LOGGING
- STDOUT_LOGGING (掌握)
- NO_LOGGING
STDOUT_LOGGING 标准日志输出
在mybatis核心配置文件中,配置日志
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
Log4j
2. log4j.properties
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.console.layout.ConversionPattern=%5p [%t] - %m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/rzk.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.配置
分页
使用注解开发
CRUD
Lombok
多对一处理
…
动态SQL
根据不同条件生成不同语句,本质还是SQL,利用SQL执行一定逻辑的代码
动态SQL就是拼接SQL语句,保证SQL的正确性,按照SQL格式排列组合
SQL片段
foreach