1.mybatis是什么?
开源的持久层框架。
jdbc 代码繁琐 sql 性能好
hibernate 代码简洁 不用写sql 性能不好
mybatis 代码简洁 要写sql 性能一般
2.mybatis编程步骤:
a.导包,mybatis mysqljdbc junit
b.添加mybatis配置文件
c.写实体类,实体类的属性名与表的字段名要求一致,大小写无所谓
d.写映射文件,修改配置文件,指定映射文件的位置。
e.调用SqlSession提供的方法来访问数据库。
maven 导包
mysql
mysql-connector-java
5.1.46
junit
junit
4.12
test
org.mybatis
mybatis
3.2.8
实例:对Emp表的增删改查
首先是在包entity下建立实体类Emp
package entity;
public class Emp {
private Integer id;
private String name;
private Double age;
}
省略一堆的get/set方法
在entity中建立EmpMapper.xml文件
!-- namespace 的值是 DeptMapper 接口
每个Mapper 接口对应一个配置文件 -->
id:要求唯一
resultType:返回结果的类型
parameterType:参数类型
INSERT INTO emp(name, age) VALUES(#{name},#{age})
UPDATE emp SET name=#{name}, age=#{age} WHERE id=#{id}
DELETE FROM emp WHERE id=#{id}
在resource文件夹中建立SqlMapConfig.xml文件,作为mybatis的配置文件
-- 数据库连接参数配置
测试对数据库的增删改查操作,在test文件夹中建包test,创建类TestCase,mybatis默认不自动提交,需要commit(有些数据库不支持事务)
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import entity.Emp;
public class TestCase {
private SqlSession session;
@Before
public void init() {
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
session = ssf.openSession();
}
@Test
public void test1() {
Emp emp = new Emp();
emp.setName("wolf");
emp.setAge(22.0);
session.insert("test.save", emp);
session.commit();
session.close();
}
@Test
public void test2() {
List emps = session.selectList("test.findAll");
System.out.println(emps);
session.close();
}
@Test
public void test3() {
Emp emp = session.selectOne("test.findById", 4);
System.out.println(emp);
session.close();
}
@Test
public void test4() {
Emp emp = session.selectOne("test.findById", 4);
System.out.println(emp);
emp.setName("never stop");
emp.setAge(38.0);
System.out.println(emp);
session.update("test.modify", emp);
session.commit();
session.close();
}
@Test
public void test5() {
session.delete("test.delete",7);
session.commit();
session.close();
}
}
3.mybatis的基本原理
4.返回Map类型的结果
mybatis会将查询结果先封装到一个Map对象里面(以字段名作为key,
以字段值作为vlaue),然后再将Map对象中的数据添加到实体对象里面。
在EmpMapper.xml文件中添加一段(只需要修改返回值类型即可)
!-- 返回Map类型的结果 -->
TestCase测试类中测试代码
@Test
public void test6() {
Map map = session.selectOne("test.findById2", 6);
System.out.println(map);
System.out.println(map.get("name"));
}
打印:
{name=white wolf, id=6, age=22}
white wolf
5.使用ResultMap,解决实体类的属性名与表的字段名不一致的情况。
!-- 使用ResultMap解决表的字段名与实体类的属性名不一致的情况 -->
!-- 处理表的字段名与实体类的属性名的对应关系,列出不一样的即可 -->
实体类参数
private Integer eno;
private String ename;
private Double age;
数据库表字段:id,name,age
利用Mapper映射器接口
(1)什么是Mapper映射器?
符合映射文件的接口,mybatis会自动实现一个符合该接口要求的对象。
(2)Mapper映射器的要求:
a.接口方法的名称与映射文件中的sql的id要一样。
b.方法的参数类型要与映射文件当中的parameterType一致。
c.方法的返回类型要与映射文件当中的resultType一致。
此外,映射文件的namespace必须等于Mapper映射器的权限定名。
(3)编程步骤
a.写一个映射器(即一个接口)
b.调用SqlSession提供的getMapper方法。
注:该方法会返回一个符合映射器要求的对象。
使用的还是上面的EmpMapper.xml文件
package dao;
import java.util.List;
import entity.Emp;
* Mapper映射器
public interface EmpDAO {
public void save(Emp emp);
public List findAll();
public Emp findById(int id);
public void modify(Emp emp);
public void delete(int id);
}
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import dao.EmpDAO;
import entity.Emp;
public class TestCase {
private SqlSession session;
@Before
public void init() {
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(TestCase.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
session = ssf.openSession();
}
@Test
public void test1() {
* getMapper方法返回一个符合Mapper映射器(EmpDAO)要求的对象。
* 动态代理
EmpDAO dao = session.getMapper(EmpDAO.class);
Emp emp = new Emp();
emp.setName("json");
emp.setAge(66.0);
dao.save(emp);
* 任然需要提交事务
session.commit();
session.close();
}
@Test
public void test2() {
EmpDAO dao = session.getMapper(EmpDAO.class);
List emps = dao.findAll();
System.out.println(emps);
session.close();
}
@Test
public void test3() {
EmpDAO dao = session.getMapper(EmpDAO.class);
Emp emp = dao.findById(2);
System.out.println(emp);
session.close();
}
@Test
public void test4() {
EmpDAO dao = session.getMapper(EmpDAO.class);
Emp emp = dao.findById(2);
emp.setAge(22.0);
dao.modify(emp);
session.commit();
session.close();
}
@Test
public void test5() {
EmpDAO dao = session.getMapper(EmpDAO.class);
dao.delete(8);
session.commit();
session.close();
}
}