MyBatis
MyBatis是一种Java持久化框架,它可以将SQL查询和结果映射到Java对象中,从而实现Java对象与关系型数据库的映射。使用MyBatis可以避免手写JDBC代码,简化数据访问层的开发。
MyBatis最初是由Apache软件基金会下的iBATIS项目发展而来的。后来,iBATIS更名为MyBatis,并于2010年成为一个独立的开源项目,现在由MyBatis团队维护和开发。
MyBatis提供了许多高级特性,包括动态SQL,缓存机制,延迟加载等等。它也支持多种数据源,包括关系型数据库和NoSQL数据库等。 MyBatis被广泛应用于Java项目中,是Java持久化框架中的一员,并被认为是一个简单易用的ORM框架。
使用MyBatis框架的主要原因:
简化开发:MyBatis可以大大简化数据访问层(DAO)的开发,避免了手写JDBC代码的繁琐,同时也减少了出错的可能性。
灵活性:MyBatis提供了许多高级特性,包括动态SQL、缓存机制、延迟加载等等。它允许开发人员根据具体的需求进行自定义配置,从而使得开发过程更加灵活。
易于维护:MyBatis的数据访问层代码通常比较简洁明了,易于阅读和维护。同时,MyBatis也提供了一些工具来简化开发、调试和测试的过程,如MyBatis Generator等。
性能优越:MyBatis的SQL语句是预编译的,可以提高数据库的执行效率。同时,MyBatis也支持缓存机制,可以避免频繁的数据库访问,提高应用程序的性能。
多数据源支持:MyBatis支持多种数据源,包括关系型数据库和NoSQL数据库等。这使得开发人员可以更加方便地切换不同的数据源,同时也降低了应用程序的耦合性。
MyBatis入门案例:
创建数据库:
use mydb;
create table emp
(
eid int primary key AUTO_INCREMENT,
ename varchar(20),
dept varchar(20),
job varchar(20),
sal double,
phone varchar(11),
address varchar(100)
);
insert into emp(ename,dept,job,sal,phone,address) values('张翠萍','测试部','测试工程
师',5800,'15821563548','郑州');
insert into emp(ename,dept,job,sal,phone,address) values('李耀菲','测试部','测试经
理',9800,'13658942168','许昌');
insert into emp(ename,dept,job,sal,phone,address) values('王长林','研发部','开发工程
师',8800,'13954865721','南阳');
insert into emp(ename,dept,job,sal,phone,address) values('陈清泰','研发部','开发经
理',14900,'13785463249','洛阳');
insert into emp(ename,dept,job,sal,phone,address) values('赵德保','运维部','运维工程
师',5200,'15785642139','信阳');
insert into emp(ename,dept,job,sal,phone,address) values('刘瑞琳','运维部','产品经
理',12600,'17956248563','商丘');
select * from emp;
运行结果:
使用IDEA创建一个项目,大概部署成这样:
具体部署如图所示:
接下来写代码:
先写实体类,代码如下:
package com.du.bean;
public class Emp {
private Integer eid;
private String ename;
private String dept;
private String job;
private Double 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 getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Double getSal() {
return sal;
}
public void setSal(Double 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 + '\'' +
", job='" + job + '\'' +
", sal=" + sal +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
再写接口,代码如下:
package com.du.dao;
import com.du.bean.Emp;
import java.util.List;
public interface EmpDao {
List<Emp> selectAll();
Emp selectByid(int eid);
List<Emp> seach(String keyword);
int addEmp(Emp emp);
int delEmp(int eid);
int updEmp(Emp emp);
}
在和接口同一个包里创建mapper文件,代码如下:
<?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">
<!--namespace是映射的dao接口-->
<mapper namespace="com.du.dao.EmpDao">
<!--通过select标签进行查询
id:映射接口的方法名
parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可)
resultType:指定返回值的类型
-->
<select id="selectAll" resultType="com.du.bean.Emp">
select * from emp;
</select>
<select id="selectByid" parameterType="int" resultType="com.du.bean.Emp">
select * from emp where eid = #{eid}
</select>
<select id="seach" parameterType="String" resultType="com.du.bean.Emp">
select * from emp where ename like concat('%',#{keyword},'%')
</select>
<insert id="addEmp" parameterType="com.du.bean.Emp">
insert into emp(ename,dept,job,sal,phone,address) values(#{ename},#{dept},#{job},#{sal},#{phone},#{address});
</insert>
<delete id="delEmp" parameterType="int">
delete from emp where eid = #{eid}
</delete>
<update id="updEmp" parameterType="com.du.bean.Emp">
update emp set ename = #{ename},dept = #{dept},job = #{job},sal = #{sal},phone = #{phone},address = #{address} where eid = #{eid}
</update>
</mapper>
然后配置核心文件,代码如下:
<?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>
<!--配置环境信息===就是配置连接数据库的参数
default:指定配置的环境信息的id,表示默认连接该环境
-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务的处理方式:模式使用JDBC的事务处理-->
<transactionManager type="jdbc"></transactionManager>
<!--数据源的默认type设置为pooled,表示使用连接池-->
<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.du.dao.EmpDao" />
</mappers>
</configuration>
最后测试一下,代码如下:
package com.du.test;
import com.du.bean.Emp;
import com.du.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 {
System.out.println("Before");
//1.加载核心配置文件的字节输入流
stream = Resources.getResourceAsStream("SqlMapConfig.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() {
//6.通过代理对象执行查询方法
List<Emp> empList = empDao.selectAll();
//7.遍历集合
for (Emp emp : empList) {
System.out.println(emp);
}
}
@Test
public void testSelectByid() {
Emp emp = empDao.selectByid(1);
System.out.println(emp);
}
@Test
public void testSeach() {
//6.通过代理对象执行查询方法
List<Emp> empList = empDao.seach("七");
//7.遍历集合
for (Emp emp : empList) {
System.out.println(emp);
}
}
@Test
public void testAdd() {
Emp emp = new Emp();
emp.setEname("柳七");
emp.setDept("研发部");
emp.setJob("开发工程师");
emp.setSal(9200.0);
emp.setPhone("12346535475");
emp.setAddress("徐州");
int n = empDao.addEmp(emp);
if (n>0){
System.out.println("add success");
}
}
@Test
public void testDelete(){
int n = empDao.delEmp(4);
if (n>0){
System.out.println("delete success");
}
}
@Test
public void testUpdate(){
Emp oldEmp = empDao.selectByid(6);
System.out.println("修改前"+oldEmp);
oldEmp.setEname("刘瑞林");
oldEmp.setAddress("徽州");
empDao.updEmp(oldEmp);
Emp newemp = empDao.selectByid(6);
System.out.println("修改后"+newemp);
}
@After
public void distroy() throws IOException {
System.out.println("After");
//资源的释放
sqlSession.commit();
stream.close();
sqlSession.close();
}
}
运行效果如图所示:
全查(已运行过,所以“eid为4”已删除)
根据id查询
模糊查询
添加
删除
修改