Mybatis主要是对代码进行少写,分别加入核心配置文件和mapper映射文件,
核心配置文件主要是为了连接数据库,mapper映射文件是为了编写sql语句
1.如何配置mybatis
①先创建一个moudle
②然后配置jar包
③然后进行mybatis的分层
bean包:主要是进行一些实体类
dao包:主要是进行构建接口和编写sql语句
test包:主要是进行sql语句的测试
④在bean包中创建实体类
Emp:
public class Emp {private Integer eid;private String ename;private String job;private double sal;private String phone;private String address;//一对一关系的定义:把外键的did 定义为相关联的 对象private Dept dept;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 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;}public Dept getDept() {return dept;}public void setDept(Dept dept) {this.dept = dept;}@Overridepublic String toString() {return "Emp{" +"eid=" + eid +", ename='" + ename + '\'' +", job='" + job + '\'' +", sal=" + sal +", phone='" + phone + '\'' +", address='" + address + '\'' +", dept=" + dept +'}';}
}
⑤在dao包中创建mapper映射文件和接口
EmpDao接口:
public interface EmpDao {}
EmpDao.xml mapper映射文件
⑥src中创建核心配置文件和jdbc.properties
mybatis.xml:
jdbc.properties:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.user=root
jdbc.password=root
mapper.dao=com.qi.dao
创建jdbc.properties是为了在更换数据库时少改代码
log4j是为了配置日志输出
⑦在测试包里创建测试类
Emptest:
public class EmpTest {InputStream stream = null;SqlSessionFactoryBuilder builder = null;SqlSessionFactory factory = null;SqlSession sqlSession = null;EmpDao empDao= null;@Beforepublic void init() throws IOException {stream = Resources.getResourceAsStream("mybatis.xml");builder = new SqlSessionFactoryBuilder();factory = builder.build(stream);sqlSession = factory.openSession();empDao = sqlSession.getMapper(EmpDao.class);}@Afterpublic void destory() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}
配置连接核心文件
①mybatis的增加
在接口中创建增加方法
int addEmp(Emp emp);
然后在mapper映射文件里编写sql语句
insert into emp(ename,job,sal,phone,address,did) values(#{ename},#{job},#{sal},#{phone},#{address},#{did});
然后进行测试
@Testpublic void testaddEmp(){Emp emp=new Emp();emp.setEname("ds");emp.setJob("sdfss");emp.setSal(200);emp.setPhone("213");emp.setAddress("sfsdf");int n = empDao.addEmp(emp);if (n>0){System.out.println("添加成功");}}
结果如下:
②mybatis的删除
在接口中创建删除方法
int delEmp(int eid);
然后在mapper映射文件里编写sql语句
delete from emp where eid=#{eid};
然后进行测试
@Testpublic void testdeleteEmp(){int n = empDao.delEmp(9);if (n>0){System.out.println("删除成功");}}
结果如下:
③mybatis的修改
在接口中创建修改方法
int reviseEmp(Emp emp);
然后在mapper映射文件里编写sql语句
update emp set ename=#{ename},job=#{job},sal=#{sal},phone=#{phone},address=#{address},did=#{did} where eid=#{eid};
然后进行测试
@Testpublic void testreviseEmp(){Emp oldemp = empDao.selectById(3);System.out.println("修改前:"+oldemp);oldemp.setEname("sdf");oldemp.setJob("sfs");empDao.reviseEmp(oldemp);Emp newemp=empDao.selectById(3);System.out.println("修改后:"+newemp);}
测试结果如下:
④mybatis的查询
在接口中创建查询方法
List selectAll();
然后在mapper映射文件里编写sql语句
然后进行测试
@Testpublic void testSelectAll(){List emps = empDao.selectAll();for (Emp emp : emps) {System.out.println(emp);}}
结果如下:
1.一对一查询
在bean包中创建实体类Dept
public class Dept {private Integer did;private String dname;private String dinfo;public Integer getDid() {return did;}public void setDid(Integer did) {this.did = did;}public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}public String getDinfo() {return dinfo;}public void setDinfo(String dinfo) {this.dinfo = dinfo;}@Overridepublic String toString() {return "Dept{" +"did=" + did +", dname='" + dname + '\'' +", dinfo='" + dinfo + '\'' +'}';}
}
然后创建接口DeptDao
实现根据id查询的接口
public interface DeptDao {Dept selectById(int did);
}
编写sql语句
创建查询id的接口
public interface EmpDao {Emp selectByEid(int eid);}
然后在EmpTest中进行测试
public class EmpTest {InputStream stream = null;SqlSessionFactoryBuilder builder = null;SqlSessionFactory factory = null;SqlSession sqlSession = null;EmpDao empDao= null;@Beforepublic void init() throws IOException {stream = Resources.getResourceAsStream("mybatis.xml");builder = new SqlSessionFactoryBuilder();factory = builder.build(stream);sqlSession = factory.openSession();empDao = sqlSession.getMapper(EmpDao.class);}@Testpublic void testSelectByeid(){Emp emp=empDao.selectByEid(2);System.out.println(emp);}@Afterpublic void destory() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}
测试结果如下
2.一对多
一对多是在Dept中创建emps集合,然后把查询的员工信息全储存到集合中
在Dept中创建集合
public class Dept {private Integer did;private String dname;private String dinfo;//一个部门包含多个员工,一对多关系就是定义集合List emps;public List getEmps() {return emps;}public void setEmps(List emps) {this.emps = emps;}public Integer getDid() {return did;}public void setDid(Integer did) {this.did = did;}public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}public String getDinfo() {return dinfo;}public void setDinfo(String dinfo) {this.dinfo = dinfo;}@Overridepublic String toString() {return "Dept{" +"did=" + did +", dname='" + dname + '\'' +", dinfo='" + dinfo + '\'' +", emps=" + emps +'}';}
}
Emp中实体类去掉dept对象
package com.qi.bean;public class Emp {private Integer eid;private String ename;private String job;private double sal;private String phone;private String address;private Integer did;public Integer getDid() {return did;}public void setDid(Integer did) {this.did = did;}
//一对一关系的定义:把外键的did 定义为相关联的 对象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 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;}@Overridepublic String toString() {return "Emp{" +"eid=" + eid +", ename='" + ename + '\'' +", job='" + job + '\'' +", sal=" + sal +", phone='" + phone + '\'' +", address='" + address + '\'' +", did=" + did +'}';}
}
然后根据did一对多查询
在Dept接口中创建selectById方法
public interface DeptDao {Dept selectById(int did);
}
然后编写SQL语句
然后手动实现查询把查询的Dept中的值赋值给emps集合中
根据EmpDao中的did查询进行两表查询
public interface EmpDao {Emp selectByDid(int did);
}
然后编写SQL语句
然后在DeptTest中进行两表联查的测试
public class DeptTest {InputStream stream = null;SqlSessionFactoryBuilder builder = null;SqlSessionFactory factory = null;SqlSession sqlSession = null;DeptDao deptDao= null;@Beforepublic void init() throws IOException {stream = Resources.getResourceAsStream("mybatis.xml");builder = new SqlSessionFactoryBuilder();factory = builder.build(stream);sqlSession = factory.openSession();deptDao = sqlSession.getMapper(DeptDao.class);}@Testpublic void testSelectByDid(){Dept dept = deptDao.selectById(101);System.out.println(dept);}@Afterpublic void destory() throws IOException {sqlSession.commit();sqlSession.close();stream.close();}
}
结果如下: