(2)前身是ibatis,在ibatis3.x时,更名为MyBatis
(3)MyBatis 在java和sql之间提供更灵活的映射方案
(4)MyBatis将sql语句和方法实现,直接写到xml文件中,实现和java程序解耦
(5)mybatis 只负责sql,建库建表的工作由程序员完成
这里注意配置末尾的resorce配置,否则会找不到映射文件
maven项目中有一个目录标准,除了标准的resources目录外,src下的xml文件构建时不会被输出到target/classes目录下,故可以将xml文件移至resources目录下(方法一),或者将src下的xml文件也添加成资源(resource),使构建时也会输出到target/classes目录下(方法二)。
4.0.0
org.example
myBatisHello
1.0-SNAPSHOT
8
8
UTF-8
org.mybatis
mybatis
3.5.15
org.ow2.asm
asm
7.1
cglib
cglib
3.3.0
ch.qos.reload4j
reload4j
1.2.25
commons-logging
commons-logging
1.3.0
ognl
ognl
3.4.2
org.apache.logging.log4j
log4j-api
2.22.0
org.apache.logging.log4j
log4j-core
2.17.1
log4j
log4j
1.2.17
org.javassist
javassist
3.29.2-GA
org.slf4j
slf4j-api
2.0.9
mysql
mysql-connector-java
8.0.28
com.mchange
c3p0
0.9.5.5
com.mchange
mchange-commons-java
0.2.9
org.mybatis.caches
mybatis-ehcache
1.2.3
net.sf.ehcache
ehcache-core
2.6.11
src/main/resources
src/main/java
**/*.xml
true
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 '[email protected]',
`gender` TINYINT unsigned not null default 1,
`name` varchar(255) not null default '',
`salary` double not null default 0.0
)charset=utf8 engine=InnoDB;
注意会使用这个log4j的模版即可(模板来自网络,log4j2是新版,log4j已停止维护,log4j目前还不太懂,先不做深究),不需要记住。
以后会修改就行了,不用管太多,告诉你这么用,你就这么用就可以了。
mybatis官网mybatis – MyBatis 3 | 配置https://mybatis.org/mybatis-3/zh_CN/configuration.html
从官网文档中复制xml文件的表头,修改即可。 (注意复制粘贴可能会有错误,比如多余的空格,点号,都会导致读取配置文件失败)
//这就是一个普通的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 +
'}';
}
}
接口中定义entity的crud方法
package com.bin.mybatis.mapper;
import com.bin.mybatis.entity.Monster;
public interface MonsterMapper {
//添加方法
public void addMonster(Monster monster);
}
表头从官网复制,地址前边mybatis配置已经给出
注意看注释,此处细节较多
特别注意:#{x} 这里表示的是entity的属性 。 如何理解:insert语句中, 前边是数据库字段值,后边是属性值,由于传递参数需要区分开,所以有此#{}
INSERT INTO mybatis_monster_ (monster_id,age,birthday,email,gender,name,salary)
VALUES (#{monster_id},#{age},#{birthday},#{email},#{gender},#{name},#{salary})
注意测试方法
// 得到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("[email protected]");
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();
}
}
}
在此案例中,遇到了了几个异常
1、无法读取mybatis配置文件。 原因 复制粘贴表头时没有注意检查,多了点号
2、无法打开session,空指针异常。原因 换了一个配置映射文件的标签,改为扫描整个包
3、找不到映射文件 。 原因 开头已经说明。src下的xml文件构建时不会被输出到 target/classes目录下,故无法找到。