话说
各位读者中午好,现在应该是吃午饭的时刻,我们花一小点的时间总结下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.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放在这里:
然后配置映射的时候,这么配置:
<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、搭建环境要参考官网,主要是搭建的流程,所以,流程很重要,有了流程,理解了运作原理,就会不重不漏,否则容易“丢三落四”。
好了,先到这里吧,下期再会!开饭喽!