针对于上一篇文章的后续学习如下:
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>
类型别名可为类型设置一个缩写名字。它仅用于配置,意在降低冗余的全限定类名书写
当这样配置时,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>
- 配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
- 子元素节点: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>
值得注意的是这些元素需要按照一定的顺序来书写,不然会出现如下错误:
下面贴上部分代码
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文件