1.mybatis是什么?
开源的持久层框架。
jdbc 代码繁琐 sql 性能好
hibernate 代码简洁 不用写sql 性能不好
mybatis 代码简洁 要写sql 性能一般
2.mybatis编程步骤:
a.导包,mybatis mysqljdbc junit
b.添加mybatis配置文件
c.写实体类,实体类的属性名与表的字段名要求一致,大小写无所谓
d.写映射文件,修改配置文件,指定映射文件的位置。
e.调用SqlSession提供的方法来访问数据库。
maven 导包
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
</dependencies>
实例:对Emp表的增删改查
首先是在包entity下建立实体类Emp
package entity;
public class Emp {
private Integer id;
private String name;
private Double age;
}
省略一堆的get/set方法
在entity中建立EmpMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
!-- namespace 的值是 DeptMapper 接口
每个Mapper 接口对应一个配置文件 -->
<mapper namespace="test">
id:要求唯一
resultType:返回结果的类型
parameterType:参数类型
<insert id="save" parameterType="entity.Emp">
INSERT INTO emp(name, age) VALUES(#{name},#{age})
</insert>
<select id="findAll" resultType="entity.Emp">
SELECT * FROM emp
</select>
<select id="findById" parameterType="int" resultType="entity.Emp">
SELECT * FROM emp WHERE id=#{id}
</select>
<update id="modify" parameterType="entity.Emp">
UPDATE emp SET name=#{name}, age=#{age} WHERE id=#{id}
</update>
<delete id="delete" parameterType="int">
DELETE FROM emp WHERE id=#{id}
</delete>
</mapper>
在resource文件夹中建立SqlMapConfig.xml文件,作为mybatis的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
-- 数据库连接参数配置
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 映射文件的位置,对应上面的-->
<mappers>
<mapper resource="entity/EmpMapper.xml" />
</mappers>
</configuration>
测试对数据库的增删改查操作,在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<Emp> 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的基本原理
mybatis基本原理.png4.返回Map类型的结果
mybatis会将查询结果先封装到一个Map对象里面(以字段名作为key,
以字段值作为vlaue),然后再将Map对象中的数据添加到实体对象里面。
在EmpMapper.xml文件中添加一段(只需要修改返回值类型即可)
!-- 返回Map类型的结果 -->
<select id="findById2" parameterType="int" resultType="map">
SELECT * FROM emp WHERE id=#{id}
</select>
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解决表的字段名与实体类的属性名不一致的情况 -->
<select id="findById3" parameterType="int" resultMap="emp2Map">
SELECT * FROM emp WHERE id=#{id}
</select>
!-- 处理表的字段名与实体类的属性名的对应关系,列出不一样的即可 -->
<resultMap type="entity.Emp2" id="emp2Map">
<result property="eno" column="id"></result>
<result property="ename" column="name"></result>
</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<Emp> 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<Emp> 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();
}
}
网友评论