目录
1、新建一个java project , 并写好maven依赖
(2)前身是ibatis,在ibatis3.x时,更名为MyBatis
(3)MyBatis 在java和sql之间提供更灵活的映射方案
(4)MyBatis将sql语句和方法实现,直接写到xml文件中,实现和java程序解耦
(5)mybatis 只负责sql,建库建表的工作由程序员完成
快速入门案例
0、项目结构
1、新建一个java project , 并写好maven依赖
这里注意配置末尾的resorce配置,否则会找不到映射文件
maven项目中有一个目录标准,除了标准的resources目录外,src下的xml文件构建时不会被输出到target/classes目录下,故可以将xml文件移至resources目录下(方法一),或者将src下的xml文件也添加成资源(resource),使构建时也会输出到target/classes目录下(方法二)。
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>myBatisHello</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- mybatis核心包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.15</version>
</dependency>
<!--java字节码操作框架-->
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.1</version>
</dependency>
<!--生成和转换Java字节码的高级API。-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!---->
<dependency>
<groupId>ch.qos.reload4j</groupId>
<artifactId>reload4j</artifactId>
<version>1.2.25</version>
</dependency>
<!--日志-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.3.0</version>
</dependency>
<!-- -->
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.4.2</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 在Java中编辑字节码的类库-->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.2-GA</version>
</dependency>
<!-- 作为各种日志框架的简单门面或抽象,允许最终用户在部署时插入所需的日志框架。-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!-- 拓展c3p0功能的mchange包 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.3</version>
</dependency>
<!-- java本地缓存技术-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>
</dependencies>
<build>
<resources>
<!-- src/main/resources目录下的所有文件 -->
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- src/main/java目录下的xml文件,也就是我们需要的 XxxMapper.xml 映射文件 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
2、创建数据库表
create table `mybatis_monster_` (
`monster_id` int primary key auto_increment,
`age` mediumint unsigned not null default 0,
`birthday` date not null,
`email` varchar(255) not null default 'dd@qq.com',
`gender` TINYINT unsigned not null default 1,
`name` varchar(255) not null default '',
`salary` double not null default 0.0
)charset=utf8 engine=InnoDB;
3、配置一个log4j.xml的日志输出文件
注意会使用这个log4j的模版即可(模板来自网络,log4j2是新版,log4j已停止维护,log4j目前还不太懂,先不做深究),不需要记住。
以后会修改就行了,不用管太多,告诉你这么用,你就这么用就可以了。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
<!-- 使用 ConsoleAppender 来输出日志,到IDE的控制台-->
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<!-- 输出的编码是utf-8 -->
<param name="Encoding" value="UTF-8"/>
<!-- 输入日志的布局格式-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n"/>
</layout>
</appender>
<!-- 日志记录 java.sql包下的类产生的debug级别的错误信息 -->
<logger name="java.sql">
<level value="debug"/>
</logger>
<!-- 日志记录 org.apache.ibatis产生的debug级别的错误信息-->
<logger name="org.apache.ibatis">
<level value="debug"/>
</logger>
<root>
<level value="debug"/>
<appender-ref ref="STDOUT"/>
</root>
</log4j:configuration>
4、配置myBatis-config.xml
mybatis官网mybatis – MyBatis 3 | 配置https://mybatis.org/mybatis-3/zh_CN/configuration.html
从官网文档中复制xml文件的表头,修改即可。 (注意复制粘贴可能会有错误,比如多余的空格,点号,都会导致读取配置文件失败)
<?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">
<!-- 配置我们myBatis的环境-->
<environment id="development">
<!-- mybatis使用事务管理器是jdbc直连方式-->
<transactionManager type="JDBC"/>
<!-- 配置我们的数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdb"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 这里引入或者说注册我们的MonsterMapper.xml文件-->
<!-- <mapper resource="com/bin/mybatis/mapper/MonsterMapper.xml"/>-->
<package name="com.bin.mybatis.mapper"/>
</mappers>
</configuration>
5、写好javaBean :Monster
//这就是一个普通的Pojo类
//因为使用原生态的sql语句查询结果还是要封装成对象
//所以这里的实体类属性名和数据库表字段名一致
// (必须遵守,否则处理会踩坑,
// 当然也有方法可以处理)
package com.bin.mybatis.entity;
import java.util.Date;
//这就是一个普通的Pojo类
//因为使用原生态的sql语句查询结果还是要封装成对象
//所以这里的实体类属性名和数据库表字段名一致
// (必须遵守,否则处理会踩坑,
// 当然也有方法可以处理)
public class Monster {
private Integer monster_id;
private Integer age;
private Date birthday;
private String email;
private Integer gender;
private String name;
private Double salary;
public Monster(Integer monster_id, Integer age, Date birthday, String email, Integer gender, String name, Double salary) {
this.monster_id = monster_id;
this.age = age;
this.birthday = birthday;
this.email = email;
this.gender = gender;
this.name = name;
this.salary = salary;
}
public Monster() {
}
public Integer getMonster_id() {
return monster_id;
}
public void setMonster_id(Integer monster_id) {
this.monster_id = monster_id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Monster{" +
"monster_id=" + monster_id +
", age=" + age +
", birthday=" + birthday +
", email='" + email + '\'' +
", gender=" + gender +
", name='" + name + '\'' +
", salary=" + salary +
'}';
}
}
6、写好接口MonsterMapper
接口中定义entity的crud方法
package com.bin.mybatis.mapper;
import com.bin.mybatis.entity.Monster;
public interface MonsterMapper {
//添加方法
public void addMonster(Monster monster);
}
7、配置映射器MonsterMapper.xml
表头从官网复制,地址前边mybatis配置已经给出
注意看注释,此处细节较多
特别注意:#{x} 这里表示的是entity的属性 。 如何理解:insert语句中, 前边是数据库字段值,后边是属性值,由于传递参数需要区分开,所以有此#{}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:表示一个映射器
1. namespace="com.bin.mybatis.mapper.MonsterMapper"
说明本mapper.xml文件是用来映射管理MonsterMapper接口
,主要是去实现MonsterMapper接口声明方法
2.select:实现一个查询操作 insert:表示一个添加操作
3.id="addMonster"表示MonsterMapper接口的方法名
4.resultType="xx"返回的结果类型,如果没有就不需要写
5.parameterType="com.itbul1.mybatis.entity.Monster"表示该方法输入的参数类型
-->
<mapper namespace="com.bin.mybatis.mapper.MonsterMapper">
<insert id="addMonster" parameterType="com.bin.mybatis.entity.Monster">
INSERT INTO mybatis_monster_ (monster_id,age,birthday,email,gender,name,salary)
VALUES (#{monster_id},#{age},#{birthday},#{email},#{gender},#{name},#{salary})
</insert>
</mapper>
8、使用junit测试
注意测试方法
// 得到myBatis-config.xml,转换成一个inputStream
//通过sqlSessionFactory对象获取一个回话
//通过session获取到 monsterMapper这个接口对象
package com.bin.mybatis.test;
import com.bin.mybatis.entity.Monster;
import com.bin.mybatis.mapper.MonsterMapper;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.Date;
public class testMybatis {
private SqlSessionFactory sqlSessionFactory;
private SqlSession session;
private MonsterMapper monsterMapper;
@Before
public void init() throws Exception{
// 得到myBatis-config.xml,转换成一个inputStream
InputStream inputStream = Resources.getResourceAsStream("myBatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通过sqlSessionFactory对象获取一个回话
session = sqlSessionFactory.openSession();
//通过session获取到 monsterMapper这个接口对象
monsterMapper = session.getMapper(MonsterMapper.class);
}
@Test
public void test01() {
Monster monster = new Monster();
monster.setAge(100);
monster.setBirthday(new Date());
monster.setEmail("123@qq.com");
monster.setGender(1);
monster.setSalary(8928.00);
monster.setName("银角");
monsterMapper.addMonster(monster);
}
@After
public void destory() throws Exception{
if (session != null) {
session.commit();
session.close();
}
}
}
9、成功添加一条数据
细节说明(报错):
在此案例中,遇到了了几个异常
1、无法读取mybatis配置文件。 原因 复制粘贴表头时没有注意检查,多了点号
2、无法打开session,空指针异常。原因 换了一个配置映射文件的标签,改为扫描整个包
3、找不到映射文件 。 原因 开头已经说明。src下的xml文件构建时不会被输出到 target/classes目录下,故无法找到。