文章目录
Mybatis配置文件
properties 属性(数据库连接等配置)
使用property 子元素将数据库连接的相关配置进行改写
jdbc.properties
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/ssm
database.username=root
database.password=123456
<configuration>
<properties resource= ” jdbc.properties " />
<typeAliases><!--别名-->
<typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
</typeAliases>
<!--数据库环境-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</dataSource>
</environment>
</environments>
<!--映射文件-->
<mappers>
<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
</mappers>
< /configuration>
settings 设置(与映射相关配置)
—个配置完整的settings元素的示例如下:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value=true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
typeAliases类型命名(节省mapper文件的resultType名称)
<typeAliases>
<typeAlias alias="user" type="cn.itcast.pojo.User"/>
</typeAliases>
在mapper.xml中用resultType的时候可以使用user
<select id="loadUserById" parameterType="integer" resultType="user">
select * from user where id = #{id}
</select>
https://www.cnblogs.com/kingxiaozi/p/5991108.html
typeHandlers类型处理器(mapper文件中自定义类型转换,将date类型格式化成时间,格式转换)
https://www.cnblogs.com/wangjiuyong/articles/6685376.html
objectFactory 对象工厂(执行mapper文件方法过程有关,执行mapper方法的时候,修改执行顺序)
https://www.cnblogs.com/wangjiuyong/articles/6685376.html
plugins 插件
environments 环境
参考spring+MyBatis中environments 环境
<environments default="mysql">
<!-- 环境配置,即连接的数据库。 -->
<environment id="mysql">
<!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置 -->
<transactionManager type="JDBC"/>
<!-- dataSource指数据源配置,POOLED是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>
poolMaximumActiveConnections 是在任意时间都存在的活动( 也就是正在使用)连
接数量,默认值为10 。
• poolMaximurnldleConnections 是任意时间可能存在的空闲连接数。
• poolMaximumCheckoutTime 在被强制返回之前,池中连接被检出( checked out )的
时间,默认值为2 0 000 毫秒( 即20 秒)。
• poolTimeToWait 是一个底层设置,如果获取连接花费相当长的时间,它会给连接池
打印状态日志, 并重新尝试获取一个连接(避免在误配置的情况下一直失败) , 默
认值为20 000 毫秒(即20 秒)。
• poolPingQuery 为发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序
中, 并准备接受请求。默认是“ NO PING QUERY SET ”,这会导致多数数据库驱动
失败时带有一个恰当的错误消息。
• poolPingEnabled 为是否启用侦测查询。若开启,也必须使用一个可执行的SQL 语
、句设置poo!PingQuery 属性(最好是一个非常快的SQL) ,默认值为false 。
• poo!PingConnectionsNotUsedFor 为配置poo!PingQuery 的使用频度。这可以被设置成
匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值为0 (即所有连接
每一时刻都被侦测一一仅当poo!PingEnabled 为true 时适用)。
mappers映射器(读取相关mapper文件)
MyBatis需要开发者自己写SQL语句,mapper映射器正是告诉MyBatis到哪里去找映射
文件,进而找到这些SQL语句。实际开发中可以使用相对于类路径的资源引用或完全限定资
源定位符(包括file:///的URL),以及类名和包名等。例如:
<!--使 用 类 路 径 査 找 资 源 文 件-->
<mappers>
<mapper resource="org/fkit/mapper/UserMapper.xml"/>
</mappers>
<!--使 用 本 地 文 件-->
<mappers>
<mapper url="file:///C:/mapper/UserMapper.xml"/>
</mappers>
<!-- 使 用 接 口 类-->
<mappers>
<mapper class="org.fkit.mapper.UserMapper"/>
</mappers>
<!-- 使 用 包 名-->
<mappers>
<package name="org.fkit.mapper"/>
</mappers>
mapper映射器会告诉MyBatis去哪里找映射文件,剩下的细节就是每个SQL映射文件了,
也就是接下来我们要重点讨论的。
深入mapper映射文件
select。映射査询语句。
<!-- select操作
resultType="map"表示返回的是一个Map对象
使用列名做key,值做value -->
<select id="selectUser" resultType="map">
SELECT * FROM TB_USER
</select>
select完整配置
<select
id="selectUaer"
parameterType="int"
resultType="hashmap"
resultMap="userResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType=”FORWARD_ONLY">
insert。映射插入语句。
<!-- insert操,
parameterType="user"表示该插入语句需要一个user对象作为参数
useGeneratedKeys="true"表示使用自动增长的主键 -->
<insert id="saveUser" parameterType="user"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO TB_USER(name,sex,age)
VALUES(#{name},#{sex},#{age})
</insert>
首先,如果数据库支持自动生成主键的字段(比如MySQL和SQLServer) , 那 么 可 以 设
置useGeneratediCeys=“true”,然后再把keyProperty设置到目标属性上就可以了(一般会设置
到id属性上)。例如,如果上面的TB_USER表己经对id使用了自动生成的列类型,那么语
句可以修改为:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
insert into TB_USER (username,password,email,address}
values (#{username},#{password},#{email},#{address})
</insert>
对于不支持自动生成类型的数据库(比如Oracle)或可能不支持自动生成主键的JDBC驱
动来说,MyBatis有另外一种方法来生成主键。
<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select SEQUENCE_TB_USER.nextval as id from dual
</selectKey>
insert into TB_USER
(id, usernamer, password, email,address)
values
(#{id} , #{username}, #(password),#{email}, #{address})
</insert>
update。映射更新语句。
<!-- update操作
parameterType="user"表示该更新语句需要一个user对象作为参数-->
<update id="modifyUser" parameterType="user">
UPDATE TB_USER
SET name = #{name},sex = #{sex},age = #{age}
WHERE id = #{id}
</update>
delete。映射删除语句。
<!-- delete操作 parameterType="int"表示该查询语句需要一个int类型的参数-->
<delete id="removeUser" parameterType="int">
DELETE FROM TB_USER WHERE id = #{id}
</delete>
sql。可被其他语句引用的可重用语句块。
<select id="selectUsers" resultType"map">
select
<include refid="userColumns"><property name="alias" value="tl" /></include>
from some table t1
</select>
cache。给定命名空间的缓存配置。
cache-ref。其他命名空间缓存配置的引用。
resultMap。最复杂也是最强大的元素,用来描述如何从数据库结果集中加载对象。
方式一:
package org.fkit.test;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.fkit.factory.FKSqlSessionFactory;
public class SelectMapTest {
public static void main(String[] args) throws Exception {
// 获得Session实例
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 查询TB_USER表所有数据返回List集合,集合中的每个元素都是一个Map
List<Map<String,Object>> list
= session.selectList("org.fkit.mapper.UserMapper.selectUser");
// 遍历List集合,打印每一个Map对象
for(Map<String,Object> row : list){
System.out.println(row);
}
// 提交事务
session.commit();
// 关闭Session
session.close();
}
}
<!-- select操作
resultType="map"表示返回的是一个Map对象
使用列名做key,值做value -->
<select id="selectUser" resultType="map">
SELECT * FROM TB_USER
</select>
方式二:
package org.fkit.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.fkit.domain.User;
import org.fkit.factory.FKSqlSessionFactory;
public class ResultMapTest {
public static void main(String[] args) {
// 获得Session实例
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 查询TB_USER表所有数据返回List集合,集合中的每个元素都是一个Map
List<User> user_list
= session.selectList("org.fkit.mapper.UserMapper.selectUser2");
// 遍历List集合,打印每一个Map对象
for(User user : user_list){
System.out.println(user);
}
// 提交事务
session.commit();
// 关闭Session
session.close();
}
}
<resultMap id="userResultMap" type="org.fkit.domain.User">
<id property="id" column="user_id" />
<result property="name" column="user_name"/>
<result property="sex" column="user_sex"/>
<result property="age" column="user_age"/>
</resultMap>
<select id="selectUser2" resultMap="userResultMap">
SELECT * FROM TB_USER2
</select>
方式三:关联映射
package org.fkit.domain;
import java.util.List;
public class Clazz {
private Integer id;
private String code;
private List<Student> students;
省略getter和setter
<!-- 映射学生对象的resultMap -->
<resultMap id="studentResultMap" type="org.fkit.domain.Student">
<id property="id" column="id" />
<result property="name" column="name"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<!-- 关联映射 -->
<association property="clazz" column="clazz_id"
javaType="org.fkit.domain.Clazz"
select="selectClazzWithId"/>
</resultMap>
<!-- 根据班级id查询班级 -->
<select id="selectClazzWithId" resultType="org.fkit.domain.Clazz">
SELECT * FROM TB_CLAZZ where id = #{id}
</select>
方式四:
package org.fkit.domain;
import java.util.List;
public class Clazz {
private Integer id;
private String code;
private List<Student> students;
}
<!-- 映射班级对象的resultMap -->
<resultMap id="clazzResultMap" type="org.fkit.domain.Clazz">
<id property="id" column="id" />
<result property="code" column="code"/>
<!-- 班级的学生属性,因为一个班级有多个学生,所以该属性是一个集合 -->
<collection property="students" javaType="ArrayList"
column="id" ofType="org.fkit.domain.Student"
select="selectStudentWithId"/>
</resultMap>
<!-- 根据班级id查询学生 -->
<select id="selectStudentWithId" resultType="org.fkit.domain.Student">
SELECT * FROM TB_STUDENT where clazz_id = #{id}
</select>
<!-- 查询所有班级信息 -->
<select id="selectClazz" resultMap="clazzResultMap">
SELECT * FROM TB_CLAZZ
</select>
package org.fkit.test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.fkit.domain.Clazz;
import org.fkit.domain.Student;
import org.fkit.factory.FKSqlSessionFactory;
public class SelectClazzTest {
public static void main(String[] args) throws Exception {
// 获得Session实例
SqlSession session = FKSqlSessionFactory.getSqlSession();
// 查询TB_CLAZZ表所有数据返回List集合,集合中的每个元素都是一个Clazz对象
List<Clazz> clazz_list
= session.selectList("org.fkit.mapper.UserMapper.selectClazz");
// 遍历List集合,打印每一个Clazz对象和该Clazz关联的所有Student对象
for(Clazz clazz : clazz_list){
System.out.println(clazz);
List<Student> student_list = clazz.getStudents();
for(Student stu : student_list){
System.out.println(stu.getId() + " " + stu.getName() + " " + stu.getSex() + " " + stu.getAge());
}
}
// 提交事务
session.commit();
// 关闭Session
session.close();
}
}