写在之前—— 折转于springboot,学习SSM框架的MyBatis
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
IDEA环境MyBatis配置:
需要的开发环境——Mysql其他数据库也可以和IDEA。 编写sql语句建库建表,此步骤是为了熟悉SQL语句
在此基础上才有搭框架的基础:
同样如springMVC的一致,建立父工程——由于方便我把MyBatis 和 springMVC的子工程建立在同一个父工程下。 父工程删除src文件夹,有机建立模块(module) 自主搭建的详细xml代码可见——MyBatis官方文档
1、父工程——pom.xml导入依赖
<groupId>org.example</groupId>
<artifactId>SSM</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>SpringMVC</module>
<module>MyBatis</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
自取 里面的junit是springMVC和MyBatis共有的依赖
2、在MyBatis子模块里导入Mybatis 的依赖。
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
3、准备实体类和dao接口以及MyBatis工具类这里由于框架的原因就不需要由以前那样单独创建一个类写select update方法, 接口:
package dao;
import pojo.heros;
import java.util.List;
public interface HeroDAO {
List<heros> getHeroList();
}
utils放工具类:
package utils;
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 MyBatisTool {
static SqlSessionFactory sqlsessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(IOException e)
{
e.printStackTrace();
}
}
public static SqlSession getSqlSession()
{
return sqlsessionFactory.openSession();
}
}
sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 以上代码是借鉴狂神说的,但是他的代码有个小bug,也就是以上这段代码他是这样写的
SqlSessionFactory sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这段代码会引发报错——nullpointerException 空指针异常 也就是以下这一段会受影响—— public static SqlSession getSqlSession() { return sqlsessionFactory.openSession(); } 奇怪在于他运行的时候没报错,这就是bug的奇怪之处吧
resources下创建: mybatis-config.xml 核心配置文件 提供一些运行环境
<?xml version="1.0" encoding="UTF8" ?>
<!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/how2java?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="dao/mapper.xml"/>
</mappers>
</configuration>
给所创建的dao接口建立.xml文件 配置映射,所用的sql语句将在这个xml文件写: 可以命名 XXdaomapper.xml
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.HeroDAO">
<select id="getHeroList" resultType="pojo.heros">
select * from hero
</select>
</mapper>
标识的值为 dao接口里的设定的方法名 resultType为结果类型 和resultMap 区别开 该文件和第一个xml文件中这句对应:
<mappers>
<mapper resource="dao/mapper.xml"/>
</mappers>
接下来依赖junit起作用 在target文件夹中 创建测试类 注意目录结构与其相适应:
package dao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.heros;
import utils.MyBatisTool;
import java.util.List;
public class HeroDAOTest {
@Test
public void test()
{
SqlSession sqlSession= MyBatisTool.getSqlSession();
HeroDAO heroDAO=sqlSession.getMapper(HeroDAO.class);
List<heros> herosList=heroDAO.getHeroList();
for (heros hero : herosList) {
System.out.println(hero);
}
sqlSession.close();
}
}
运行所遇到的坑: 1、可能出的错 java.lang.ExceptionInInitializerError 初始化异常 由于maven里的资源过滤问题 解决: 父子工程加入:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2、 Register:配置文件未注册 检测mapper.xml文件路径
3、工具类有bug 如空指针 熟读代码
4、在MyBatis-config.xml里的 错将value=“root"写成value=”${root}" 导致连接数据库失败
|