JavaWeb框架-MyBatis-1-环境搭建

话说

各位读者中午好,现在应该是吃午饭的时刻,我们花一小点的时间总结下MyBatis的环境搭建,何如?

目录


1、MyBatis环境搭建

1)整体布局
2)配置文件
3)实体类
4)测试
5)总结


开发环境:
IDEA(2017.2.5)
Maven Web项目

What MyBatis?前面我们总结的SSH(Spring+Sturts2+Hibernate),这种框架模式是比较古老的了,现在流行SSM(Spring+Struts2+MyBatis),前期陆续总结了Hibernate、Struts2、Spring以及SSH的整合,MyBatis是目前为止Web框架系列最后一位出场嘉宾奥。

它的特点是:是一种数据持久层框架。What 数据持久层?就是ORM,对象关系映射:Object Relational Mapping,通俗点就是数据库中的表对应实体类。按理说,这个我们从一开始的JDBC不久开始用了么?但是现在用起来,越来越Easy!还有不少其他特点,我们在运用过程体会即可。

1、MyBatis环境搭建

1)整体布局

JavaWeb框架-MyBatis-1-环境搭建_第1张图片

2)配置文件

前面说过,搭建任何框架,基本都是“套路”,先下载jar包。
这里是Maven项目,所以直接配置pom.xml的依赖即可。
导入:mybatis包和mysql连接包(数据持久化嘛,自然要和数据库交互)

1、pom.xml
2、mybatis.xml
3、User.xml

1、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0modelVersion>
  <groupId>com.hmc.mybatisgroupId>
  <artifactId>mybatisartifactId>
  <packaging>pompackaging>
  <version>1.0-SNAPSHOTversion>
    <modules>
        <module>../mybatis2module>
    modules>
    <name>mybatis Maven Webappname>
  <url>http://maven.apache.orgurl>
  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.12version>
      <scope>testscope>
    dependency>

    

    <dependency>
      <groupId>org.mybatisgroupId>
      <artifactId>mybatisartifactId>
      <version>3.4.5version>
    dependency>

  
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>8.0.8-dmrversion>
    dependency>


      <dependency>
          <groupId>org.junit.jupitergroupId>
          <artifactId>junit-jupiter-apiartifactId>
          <version>RELEASEversion>
      dependency>


  dependencies>
  <build>
    <finalName>mybatisfinalName>
  build>
project>

注意:
这里mysql-connector-java是最新版本,会存在一个MySQL数据库和包时间不一致问题。会在测试部分详细说明。

2、mybatis.xml

这个配置有什么用?就是用来连接数据库的。
我们把类似.xml的配置文件,都放在IDEA自动创建的RESOURCES目录下,就可以自动找到啦!




<configuration>



    <environments default="development">
        
        
        <environment id="development">
            
            <transactionManager type="JDBC">transactionManager>
            <dataSource type="POOLED">
                
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                
                <property name="url" value="jdbc:mysql://localhost:3306/sysmgr?serverTimezone=GMT"/>
                
                <property name="username" value="root"/>
                <property name="password" value="119913"/>

            dataSource>
        environment>
    environments>

    
   <mappers>
       <mapper resource="User.xml"/>
   mappers>


configuration>

这里需要准备下数据库,在下建立的是sysmgr数据库,数据表是users,字段当然和User实体类保持一致。

create table users(
id int(15) auto_increment primary key,
name varchar(15),
age int(15)
);

insert into users (name,age) values
("贾宝玉",20),
("林黛玉",17),
("史湘云",16),
("袭人",18);

3、User.xml

这个有什么用?很简单,把SQL语句放到了配置文件里,并且表明实体类映射数据库中的表。





<mapper namespace="com.hmc.mybatis.model.User">
    
    <select id="selectUser" resultType="com.hmc.mybatis.model.User">
        select * from users ;
    select>
mapper>

为什么要这样配置呢?之前我们写JDBC的时候,我们用的是反射机制,主要依靠Field这个类。现在配置在外面,避免每次改动源码。

这么一配置,查询语句就和实体类有了关系,在把User.xml配置到mybatis.xml中,数据库又和这个类有了关系,所以最终我们只需要把控mybatis.xml这样一个配置文件即可。

3)实体类

这里实体类仅做演示,属性简单化。
User

package com.hmc.mybatis.model;

/**
 * User:Meice
 * 2017/11/18
 */
public class User {
    private int id;
    private String name;
    private int age;
    public User() {}
    public User(int id,String name,int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

4)测试

流程:
类似Spring中的session。用流的方式读取配置文件==》构建一个SqlSessionFactory,先创建一个工场==》用这个工场来开启openSession==》得到sqlSession==》执行各种查询

package com.hmc.mybatis.test;
import com.hmc.mybatis.model.User;
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 org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * User:Meice
 * 2017/11/18
 */
public class MybatisTest {

    @Test
  public void test() {
    //1 、加载mybatis.xml
       //  法一: InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis.xml");
        SqlSession session = null;
        try {
            InputStream is =   Resources.getResourceAsStream("mybatis.xml");
        //2、构建SqlSessionFactory
            SqlSessionFactory  factory = new SqlSessionFactoryBuilder().build(is);
            //3、获取session
           session = factory.openSession();//默认自动提交事务

            //4、执行查询
            //获取对应命名空间下的select id
        List users = session.selectList("com.hmc.mybatis.model.User.selectUser");
            //5、使用users
            System.out.println(users);


        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //6、关闭资源
           if(session != null) session.close();
        }

    }


}

运行结果:

"D:\Program Files\Java\jdk1.8.0_144\bin\java" -ea 
[User{id=1, name='贾宝玉', age=20}, User{id=2, name='林黛玉', age=17}, User{id=3, name='史湘云', age=16}, User{id=4, name='袭人', age=18}]

Process finished with exit code 0

注意:
1、配置文件在IDEA中,通通放到Resources下面,否则映射找不到。

笔者开始在把User.xml放在这里:

JavaWeb框架-MyBatis-1-环境搭建_第2张图片

然后配置映射的时候,这么配置:

 
   <mappers>
       <mapper resource="com/hmc/mybatis/mappder/User.xml"/>
   mappers>

这样是无论如何也找不到滴!报错:不存在这样一个东东:com/hmc/mybatis/mappder/User.xml

2、读取配置文件有2种方式
第一种是通过:

this.getClass().getClassLoader().GetResourceAsStream();

第二种是通过MyBatis自带的Resources来直接获取getResourceAsStream。

3、最新版本的mysql-connector,会有时间不一致问题,具体报错信息入下:

### Cause: java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

就是time zone不一致,mysql服务器的时间和驱动的时间不一致,怎么办?

加上?serverTimezone=GMT,统一用格林尼治时间就好。


<property name="url" value="jdbc:mysql://localhost:3306/sysmgr?serverTimezone=GMT"/>

如果用老版本,不会遇到这个问题奥。

4、若配置不全,会有以下这些情况:

1)User.xml中忘记配置namespace,报错如下:

必须配置namespace,不然找不到:
Caused by: org.apache.ibatis.builder.BuilderException: Mapper's namespace cannot be empty

2)没有把实体映射文件User.xml配置到mybatis.xml中,会报错:

Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.hmc.mybatis.model.User.selectUser

5)总结


1、框架和人一样,都有各自的秉性和特点,mybatis环境搭建起来,有点小麻烦,不过用时10-15min就可以搞定;

2、尝试用最新的包,这样有机会遇到最新的问题。比如:mysql-connnector这样的time zone问题;

3、搭建环境要参考官网,主要是搭建的流程,所以,流程很重要,有了流程,理解了运作原理,就会不重不漏,否则容易“丢三落四”。


好了,先到这里吧,下期再会!开饭喽!

你可能感兴趣的:(Java)