configuration 配置 properties 属性 settings 设置
typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSource 数据源 映射器
properties的配置有三种方式:
第一种
<properties> <property name="password" value="123456"/> </properties>第二种:在db,properties文件中配置,然后加载此资源
<properties resource="db.properties" > </properties> 第三种 //编写Properties Properties properties = new Properties(); properties.setProperty("password", "1234"); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream,properties); 如果三种都配置,那么加载顺序是:第一种——>第二种——>第三种settings配置会影响MyBatis的运行方式
<!-- 是否使用缓存 --> <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="enhancementEnabled" value="false"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25000"/> </settings>
类型别名就是为java类型设置一个短的名称
<!-- 单个别名定义 --> <typeAlias type="com.study.mybatis.Customer" alias="customer"/> <!-- 包别名定义:指定包名称为该包下的po类声明别名,默认别名就是类名(不区分大小写) --> <package name="com.study.mybatis"/> </typeAliases>
无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成 Java 类型,如果我们想将获取的值按照自己的方式转换,那么就得自己写一个类型处理器.
重写TypeHandler 接口
Mybatis每次创建一个新的结果对象实例时,它使用一个 ObjectFactory 实例来完成,我们可以重写该实例,以自己的方式创建
继承 ObjectFactory
添加插件
environments可以配置我们的数据库连接池,事物管理等
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <!--配置数据源,采用mybatis连接池,使用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>
结构如下:
cache - 配置给定命名空间的缓存。 cache-ref – 从其他命名空间引用缓存配置。 resultMap – 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。 parameterMap – 已经被废弃了!老式风格的参数映射。 sql – 可以重用的 SQL 块,也可以被其他语句引用。 insert – 映射插入语句 update – 映射更新语句 delete – 映射删除语句 select – 映射查询语句
主要详解insert中的一些配置属性,update,delete,insert和select一样。sql片段,resultMap
输入类型有四种,简单类型,pojo类型,包装pojo类型,map类型,主要来看下map类型
map类型:
sqlMapper配置文件
<select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap"> SELECT * FROM t_customer WHERE id=#{id} </select>
mapper接口:
public Customer findUserByHashMap(Map<String, Object> hashmap) throws Exception; 测试代码:
@Test public void test6() throws Exception{ Map<String, Object> hash=new HashMap<String, Object>(); hash.put("id", 4); String resource="SqlMapConfig.xml"; //读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); //创建session SqlSession session=sqlSessionFactory.openSession(); //调用session的增删改查 CustomerMapper mapper = session.getMapper(CustomerMapper.class); //传入map类型的参数 System.out.println(mapper.findUserByHashMap(hash).getCname()); //提交事物 session.commit(); session.close(); }
使用resultType映射的规范:
使用resultType进行结果映射时,需要查询出的列名和映射的对象的属性名一致,才能映射成功。
如果查询的列名和对象的属性名全部不一致,那么映射的对象为空。
如果查询的列名和对象的属性名有一个一致,那么映射的对象不为空,但是只有映射正确那一个属性才有值。
如果查询的sql的列名有别名,那么这个别名就是和属性映射的列名。
简单类型
使用简单类型规则:
查询的列必须是一列,才能映射为简单类型,比如,统计计数
po类
po类在MyBatis学习一中有概述
resultMap进行结果映射时,不需要其列名和属性名一致,但须声明一个resultMap,来对列名和属性名进行映射
resultMap配置:
<!-- id:专门为查询结果中唯一的映射 result:映射查询结果中的普通列 --> <resultMap type="com.study.mybatis.Customer" id="userByMap"> <id column="id" property="id"/> <result column="cname" property="cname"/> </resultMap> <select id="findUserByHashMap" parameterType="java.util.Map" resultMap="userByMap"> SELECT * FROM t_customer WHERE id=#{id} </select> Customer类:
public class Customer { private Integer id; private String cname; public Integer getId() { return id; } public void setId(Integer cid) { this.id = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } } 测试:
@Test public void test6() throws Exception{ Map<String, Object> hash=new HashMap<String, Object>(); hash.put("id", 4); String resource="SqlMapConfig.xml"; //读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //建立sqlsessionFactory SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream); //创建session SqlSession session=sqlSessionFactory.openSession(); //调用session的增删改查 CustomerMapper mapper = session.getMapper(CustomerMapper.class); //传入map类型的参数 System.out.println(mapper.findUserByHashMap(hash).getCname()); //提交事物 session.commit(); session.close(); }
Sql片段可以让代码有更高的可重用性
Sql片段需要先定义后使用
定义:
<sql id="sqlFindId"> SELECT * FROM t_customer WHERE =#{id} </foreach> 调用:<select id="findById" parameterType="int" resultType="customer"> <include refid="sqlFindId"></include> </select>
例:foreach
<!-- collection:pojo集合中的属性名称 item:遍历出的结果声明结果名称 open:遍历开始时的连接符 close:遍历结束时的连接符 separator:分隔符 --> <sql id="sqlForeach"> SELECT * FROM t_customer WHERE id IN <foreach collection="idList" item="id" open="(" close=")" separator=","> #{id} </foreach> </sql>