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格式编码数据,最后再将数据返回给客户端。

posted @ 2017-05-02 16:34  wdfwolf3  阅读(393)  评论(0编辑  收藏  举报