一、Mybatis框架简介:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、 存储过程以及高级映射。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使
用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary
Java Object,普通的 Java 对象)映射成数据库中的记录。
也就是说MyBatis 是一个半自动 ORM 框架,其本质是对 JDBC 的封装。使用 MyBatis
重点需要程序员编写 SQL 命令,不需要写一行 JDBC 代码。
1.1Mybatis优缺点
优点:
1、简单易学,容易上手(相比于 Hibernate)基于SQL编程。
2、消除了JDBC大量冗余的代码,不需要手动开关连接。
3、很好的与各种数据库兼容(因为 MyBatis 使用JDBC来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持,而JDB提 供了可扩展性,所以只要这个数据库有针对Java的jar包就可以就可以与 MyBatis 兼容),开发人员不需要考虑数据库的差异性。
4、提供了很多第三方插件(分页插件 / 逆向工程)。5、能够与Spring很好的集成。
6、如果使用映射文件的话,可以让代码和配置文件完全分离。只要方法的定义没有改变,那么只需要修改配置文件就可以达到修改的目的。
缺点:
SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
1..2 Mybatis的工作原理
Mybatis的工作原理如上图,需要首先创建一个Mybatis的全局配置文件mybatis-config.xml(名称不固定,可以随便起),其次是多个mapper.xml配置文件用来书写sql语句,为了能够使用这些配置文件,我们需要通过SqlSessionFactory创建一个SqlSession对象(这个对象是Mybatis的核心对象,CRUD都是通过该对象进行调用),后通过executor底层执行器执行sql语句,得到结果集返回。
二、mybatis书写步骤:
2.1.创建测试的数据库
2.1.1自行添加数据,这是我的数据
3.创建一个Java项目并导入mybatis框架的jar包
4.创建跟表对应的实体类。
5.创建针对表操作的接口类。
6.创建对应的sql映射配置文件com.su.dao.EmpDaoMapper.xml
在dao接口的同目录下创建跟接口名字一样的配置文件。
8.在测试类中进行测试
三、MyBatis框架入门实现全查,添加,删除,修改,模糊查询
具体步骤如上介绍
实现代码如下:
3.1.实体类bean包中的Emp(emp:对应数据库的名字)
package com.su.bean;
public class Emp {
private Integer eid;
private String ename;
private String dept;
private String jop;
private Integer sal;
private String phone;
private String address;
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getJop() {
return jop;
}
public void setJop(String jop) {
this.jop = jop;
}
public Integer getSal() {
return sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "emp{" +
"eid=" + eid +
", ename='" + ename + '\'' +
", dept='" + dept + '\'' +
", jop='" + jop + '\'' +
", sal=" + sal +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
3.2.dao包中的EmpDao接口(全查,添加,删除,修改,模糊查询)
package com.su.dao;
import com.su.bean.Emp;
import java.util.List;
public interface EmpDao {
// 全查
List<Emp>selectAll();
// 单查(根据员工id查)
Emp selectByeid(int eid);
// 添加
int add(Emp emp);
// 修改
int update(Emp emp);
// 删除
int delete(int eid);
// 模糊查询
List<Emp>seach(String keyword);
}
3.3.在接口的包中创建对应的mapper映射配置文件及(全查,添加,删除,修改,模糊查询的sql语句)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.su.dao.EmpDao">
<!-- 全查 -->
<select id="selectAll" resultType="com.su.bean.Emp">
select * from emp;
</select>
<!-- 添加 -->
<insert id="add" parameterType="com.su.bean.Emp">
insert into emp(ename,dept,jop,sal,phone,address) values (#{ename},#{dept},#{jop},#{sal},#{phone},#{address});
</insert>
<!-- 删除 -->
<delete id="delete" parameterType="int">
delete from emp where eid=#{eid};
</delete>
<!-- 单查 -->
<select id="selectByeid" parameterType="int" resultType="com.su.bean.Emp">
select * from emp where eid=#{eid};
</select>
<!-- 修改 -->
<update id="update" parameterType="com.su.bean.Emp">
update emp set ename=#{ename},dept=#{dept},jop=#{jop},sal=#{sal},phone=#{phone},address=#{address} where eid=#{eid};
</update>
<!--模糊查询 -->
<select id="seach" parameterType="String" resultType="com.su.bean.Emp">
select * from emp where ename like concat('%',#{keyword},'%')
</select>
</mapper>
3.4.在src目录中创建mybatis框架的核心配置文件
<?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="mysql">
<environment id="mysql">
<transactionManager type="jdbc"></transactionManager>
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment >
<environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
<!--加载mapper配置文件-->
<mappers>
<mapper class="com.su.dao.EmpDao" />
</mappers>
</configuration>
3.5.测试类test代码
package com.su.test;
import com.su.bean.Emp;
import com.su.dao.EmpDao;
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.IOException;
import java.io.InputStream;
import java.util.List;
public class EmpTest {
InputStream stream =null;
SqlSessionFactoryBuilder builder =null;
SqlSessionFactory factory =null;
SqlSession sqlSession =null;
EmpDao empDao =null;
@Before
public void init() throws IOException {
//1.加载核心配置文件的字节输入流
stream = Resources.getResourceAsStream("mybatis03.xml");
//2.创建SqlSessionFactory的构建对象--框架使用的是构建者模式
builder = new SqlSessionFactoryBuilder();
//3.通过构建对象加载配置文件的输入流获取SqlSessionFactory
factory = builder.build(stream);
//4.通过工厂对象获取SqlSession对象----执行JDBC操作的
sqlSession = factory.openSession();
//5.通过SqlSession对象获取接口对应的代理对象
empDao = sqlSession.getMapper(EmpDao.class);
}
// 全查
@Test
public void testSelectAll(){
List<Emp> empList = empDao.selectAll();
//7.遍历集合
for (Emp emp : empList) {
System.out.println(emp);
}
}
// 添加
@Test
public void testAdd() {
Emp emp = new Emp();
emp.setEname("mybatis03");
emp.setDept("123");
emp.setJop("1234567");
emp.setSal(122);
emp.setPhone("123456789");
emp.setAddress("河南");
int n = empDao.add(emp);
if (n > 0) {
System.out.println("添加成功!");
}
}
// 删除
@Test
public void testDelete(){
int n=empDao.delete(1);
if (n>0){
System.out.println("删除成功!");
}
}
// 单查
@Test
public void testSelectByUid(){
Emp emp = empDao.selectByeid(2);
System.out.println(emp);
}
// 修改
@Test
public void testUpdate() {
//1.数据库回显
Emp oldemp = empDao.selectByeid(3);
System.out.println("修改前" + oldemp);
//2.根据需要修改字段值
oldemp.setEname("李四");
oldemp.setAddress("河南");
//3.执行数据库更新
empDao.update(oldemp);
//4.再次查询
Emp newemp =empDao.selectByeid(3);
System.out.println("修改后" + newemp);
}
// 模糊查询
@Test
public void testSeach(){
List<Emp> empList=empDao.seach("张");
for(Emp emp:empList){
System.out.println(emp);
}
}
//@After:后置通知
@After
public void distroy() throws IOException {
sqlSession.commit();
sqlSession.close();
stream.close();
}
}
3.6.运行展示
全查的运行效果
添加的运行效果
单查的运行效果
修改的运行效果
模糊查询的运行效果
删除的运行效果