四、MyBatis配置文件
MyBatis配置文件结构:
-configuration
-properties(属性)
-property
-settings(全局配置参数)
-setting
-plugins(插件)
-plugin
-typeAliases(别名)
-typeAliase
-package
-environments(环境)
-environment
-transactionManager(事务管理)
-dataSource(数据源)
-mappers(映射器)
-mapper
-package
4.1
属性值定义。properties标签中可以定义属性值,也可以引入外部配置文件。无论是内部定义还是外部引入,都可以使用${name}获取值。
例如:我们可以将数据源配置写到外部的db.properties中,再使用properties标签引入外部配置文件,这样可以做到动态配置数据源。
1、编写db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=123456
2、在配置文件中引入db.properties
<!--数据库文件--> <properties resource="db.properties"></properties> <!--配置数据源--> <environments default="mysql"> <environment id="mysql"> <!--事务类型--> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments>
4.2
是配置MyBatis运行时的一些行为的,例如缓存、延迟加载、命名规则等一系列控制性参数。后期我们会使用该标签配置缓存和延迟加载等。
在配置文件中开启二级缓存:
<settings> <setting name="cacheEnabled" value="true"/> </settings>
开启N+1查询的延迟加载:
<settings> <setting name="lazyLoadingEnabled" value="true"/> </settings>
4.3
MyBatis对常用类有默认别名支持,比如java.lang.Stirng的别名为string。除此之外,我们也可以使用设置自定义别名。
为一个类配置别名
<typeAliases> <typeAlias type="全类名" alias="别名"></typeAlias> </typeAliases>
1、配置文件
<!--配置别名--> <typeAliases> <typeAlias type="com.zj.pojo.User" alias="User"></typeAlias> </typeAliases>
2、映射文件
<!--查询全部--> <select id="selectAllUser" resultType="User"> SELECT * FROM user; </select>
为一个所有包下的所有类配置别名
<typeAliases> <package name="包名"></package> </typeAliases>
此时该包下的所有类都有了别名,别名省略包名,和类名相同。
1、配置文件
<!--配置别名--> <typeAliases> <package name="com.zj.pojo"/> </typeAliases>
2、映射文件
<!--分页查询2--> <select id="getUserByPage2" resultType="User" parameterType="PageQuery"> SELECT * FROM user LIMIT #{startIndex},#{pageSize} </select>
4.4
是配置MyBatis插件的。插件可以增强MyBatis功能,比如进行sql增强,打印日志,异常处理等。使用该标签配置分页插件。
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 设置数据库类型--> <property name="helperDialect" value="mysql"/> </plugin> </plugins>
4.5
可以为MyBatis配置数据环境。
事务管理
<environments default="mysql"> <environment id="mysql"> <!-- JDBC:使用JDBC的提交和回滚 MANAGED:不做事务处理--> <transactionManager type="JDBC"></transactionManager> </environment> </environments>
连接池
<environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <!-- 连接池设置 --> <dataSource type="POOLED"> <!-- 数据源设置... --> </dataSource> </environment> </environments>
dataSource的type属性:
- POOLED:使用连接池管理连接,使用MyBatis自带的连接池。
- UNPOOLED:不使用连接池,直接由JDBC连接。
- JNDI:由JAVAEE服务器管理连接,如果使用Tomcat作为服务器则使用Tomcat自带的连接池管理。
4.6
用于注册映射文件或持久层接口,只有注册的映射文件才能使用,共有四种方式都可以完成注册:
1、使用相对路径注册映射文件
<mappers> <mapper resource="com/zj/mapper/UserMapper.xml"/> </mappers>
2、使用绝对路径注册映射文件
<mappers> <mapper url="D:\Java\code\learnMyBatis\src\main\resources\com\zj\mapper\UserMapper.xml"></mapper> </mappers>
3、注册持久层接口(映射文件和持久层路径一样,文件名也一样)
<!--注册映射文件(项目加载的时候先加载的是核心配置文件)--> <mappers> <mapper class="com.zj.mapper.UserMapper"/> </mappers>
4、注册一个包下的所有持久层接口
<!--注册映射文件(项目加载的时候先加载的是核心配置文件)--> <mappers> <package name="com.zj.mapper"/> </mappers>
五、MyBatis映射文件
5.1
标签的作用的自定义映射关系。
MyBatis可以将数据库结果集封装到对象中,是因为结果集的列名和对象属性名相同,当POJO属性名和数据库列名不一致时,MyBatis无法自动完成映射关系。
此时有两种解决方案:
- Sql语句的查询字段起与POJO属性相同的别名。
<!--查询全部老师--> <select id="findAllTeachers" resultType="Teacher"> SELECT tid,tname as teacherName FROM teacher; </select>
2、自定义映射关系
- 在映射文件中,使用
自定义映射关系
- 在
标签中,使用resultMap属性代替resultType属性,使用自定义映射关系。5.2 、用来定义可重用的Sql片段,通过引入该片段。如:Sql语句的查询字段起与POJO属性相同的别名,该Sql片段就可以重用。5.3 特殊字符处理在Mybatis映射文件中尽量不要使用一些特殊字符,如:<,>等。我们可以使用符号的实体来表示:六、MyBatis动态Sql6.1 一个查询的方法的Sql语句不一定是固定的。比如电商网站的查询商品,用户使用不同条件查询,Sql语句就会添加不同的查询条件。此时就需要在方法中使用动态Sql语句。标签内的Sql片段在满足条件后才会添加,用法为:。例如:根据不同条件查询用户:1、持久层接口添加方法2、映射文件3、测试if中的条件不能使用&&/||,而应该使用and/orif中的条件可以直接通过属性名获取参数POJO的属性值,并且该值可以调用方法。where后为什么要加1=1?任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可。 6.2 、可以代替sql中的where 1=1 和第一个and,更符合程序员的开发习惯,使用后的映射文件如下:标签用在update语句中。借助,可以只对有具体值的字段进行更新。会自动添加set关键字,并去掉最后一个if语句中多余的逗号。6.3 、、chose:父标签when:相当于if...else if,只要有一个条件成立,其它的都不判断了otherwise:相当于else,若所有条件都不成立,则执行otherwisewhen至少设置一个,otherwise最多设置一个1、持久层2、映射文件6.4 foreach遍历数组类似JAVA中的for循环,可以遍历集合或数组。有如下属性:collection:遍历的对象类型open:开始的sql语句close:结束的sql语句separator:遍历每项间的分隔符item:表示本次遍历获取的元素,遍历List、Set、数组时表示每项元素,遍历map时表示键值对的值。index:遍历List、数组时表示遍历的索引,遍历map时表示键值对的键。我们使用遍历数组进行批量删除。 1、持久层接口添加方法2、映射文件3、测试6.5 foreach遍历Collection遍历List和Set的方法是一样的,我们使用遍历List进行批量添加。1、持久层接口添加方法2、映射文件3、测试 6.6 foreach遍历Map我们使用遍历Map进行多条件查询。1、持久层接口添加方法2、映射文件3、测试