zoukankan      html  css  js  c++  java
  • mybatis强化(一)基本配置

    转载注明出处:http://www.cnblogs.com/wdfwolf3/p/6796773.html,谢谢。

    最近面试被问到mybatis,发现学的很皮毛,因此重新学习一遍,记录一下过程中的问题及解决方法。

    这次学习没有整合spring。本篇为最基本的mybatis配置和案例,使用XML定义语句,没有用到mapper接口。文件目录如下图,

    1.配置文件mybatisconfig.xml如下,这里有几个常见问题,

      a.配置文件位置。我使用maven创建项目,因此java和resources目录都是根路径。其实简单的方法是直接看target下的classes文件夹,这个文件夹即为根路径,如果搞不清楚路径问题可以到这个文件夹下看文件结构,就可以准确定位各种文件。  b.数据源配置。不管是否使用mybatis,都涉及这个问题。这里主要就是url属性的配置。可以看到我的数据库名后又几个参数serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=utf8。第一个为时区,有可能报错误:InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. 第二个为ssl,会报警报:WARN: Establishing SSL connection without server's identity verification is not recommended.第三个和第四个联合使用是指定传到数据库数据的编码(文末详解),不设置的话where条件中文比较时如果编码不一致导致内容虽然匹配比较结果为false。(&是&的转义

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8" />
                    <property name="username" value="root" />
                    <property name="password" value="1234" />
                </dataSource>
            </environment>
        </environments>
    
        <mappers>
            <mapper resource="com/practice/xml/UsersMapper.xml"/>
        </mappers>
    </configuration>

    2.Main测试函数如下,这里针对加载配置文件路径详细说明一下,这个问题经常遇到很容易混淆。

        a. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
        b. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
        c. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,当然这和具体的容器实现有关。

    package com.practice.Test1;
    
    import com.practice.bean.Users;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class Main { public static void main(String[] args) throws IOException { //我使用MyBatis包一个名叫 Resources 的工具类,它包含一些实用方法,可从 classpath 或其他位置加载资源文件。上文提到了我的配置文件在根路径。
         String resource
    = "mybatisconfig.xml"; InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); SqlSession session = sessionFactory.openSession();
    //这句是UserMapper.xml文件中的namespace+sqlId String statement
    = "com.practice.xml.UsersMapper.getUser"; Users user = session.selectOne(statement, "瓦房店"); // System.out.println(user.getId()); } }

    3.UserMapper.xml文件如下,namespace是随意命名的,不是非得路径名。如果Main文件中statement内容和namespace不一致会报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for “statement的内容”。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.practice.xml.UsersMapper" >
        <select id="getUser" parameterType="String"
                resultType="com.practice.bean.Users">
            select * from users where NAME =#{name}
        </select>
    </mapper>

    这里有可能遇到找不到xml文件,可以检查一下编译时xml有没有在target/classes中,如果不在需要在maven的pom.xml中添加如下配置

    <build>
          <resources>
              <resource>
                  <directory>src/main/java</directory>
                  <includes>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>true</filtering>
              </resource>
          </resources>
      </build>

    p.s.

    如果mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么,

      1. 存数据时:数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。

    2. 取数据时: 在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/wdfwolf3/p/6796773.html
Copyright © 2011-2022 走看看