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

来源:互联网 发布:淘宝男装棉服 编辑:程序博客网 时间:2024/05/16 15:56

话说

各位读者中午好,现在应该是吃午饭的时刻,我们花一小点的时间总结下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)整体布局

这里写图片描述

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.0</modelVersion>  <groupId>com.hmc.mybatis</groupId>  <artifactId>mybatis</artifactId>  <packaging>pom</packaging>  <version>1.0-SNAPSHOT</version>    <modules>        <module>../mybatis2</module>    </modules>    <name>mybatis Maven Webapp</name>  <url>http://maven.apache.org</url>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.12</version>      <scope>test</scope>    </dependency>    <!--导入mybatis-->    <dependency>      <groupId>org.mybatis</groupId>      <artifactId>mybatis</artifactId>      <version>3.4.5</version>    </dependency>  <!--导入Mysql-->    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>8.0.8-dmr</version>    </dependency>      <dependency>          <groupId>org.junit.jupiter</groupId>          <artifactId>junit-jupiter-api</artifactId>          <version>RELEASE</version>      </dependency>  </dependencies>  <build>    <finalName>mybatis</finalName>  </build></project>

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

2、mybatis.xml

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

<?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">        <!--开发环境:development       工作环境:work       测试环境:test       -->        <!--环境,默认与开发环境的默认保持一致-->        <environment id="development">            <!--基于JDBC的事务管理-->            <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语句放到了配置文件里,并且表明实体类映射数据库中的表。

<?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"><!--规范上,将namespace命名为:包名+类名 确保唯一性--><mapper namespace="com.hmc.mybatis.model.User">    <!--id:查询的唯一标识    resultType 查询返回的类型-->    <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<User> 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放在这里:

这里写图片描述

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

 <!--关联实体映射文件-->   <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、搭建环境要参考官网,主要是搭建的流程,所以,流程很重要,有了流程,理解了运作原理,就会不重不漏,否则容易“丢三落四”。


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