一、其他的配置
1.开启驼峰转换
2.具体指定需要使用的日志(存在多个日志)
可以不指定,但是会按照下面的找,我们还是需要导入自己使用的日志依赖和日志配置文件
MyBatis框架内置日志工厂。日志工厂负责自动加载项目中配置的日志。MyBatis支持以下日志,当存在多个日志工具时,严格按照从上往下顺序使用,且只会使用一个。
SLF4J
Apache Commons Logging
Log4j 2
Log4j (deprecated since 3.5.9)
JDK logging
3.为实体类定义别名
4.加载映射文件
<?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">
<configuration>
<!--
这些属性可以在外部进行配置,并可以进行动态替换。
你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
-->
<properties resource="config.properties" />
<settings>
<!-- 驼峰命名与下划线自动转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- log日志 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<!--
别名
type 类的完全限定名
alias 别名
-->
<!--为某个类指定别名-->
<!--<typeAlias alias="person" type="com.lihaozhe.pojo.Person"/>-->
<!--为某个包下的所有类指定别名 别名默认为类的首字母小写之后的字符串-->
<package name="com.lihaozhe.pojo"/>
</typeAliases>
<!--
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。
例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
-->
<!--默认使用的环境 ID(比如:default="development")。-->
<environments default="development">
<!--每个 environment 元素定义的环境 ID(比如:id="development")。-->
<environment id="development">
<!--事务管理器的配置(比如:type="JDBC")。-->
<!--
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们。
-->
<transactionManager type="JDBC"/>
<!--数据源的配置(比如:type="POOLED")-->
<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="mybatis/mapper/PersonMapper.xml"/>-->
<!-- 使用完全限定资源定位符(URL) -->
<!--<mapper url="file:///home/lhz/mybatis/src/main/resources/com/lihaozhe/mapper/PersonMapper.xml"/>-->
<!--<mapper url="file:///D:/mybatis/src/main/resources/com/lihaozhe/mapper/PersonMapper.xml"/>-->
<!--加载某包下所有的映射配置文件-->
<package name="com.lihaozhe.mapper"/>
</mappers>
</configuration>
二、接口绑定
1.技术介绍:
1.我们之前使用Mybatis,是直接使用sqlsession对象调用各种封装的方法,去拿到我们Mapper中sql去与数据库做交互。(缺点:需要用一次就创建一个sqlsession对象)
2.以前我们是创建一个dao层去数据库做交互,直接创建一个dao实现类对象就可以调用各种自己写的方去与数据库交互(优点:创建一个对象,多次调用)
3.Mybatis中则提供了一种技术
通过SqlSession的getMapper方法产生接口的动态代理对象。然后通过对象调用接口中提供的功能。 在将接口中的方法与对应的Mapper.xml中的sql关联。
总之:1.我们先用sqlsession对象获得接口的代理对象mapper
2.通过接口的代理对象mapper调用接口中写的方法
3.就可以拿到方法关联mapper.xml中的sql,然后数据库交互。
2.技术实现:
1.首先在mybatis-config.xml中
<mappers>
<!-- 此处换为package,里面写接口和映射文件所在的包 -->
<package name="com.zqwl.mapper"/>
</mappers>
2.接口和映射文件
首先接口和映射文件必须处于同一个输出目录(即编译后的输出目录下的同一个目录下)
注意:
映射文件和接口需要在同一个包中
映射文件名称要和接口名称相同
namespace取值必须是接口的全限定路径
id属性值必须和方法名对应
resultType必须和方法返回值类型对应。如果方法返回值是集合类型,resultType中写泛型的类型
实现方式一:深度拷贝(需要在Pom.xml中加入插件)
那么可以直接将接口和mapper.xml 两直接放入编译前的同一包下编写(dao包)
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
实现方式二:
自己创建一个同样的目录结构(注意上面是包创建是可以com.zqwl.mapper 下面是目录创建是com/zqwl/mapper)
(这儿可以下在idea中下一个插件mybatisX实现 快速生成接口方法对应的sql外部结构)
3.接口绑定下参数传递
//传入某个接口的类对象,就可以得到具体某个接口的代理对象
PeopleMapper peopleMapper = session.getMapper(PeopleMapper.class);
// 底层:session.selectList("selectByNameAddress",map对象)
//调用方法时传入参数
List<People> list = peopleMapper.selectByNameAddress("韩梅梅","北京海淀");
/* 底层解析时把方法参数放入到Map map中。
map.put("arg0",name);
map.put("arg1",address);
map.put("param1",name);
map.put("param2",address);
*/
1.原始传参
List<People> selectByNameAddress(String name,String address);
select * from people where name=#{arg0} and address=#{arg1}
mapper.xml中拿参数#{key},key为arg 、param。arg0和param1这两种方式可以混合使用。
2.使用注解@Param
List<People> selectByInput(@Param("id") Integer id, @Param("name") String name);
那么sql中#{key} 可以直接根据注解后的字符串拿到value
select * from people where id=#{id} and name=#{name}
三、动态SQL
·具体使用查看每日案例
1.if标签
语法格式:<if test="条件"> </if>
特点:相当于java中的if,存在多个if多个if都会判断
作用:
1.条件为true,if标签中的内容参与执行
2.条件为false,if标签中的内容不参与执行
2.choose标签
语法格式:
<choose>
<when test=""> </when>
...
<otherwise></otherwise>
</choose>
特点:
1.相当于java中的if else if else
2.最终只有一个when或otherwise中的内容参与执行
作用:
1.条件为true,when | otherwise 标签中的内容参与执行
2.条件为false,when | otherwise 标签中的内容不参与执行3.trim标签
语法格式:
<trim prefix="where" prefixOverrides="and"></trim>
特点:
1.trim为辅助标签
2.子串内容不为null,添加where
3.子串以and开头去掉and
4.说明:
prefix:只要子内容不是空字符串(""),就在子内容前面添加特定字符串。
prefixOverrides:如果子内容是以某个内容开头,去掉这个内容。
suffix:只要内容不是空字符串(""),就在子内容后面添加特定字符串。
suffixOverrides:如果里面内容以某个内容结尾,就去掉这个内容
作用:配合 if,choose 等使用4.where标签
语法格式:<where></where>
作用:简化<trim prefix="where" prefixOverrides="and"></trim>5.set标签
语法格式:<set></set>
作用:简化<trim prefix="set" suffixOverrides=","></trim>6.foreach标签
语法格式:<foreach collection="数组|集合" item="数组|集合中每一个元素存储的变量"> </foreach>
open:以什么开始
close:以什么结束
separator:以什么分割
作用:遍历7.bind标签
语法格式:<bind name="自定义" value="例如 '%'+name+'%'"/>
作用:字符串拼接8.sql,include标签
sql:sql片段
include:引入sql片段
四、注解
1.注解定义传参名
2.注解写sql(写一些简单的sql,复杂的还是mapper.xml中写)