针对于上一篇文章的后续学习如下:
configuration(配置)
这些属性可以在外部进行配置,并可以进行动态替换。首先你需要在资源文件下建一个db.properties文件,如下
db.properties文件如下:
1 driver = com.mysql.jdbc.Driver
2 url = jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8
3 username = root
4 password = root
之后在mybatis-config.xml文件下导入db.properties配置文件
1 <properties resource="db.properties"/>
2 或
3 <properties resource="db.properties">
4 <property name="password" value="1234"/>
5 </properties>
这样mybatis-config.xml文件就类似于把db.properties文件包含进去了,于是就可以取得里面的数据
1 <environments default="development"> 2 <environment id="development"> 3 <transactionManager type="JDBC"/> 4 <dataSource type="POOLED"> 5 <property name="driver" value="${driver}"/> 6 <property name="url" value="${url}"/> 7 <property name="username" value="${username}"/> 8 <property name="password" value="${password}"/> 9 </dataSource> 10 </environment>
这里需要特别注意:
如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
首先读取在 properties 元素体内指定的属性。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
一个配置完整的 settings 元素的示例如下:
1 <settings> 2 <setting name="cacheEnabled" value="true"/> 3 <setting name="lazyLoadingEnabled" value="true"/> 4 <setting name="multipleResultSetsEnabled" value="true"/> 5 <setting name="useColumnLabel" value="true"/> 6 <setting name="useGeneratedKeys" value="false"/> 7 <setting name="autoMappingBehavior" value="PARTIAL"/> 8 <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> 9 <setting name="defaultExecutorType" value="SIMPLE"/> 10 <setting name="defaultStatementTimeout" value="25"/> 11 <setting name="defaultFetchSize" value="100"/> 12 <setting name="safeRowBoundsEnabled" value="false"/> 13 <setting name="mapUnderscoreToCamelCase" value="false"/> 14 <setting name="localCacheScope" value="SESSION"/> 15 <setting name="jdbcTypeForNull" value="OTHER"/> 16 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> 17 </settings>
类型别名可为 Java 类型设置一个缩写名字。它仅用于 XML 配置,意在降低冗余的全限定类名书写
当这样配置时,User 可以用在任何使用 com.qijian.pojo.User 的地方
每一个在包 com.qijian.pojo 中的 Java Bean,
在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
比如 com.qijian.pojo.User 的别名为 user;
若有注解,则别名为其注解值
@Alias(”别名")
1 <typeAliases> 2 <typeAlias alias="User" type="com.qijian.pojo.User"/> 3 <package name="com.qijian.pojo.User"/> 4 </typeAliases>
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
environments 元素定义了如何配置环境,如下。
1 <environments default="development"> 2 <environment id="development"> 3 <transactionManager type="JDBC"> 4 <property name="..." value="..."/> 5 </transactionManager> 6 <dataSource type="POOLED"> 7 <property name="driver" value="${driver}"/> 8 <property name="url" value="${url}"/> 9 <property name="username" value="${username}"/> 10 <property name="password" value="${password}"/> 11 </dataSource> 12 </environment> 13 </environments>
-
-
子元素节点:environment
-
-
dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
-
数据源是必须配置的。
-
有三种内建的数据源类型
type="[UNPOOLED|POOLED|JNDI]")
-
unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
-
pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
-
jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
-
数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等....
-
详情:点击查看官方文档
-
这两种事务管理器类型都不需要设置任何属性。
-
具体的一套环境,通过设置id进行区别,id保证唯一!
-
子元素节点:transactionManager - [ 事务管理器 ]
1 <!-- 语法 --> 2 <transactionManager type="[ JDBC | MANAGED ]"/>
-
子元素节点:数据源(dataSource)
-
每一个Mapper.xml都需要在Mybatis核心配置文件中注册
注意:
使用class绑定注册时,接口和它的Mapper配置文件必须同名
使用class绑定注册时,接口和它的Mapper配置文件必须在同一个包下
1 <mappers> 2 <mapper resource="com/qijian/dao/UserMapper.xml"/> 3 <!-- <mapper class="com.qijian.dao.UserMapper"/>--> 4 </mappers>
值得注意的是这些元素需要按照一定的顺序来书写,不然会出现如下错误:
下面贴上部分代码(其余代码请看上一篇mybatis实现MySQL数据库的增删改查之一 ):
1 package com.qijian.dao; 2 3 import com.qijian.pojo.User; 4 5 import java.util.List; 6 7 public interface UserMapper { 8 9 //查询全部用户 10 List<User> getUserList(); 11 12 //根据id查询用户 13 User getUserById(int id); 14 15 //insert一个用户 16 int addUser(User user); 17 18 //修改一个用户 19 int updateUser(User user); 20 21 //删除一个用户 22 int deleteUser(int id); 23 24 }
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.qijian.dao.UserMapper"> 6 <select id="getUserList" resultType="User"> 7 select * from mybatis.user 8 </select> 9 10 <select id="getUserById" parameterType="int" resultType="com.qijian.pojo.User"> 11 select *from mybatis.user where id = #{id}; 12 </select> 13 14 <insert id="addUser" parameterType="com.qijian.pojo.User"> 15 insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd}); 16 </insert> 17 18 19 <update id="updateUser" parameterType="com.qijian.pojo.User"> 20 update mybatis.user 21 set name = #{name},pwd = #{pwd} 22 where id=#{id}; 23 </update> 24 25 <delete id="deleteUser" parameterType="int"> 26 delete from mybatis.user where id=#{id}; 27 </delete> 28 29 </mapper>
db.properties文件如下
1 driver = com.mysql.jdbc.Driver 2 url = jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8 3 username = root 4 password = root
mybatis-config.xml文件如下:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration> 7 8 <!--如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载: 9 首先读取在 properties 元素体内指定的属性。 10 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。 11 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。 12 --> 13 <properties resource="db.properties"> 14 <property name="password" value="1234"/> 15 </properties> 16 17 <!-- 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为--> 18 <!-- <settings>--> 19 <!-- <setting name="" value=""/>--> 20 <!-- </settings>--> 21 22 <!-- 类型别名可为 Java 类型设置一个缩写名字。 23 它仅用于 XML 配置,意在降低冗余的全限定类名书写 24 当这样配置时,User 可以用在任何使用 com.qijian.pojo.User 的地方 25 --> 26 <!-- 每一个在包 com.qijian.pojo 中的 Java Bean, 27 在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 28 比如 com.qijian.pojo.User 的别名为 user; 29 若有注解,则别名为其注解值 30 @Alias(”别名")--> 31 <typeAliases> 32 <typeAlias alias="User" type="com.qijian.pojo.User"/> 33 <package name="com.qijian.pojo.User"/> 34 </typeAliases> 35 36 <environments default="development"> 37 <environment id="development"> 38 <transactionManager type="JDBC"/> 39 <dataSource type="POOLED"> 40 <property name="driver" value="${driver}"/> 41 <property name="url" value="${url}"/> 42 <property name="username" value="${username}"/> 43 <property name="password" value="${password}"/> 44 </dataSource> 45 </environment> 46 47 </environments> 48 49 <!-- 每一个Mapper.xml都需要在Mybatis核心配置文件中注册--> 50 <!-- 注意: 51 使用class绑定注册时,接口和它的Mapper配置文件必须同名 52 使用class绑定注册时,接口和它的Mapper配置文件必须在同一个包下--> 53 <mappers> 54 <mapper resource="com/qijian/dao/UserMapper.xml"/> 55 <!-- <mapper class="com.qijian.dao.UserMapper"/>--> 56 </mappers> 57 58 </configuration>
测试类如下:
1 package com.qijian.dao; 2 3 import com.qijian.pojo.User; 4 import com.qijian.utils.MyBatisUtils; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.Test; 7 8 import java.io.IOException; 9 import java.util.List; 10 11 public class UserDaoTest { 12 @Test 13 public void testGetUserLike() throws IOException { 14 SqlSession sqlSession = MyBatisUtils.getSqlSession(); 15 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 16 List<User> UserList = userMapper.getUserList(); 17 18 for (User user:UserList) { 19 System.out.println(user); 20 } 21 22 } 23 24 }
结构:
注意:
该项目的改进主要是针对mybatis-config.xml文件