1、配置属性

1.1 环境配置(environments)

  • MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。
  • 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

    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>
  • 默认使用的环境 ID(比如:default=”development”)。

  • 每个 environment 元素定义的环境 ID(比如:id=”development”)。
  • 事务管理器的配置(比如:type=”JDBC”)。
  • 数据源的配置(比如:type=”POOLED”)。

默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。

  • dataSource type=”POOLED” 数据源POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。 ```xml <?xml version=”1.0” encoding=”UTF-8” ?> <!DOCTYPE configuration

    1. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  1. <a name="isDwx"></a>
  2. ## 1.2属性(properties)
  3. - 这些属性可以在外部进行配置,并可以进行动态替换。
  4. - 你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
  5. 在Java属性文件里面配置 【db.properties】
  6. ```java
  7. driver=com.mysql.jdbc.Driver
  8. url=jdbc:mysql://localhost:3306/test?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
  9. username=root
  10. password=Aa123456

核心配置文件

  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. <configuration>
  6. <properties resource="db.properties">
  7. </properties>
  8. <environments default="development">
  9. <environment id="development">
  10. <transactionManager type="JDBC"/>
  11. <dataSource type="POOLED">
  12. <property name="driver" value="${driver}"/>
  13. <property name="url" value="${url}"/>
  14. <property name="username" value="${username}"/>
  15. <property name="password" value="${password}"/>
  16. </dataSource>
  17. </environment>
  18. </environments>
  19. <mappers>
  20. <mapper resource="com/qzw/dao/UserMapper.xml"/>
  21. </mappers>
  22. </configuration>
  • 当然xml 标签中还可以添加属性

    1. <properties resource="db.properties">
    2. <property name = "username" value = "root"/>
    3. <property name = "password" value = "Aa123456"/>
    4. </properties>

    不过dataSource在选择的时候优先选择Java属性配置文件db.properties里面的属性

    1.3类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。

  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

一一设置别名

  1. <typeAliases>
  2. <typeAlias alias="Author" type="domain.blog.Author"/>
  3. <typeAlias alias="Blog" type="domain.blog.Blog"/>
  4. <typeAlias alias="Comment" type="domain.blog.Comment"/>
  5. <typeAlias alias="Post" type="domain.blog.Post"/>
  6. <typeAlias alias="Section" type="domain.blog.Section"/>
  7. <typeAlias alias="Tag" type="domain.blog.Tag"/>
  8. </typeAliases>

扫描包

  1. <typeAliases>
  2. <package name="domain.blog"/>
  3. </typeAliases>

实体类较少的时候可以用对应的别名, 较多的时候使用扫描包下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

1.4 设置(settings)

  • 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为 | cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true | | :—- | :—- | :—- | :—- | | lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 | true | false | false | | defaultResultSetType | 指定语句默认的滚动策略。(新增于 3.5.2) | FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同于未设置) | 未设置 (null) | | logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |

具体参见官方文档

1.5映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。

为了规范通常将接口类和接口实现xml文件放到同一个包里面 并且统一命名使用rescoure 相对路径注册

  1. <!-- 使用相对于类路径的资源引用 -->
  2. <mappers>
  3. <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  4. <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  5. <mapper resource="org/mybatis/builder/PostMapper.xml"/>
  6. </mappers>

当然还有

  1. <!-- 使用映射器接口实现类的完全限定类名 -->
  2. <mappers>
  3. <mapper class="org.mybatis.builder.AuthorMapper"/>
  4. <mapper class="org.mybatis.builder.BlogMapper"/>
  5. <mapper class="org.mybatis.builder.PostMapper"/>
  6. </mappers>
  7. <!-- 将包内的映射器接口实现全部注册为映射器 -->
  8. <mappers>
  9. <package name="org.mybatis.builder"/>
  10. </mappers>
  • 这些配置会告诉 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了。

    2、生命周期和作用域问题

  • 理解我们之前讨论过的不同作用域和生命周期类别是至关重要的,

  • 因为错误的使用会导致非常严重的并发问题。

    2.1SqlSessionFactoryBuilder

    这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

    2.2SqlSessionFactory

    SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

    2.3SqlSession

    每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

    3、结果映射 resultMap

  • 解决字段名和实体类属性名不一样的问题

    1. <resultMap id="getUser2" type="User">
    2. <result column="Stuld" property="id"></result>
    3. <result column="StuName" property="name"></result>
    4. <result column="LoginPwd" property="password"></result>
    5. </resultMap>

    使用这样的方法样实体类属性与数据库字段一一对应

  • column 对应数据库字段

  • property 实体类属性

    4、log4j 日志工厂

    思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?
    如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。
    对于以往的开发过程,我们会经常使用到debug模式来调节,跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发,调节程序的工具。
    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

  • SLF4J

  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。
标准日志实现
指定 MyBatis 应该使用哪个日志记录实现。如果此设置不存在,则会自动发现日志记录实现。

  1. 1. <settings>
  2. 2. <setting name="logImpl" value="STDOUT_LOGGING"/>
  3. 3. </settings>

测试,可以看到控制台有大量的输出!我们可以通过这些输出来判断程序到底哪里出了Bug

Log4j

简介:

  • Log4j是Apache的一个开源项目
  • 通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件….
  • 我们也可以控制每一条日志的输出格式;
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

使用步骤:
1、导入log4j的包

  1. 1. <dependency>
  2. 2. <groupId>log4j</groupId>
  3. 3. <artifactId>log4j</artifactId>
  4. 4. <version>1.2.17</version>
  5. 5. </dependency>

2、配置文件编写

  1. 1. #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
  2. 2. log4j.rootLogger=DEBUG,console,file
  3. 3.
  4. 4. #控制台输出的相关设置
  5. 5. log4j.appender.console = org.apache.log4j.ConsoleAppender
  6. 6. log4j.appender.console.Target = System.out
  7. 7. log4j.appender.console.Threshold=DEBUG
  8. 8. log4j.appender.console.layout = org.apache.log4j.PatternLayout
  9. 9. log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
  10. 10.
  11. 11. #文件输出的相关设置
  12. 12. log4j.appender.file = org.apache.log4j.RollingFileAppender
  13. 13. log4j.appender.file.File=./log/kuang.log
  14. 14. log4j.appender.file.MaxFileSize=10mb
  15. 15. log4j.appender.file.Threshold=DEBUG
  16. 16. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  17. 17. log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
  18. 18.
  19. 19. #日志输出级别
  20. 20. log4j.logger.org.mybatis=DEBUG
  21. 21. log4j.logger.java.sql=DEBUG
  22. 22. log4j.logger.java.sql.Statement=DEBUG
  23. 23. log4j.logger.java.sql.ResultSet=DEBUG
  24. 24. log4j.logger.java.sql.PreparedStatement=DEBUG

3、setting设置日志实现

  1. 1. <settings>
  2. 2. <setting name="logImpl" value="LOG4J"/>
  3. 3. </settings>

4、在程序中使用Log4j进行输出!

  1. 1. //注意导包:org.apache.log4j.Logger
  2. 2. static Logger logger = Logger.getLogger(MyTest.class);
  3. 3.
  4. 4. @Test
  5. 5. public void selectUser() {
  6. 6. logger.info("info:进入selectUser方法");
  7. 7. logger.debug("debug:进入selectUser方法");
  8. 8. logger.error("error: 进入selectUser方法");
  9. 9. SqlSession session = MybatisUtils.getSession();
  10. 10. UserMapper mapper = session.getMapper(UserMapper.class);
  11. 11. List<User> users = mapper.selectUser();
  12. 12. for (User user: users){
  13. 13. System.out.println(user);
  14. 14. }
  15. 15. session.close();
  16. 16. }

5、测试,看控制台输出!

  • 使用Log4j 输出日志
  • 可以看到还生成了一个日志的文件 【需要修改file的日志级别】

    5、注解

    5.1@Select @Param

  • 对于简单的sql语句可以使用注解来查询

    1. @Select(" select Stuld, StuName, LoginPwd from students where Stuld=#{id} and Sex=#{sex}")
    2. User grtUser3(@Param("id") int id,@Param("sex") String sex);
  • @Select()里面只需要写sql语句

  • 对于多参数问题一定要加上@Param()注解 里面表示的就是参数名,单一基本类型可以不用写, 引用类型可以不用写
  • 在注册时候使用class直接注册接口而不是xml文件, 这里值得注意的是 不能同时注册接口class和实现接口xml。

    1. <mappers>
    2. <mapper class="com.qzw.dao.UserDao"/>
    3. </mappers>

    5.2 自动提交事务

  • 增删改需要提交事务,为了方便SqlSessionFactory 提供了openSession()的重载

    1. public static SqlSession getSqlSession(){
    2. return sqlSessionFactory.openSession(true);
    3. }
  • 该方法设置为自动提交事务, 但是为了正确性不建议使用自动提交事务。