用Mybatis简单实现数据库的增删改查
目录:
- 整体代码
- 检索所有的职工姓名和年薪
- 检索所有的工作和相应的部门编号
- 检索工作是salesman的员工姓名
- 检索员工津贴comm为null或comm小于300的员工姓名和津贴值
- 检索所有职员的姓名和所在部门名称
- 检索在任何位置有字母‘A’的员工姓名
- 用你的账户创建两个表ddept,eemp,分别与dept和emp格式相同,包括属性、数据类型
- 向表ddept中插入至少5条记录
- 从eemp中删除名为“SMITH”的记录
整体代码
mybatis-config.xml:
<?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="development">
<environment id="development">
<!-- 环境变量-->
<transactionManager type="JDBC"/>
<!-- mysql8版本-->
<dataSource type="POOLED">
<!-- 数据源-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/example"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<!-- 属性-->
</dataSource>
</environment>
</environments>
<!-- 设置映射文件的路径-->
<mappers>
<mapper resource="org/example/mapper/EmployeeMapper.xml"/>
<!-- 映射器-->
</mappers>
</configuration>
EmployeeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.EmployeeMapper"><!--Mapper接口全限定名-->
<!-- <select id="selectAll" resultType="org.example.pojo.Employee">-->
<!-- <!–这里表示标志,id是这条sql语句的标志,com.example.App是左边main目录的App类-->
<!-- 它表示接收这个sql查询到的数据的类–>-->
<!-- select * from eemp;-->
<!-- </select>-->
<resultMap id="EmployeeResultMap" type="org.example.pojo.Employee">
</resultMap>
<select id="selectByName" resultMap="EmployeeResultMap">
select * from emp where ename= #{ename};
</select>
<select id="selectByJob" resultMap="EmployeeResultMap">
select * from emp where job= #{job};
</select>
<select id="selectByComm" resultMap="EmployeeResultMap">
select * from emp where comm is null or comm
<![CDATA[
<
]]>
#{comm};
</select>
<resultMap id="EmpDeptMap" type="org.example.pojo.Employee">
<id property="empno" column="empno"/>
<result property="ename" column="ename"/>
<result property="comm" column="comm"/>
<result property="job" column="job"/>
<result property="mgr" column="mgr"/>
<result property="hiredate" column="hiredate"/>
<result property="sal" column="sal"/>
<result property="deptno" column="deptno"/>
<association property="deptment">
<result column="deptno" property="deptno"/>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
</association>
</resultMap>
<select id="selectAllWithDeptment" resultMap="EmpDeptMap">
select * from dept inner join emp on emp.deptno=dept.deptno;
</select>
<select id="selectAllLikeName" resultMap="EmployeeResultMap">
select * from emp where ename like #{lname};
</select>
<update id="CreateTable">
Create table ${newTable} as select * from ${originTable} where 1=2;
</update>
<insert id="InsertDept">
insert into ddept values (#{deptno},#{dname},#{loc});
</insert>
<resultMap id="DeptMap" type="org.example.pojo.Deptment">
</resultMap>
<select id="SelectAllDeptments" resultMap="DeptMap">
select * from ddept;
</select>
<delete id="DeleteEmployee">
delete from emp where ename = #{ename};
</delete>
</mapper>
text01.java
package org.example.test;
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.example.mapper.EmployeeMapper;
import java.io.IOException;
import java.io.InputStream;
public class test01 {
public static void main(String[] args) {
//加载mybatis的核心配置文件,获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream=null;
try{
inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取session对象,执行sql语句
SqlSession sqlSession=sqlSessionFactory.openSession();
//执行sql语句
EmployeeMapper employeeMapper=sqlSession.getMapper(EmployeeMapper.class);
// List<Employee> employees=employeeMapper.selectAll();
// for (Employee emp:employees) {
// System.out.println(emp);
// }
// Integer empno=2;
// Employee employee=employeeMapper.selectById(empno);
// System.out.println(employee);
//简单实现数据库的增删改查
//1.select ename,sal from emp;
// List<Employee> employees=employeeMapper.selectAll();
// for (Employee emp:employees) {
// System.out.println(emp.getEname()+" "+emp.getSal());
// }
//2.select job,deptno from emp;
// List<Employee> employees=employeeMapper.selectAll();
// for (Employee emp:employees) {
// System.out.println(emp.getJob()+" "+emp.getDeptno());
// }
//
//3.select * from emp where job="salsman";
// List<Employee> employees=employeeMapper.selectByJob("salesman");
// for (Employee emp:employees) {
// System.out.println(emp.getEname());
// }
//4.select * from emp where comm is null or comm<300;
// List<Employee> employees=employeeMapper.selectByComm(300);
// for (Employee emp:employees) {
// System.out.println(emp.getEname()+" "+ emp.getComm());
// }
//5.select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;
// List<Employee> employees=employeeMapper.selectAllWithDeptment();
// for(Employee e:employees){
// System.out.println(e.getEname()+" "+e.getDeptment().getDname());
// }
//6.select ename from emp where ename like "%A%"
// String lname="%A%";
// List<Employee> employees=employeeMapper.selectAllLikeName(lname);
// for(Employee e:employees){
// System.out.println(e.getEname());
// }
//7.CreateTable
// employeeMapper.CreateTable("ddept","dept");
// employeeMapper.CreateTable("eemp","emp");
//8.insert
// List<Deptment>deptments=new ArrayList<>();
// Deptment d1=new Deptment(1,"Factory","China");
// Deptment d2=new Deptment(2,"Game","Japan");
// Deptment d3=new Deptment(3,"Anime","Japan");
// Deptment d4=new Deptment(4,"Association","USA");
// Deptment d5=new Deptment(5,"Trips","China");
// deptments.add(d1);
// deptments.add(d2);
// deptments.add(d3);
// deptments.add(d4);
// deptments.add(d5);
//
// for(Deptment d:deptments){
// employeeMapper.InsertDept(d);
// }
//
// sqlSession.commit();//提交
// List<Deptment>depts=employeeMapper.SelectAllDeptments();
// for(Deptment d:depts){
// System.out.println(d);
// }
//9.delete
// employeeMapper.DeleteEmployee("Smith");
// Employee e = employeeMapper.selectByName("Smith");
// System.out.println(e);
//4.关闭sql
sqlSession.close();
}catch(IOException e){
throw new RuntimeException(e);
}
}
}
Employee.java
package org.example.pojo;
public class Employee {
private int empno;
private String ename;
private String job;
private int mgr;
private String hiredate;
private double sal;
private double comm;
private int deptno;
//外部属性
private Deptment deptment;
public Deptment getDeptment() {
return deptment;
}
public void setDeptment(Deptment deptment) {
this.deptment = deptment;
}
public Employee() {
}
public Employee(int empno, String ename, String job,int mgr, String hiredate, double salary, double comm, int deptno) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr=mgr;
this.hiredate = hiredate;
this.sal = salary;
this.comm = comm;
this.deptno = deptno;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public int getEmpno() {
return empno;
}
public String getEname() {
return ename;
}
public String getJob() {
return job;
}
public String getHiredate() {
return hiredate;
}
public double getSal() {
return sal;
}
public double getComm() {
return comm;
}
public int getDeptno() {
return deptno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setJob(String job) {
this.job = job;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public void setSal(double sal) {
this.sal = sal;
}
public void setComm(double comm) {
this.comm = comm;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
@Override
public String toString() {
return empno+" "+ename+" "+job+" "+hiredate+" "+ sal +" "+comm+" "+deptno;
}
}
Department.java
package org.example.pojo;
public class Deptment {
private Integer deptno;
private String dname;
private String loc;
public Deptment(Integer deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public Integer getDeptno() {
return deptno;
}
public String getDname() {
return dname;
}
public String getLoc() {
return loc;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Deptment{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
}
EmployeeMapper.java
package org.example.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.example.pojo.Deptment;
import org.example.pojo.Employee;
import java.util.List;
public interface EmployeeMapper {
@Select("select * from emp")
public List<Employee> selectAll();
@Select("select * from emp where empno = #{empno}")
public Employee selectById(Integer empno);
public Employee selectByName(String ename);
public List<Employee> selectByJob(String job);
public List<Employee>selectByComm(double comm);
public List<Employee>selectAllWithDeptment();
public void CreateTable(@Param("newTable") String newTable,@Param("originTable") String originTable);
public void InsertDept(Deptment deptment);
public List<Deptment> SelectAllDeptments();
public void DeleteEmployee(String ename);
}
-
检索所有的职工姓名和年薪
test类:List<Employee> employees=employeeMapper.selectAll(); for (Employee emp:employees) { System.out.println(emp.getEname()+" "+emp.getSal()); }
EmployeeMapper接口:
@Select("select * from emp") public List<Employee> selectAll();
结果截图:
思路:
检索所有的职工的姓名和年薪,我们可以有两种方法
第一种是新建一个类,这个类专门存放职工的姓名和年薪,然后通过这个类来检索到所有的职工的姓名和年薪。
第二种方法是利用建立好的Employee类来检索,检索所有的Employee,然后遍历每一个Employee,输出它的姓名和年薪。
这两种方法都符合开发规范,第二种比第一种来说相对简便,因此我选择了第二种方法。
-
检索所有的工作和相应的部门编号
test类:
List<Employee> employees=employeeMapper.selectAll(); for (Employee emp:employees) { System.out.println(emp.getJob()+" "+emp.getDeptno()); }
EmployeeMapper接口:
@Select("select * from emp") public List<Employee> selectAll();
结果截图:
思路:
思路与第一个是一样的,先检索所有的Employee对象,然后输出每个对象对应需要的字段值即可。
-
检索工作是salesman的员工姓名
test类:
List<Employee> employees=employeeMapper.selectByJob("salesman"); for (Employee emp:employees) { System.out.println(emp.getEname()); }
EmployeeMapper接口:
public List<Employee> selectByJob(String job);
EmployeeMapper.xml映射文件:
<select id="selectByJob" resultMap="EmployeeResultMap"> select * from emp where job= #{job}; </select>
结果截图:
思路:
这里是通过名字去查找符合条件的Employee的姓名,同样我们可以先通过名字去查找所有符合条件的Employee对象,然后对每个对象取出他的名字。
-
检索员工津贴comm为null或comm小于300的员工姓名和津贴值
test类:
List<Employee> employees=employeeMapper.selectByComm(300); for (Employee emp:employees) { System.out.println(emp.getEname()+" "+ emp.getComm()); }
EmployeeMapper接口:
public List<Employee>selectByComm(double comm);
EmployeeMapper.xml映射文件:
<select id="selectByComm" resultMap="EmployeeResultMap"> select * from emp where comm is null or comm <![CDATA[ < ]]> #{comm}; </select>
结果截图:
思路:
通过double变量来检索满足条件的所有Employee对象,然后输出他的姓名和comm字段值。
注意:
在.xml文件中,小于号‘<’是含有特殊含义的,不允许输入。我们可以采用以下方法:
1.使用转义字符 <
2.加入CDATA区域,即将判断条件放到一个<![CDATA[ ]]>声明中(在IDEA环境下,我们输入CD就可以直接写出<![CDATA[ ]]>了)
-
检索所有职员的姓名和所在部门名称
test类:
List<Employee> employees=employeeMapper.selectAllWithDeptment(); for(Employee e:employees){ System.out.println(e.getEname()+" "+e.getDeptment().getDname()); }
EmployeeMapper接口:
public List<Employee>selectAllWithDeptment();
EmployeeMapper.xml映射文件:
<resultMap id="EmpDeptMap" type="org.example.pojo.Employee"> <id property="empno" column="empno"/> <result property="ename" column="ename"/> <result property="comm" column="comm"/> <result property="job" column="job"/> <result property="mgr" column="mgr"/> <result property="hiredate" column="hiredate"/> <result property="sal" column="sal"/> <result property="deptno" column="deptno"/> <association property="deptment"> <result column="deptno" property="deptno"/> <result column="dname" property="dname"/> <result column="loc" property="loc"/> </association> </resultMap> <select id="selectAllWithDeptment" resultMap="EmpDeptMap"> select * from dept inner join emp on emp.deptno=dept.deptno; </select>
新建Department类:
package org.example.pojo; public class Deptment { private Integer deptno; private String dname; private String loc; public Deptment(Integer deptno, String dname, String loc) { this.deptno = deptno; this.dname = dname; this.loc = loc; } public Integer getDeptno() { return deptno; } public String getDname() { return dname; } public String getLoc() { return loc; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public void setDname(String dname) { this.dname = dname; } public void setLoc(String loc) { this.loc = loc; } @Override public String toString() { return "Deptment{" + "deptno=" + deptno + ", dname='" + dname + '\'' + ", loc='" + loc + '\'' + '}'; } }
在Employee类中添加了外部属性Department
package org.example.pojo; public class Employee { private int empno; private String ename; private String job; private int mgr; private String hiredate; private double sal; private double comm; private int deptno; //外部属性 private Deptment deptment; public Deptment getDeptment() { return deptment; } public void setDeptment(Deptment deptment) { this.deptment = deptment; } public Employee() { } public Employee(int empno, String ename, String job,int mgr, String hiredate, double salary, double comm, int deptno) { this.empno = empno; this.ename = ename; this.job = job; this.mgr=mgr; this.hiredate = hiredate; this.sal = salary; this.comm = comm; this.deptno = deptno; } public int getMgr() { return mgr; } public void setMgr(int mgr) { this.mgr = mgr; } public int getEmpno() { return empno; } public String getEname() { return ename; } public String getJob() { return job; } public String getHiredate() { return hiredate; } public double getSal() { return sal; } public double getComm() { return comm; } public int getDeptno() { return deptno; } public void setEmpno(int empno) { this.empno = empno; } public void setEname(String ename) { this.ename = ename; } public void setJob(String job) { this.job = job; } public void setHiredate(String hiredate) { this.hiredate = hiredate; } public void setSal(double sal) { this.sal = sal; } public void setComm(double comm) { this.comm = comm; } public void setDeptno(int deptno) { this.deptno = deptno; } @Override public String toString() { return empno+" "+ename+" "+job+" "+hiredate+" "+ sal +" "+comm+" "+deptno; } }
结果截图:
思路:
这里是使用了多表查询,它要求查找ename和dname,分别是从emp表和dept表中得到。
我们先新建一个Department类。Employee类和Department类之间的联系是deptno,每一个Employee都有一个deptno,每一个deptno又对应一个Department类。
因此我们这里给Employee类增加一个外部属性Department,并给它写好get和set方法。
接着回到EmployeeMapper.xml映射文件,需要新建一个ResultMap,其中Employee的内部属性不变,增加一个association标签,里面写上Department的各项属性。
(因为这里是一对一查询,一个Employee对应一个Department,如果是一对多,那么应该用collection标签)。
-
检索在任何位置有字母‘A’的员工姓名
test类:
String lname="%A%"; List<Employee> employees=employeeMapper.selectAllLikeName(lname); for(Employee e:employees){ System.out.println(e.getEname()); }
EmployeeMapper接口:
public List<Employee>selectAllLikeName(String lname);
EmployeeMapper.xml映射文件:
<select id="selectAllLikeName" resultMap="EmployeeResultMap"> select * from emp where ename like #{lname}; </select>
结果截图:
思路:
我们这里的输入参数使用的是字符串,“%A%”
然后在映射文件中sql语句可以这样写:
select * from emp where ename like #{lname}
然后遍历所有对象的ename属性即可。
-
用你的账户创建两个表,包括属性、数据类型
test类:
employeeMapper.CreateTable("ddept","dept"); employeeMapper.CreateTable("eemp","emp");
EmployeeMapper接口:
public void CreateTable(@Param("newTable") String newTable,@Param("originTable") String originTable);
EmployeeMapper.xml映射文件:
<update id="CreateTable"> Create table ${newTable} as select * from ${originTable} where 1=2; </update>
结果截图:
思路:
要在Mybatis中使用DDL语句,都可以用Update标签来实现。但是在这里无法直接创建表,只能基于已有表创建新表。
这里我们传入两个参数,一个是新建表的名称,另一个是被参考格式的表的名称。
这里需要注意的是在接口文件中,传入参数是表名、数据库名的话,需要用到@Param注解。
用它来声明参数的话,这个参数需要被取出时直接去它的参数名即可。
当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
而在Mybatis中,将table表名作为参数传入时,必须使用${}方式,因此我们也必须用@Param注解声明,否则会报错。
-
向表ddept中插入至少5条记录
test类:
List<Deptment>deptments=new ArrayList<>(); Deptment d1=new Deptment(1,"Factory","China"); Deptment d2=new Deptment(2,"Game","Japan"); Deptment d3=new Deptment(3,"Anime","Japan"); Deptment d4=new Deptment(4,"Association","USA"); Deptment d5=new Deptment(5,"Trips","China"); deptments.add(d1); deptments.add(d2); deptments.add(d3); deptments.add(d4); deptments.add(d5); for(Deptment d:deptments){ employeeMapper.InsertDept(d); } sqlSession.commit();//提交 List<Deptment>depts=employeeMapper.SelectAllDeptments(); for(Deptment d:depts){ System.out.println(d); }
EmployeeMapper接口:
public void InsertDept(Deptment deptment); public List<Deptment> SelectAllDeptments();
EmployeeMapper.xml映射文件:
<insert id="InsertDept"> insert into ddept values (#{deptno},#{dname},#{loc}); </insert> <resultMap id="DeptMap" type="org.example.pojo.Deptment"> </resultMap> <select id="SelectAllDeptments" resultMap="DeptMap"> select * from ddept; </select>
结果截图:
思路:
这里使用insert标签,将需要插入的对象传入后,执行sql语句即可插入。
注意:插入后,需要调用sqlSession的commit方法来提交更新。
我这里首先新建了5个Department对象,然后分别调用insert方法插入,然后调用sqlSession.commit()方法,然后将表中输入全部输出,我们可以看到结果成功插入了。
-
从eemp中删除名为“SMITH”的记录
test类:
employeeMapper.DeleteEmployee("Smith"); Employee e = employeeMapper.selectByName("Smith"); System.out.println(e);
EmployeeMapper接口:
public void DeleteEmployee(String ename);
EmployeeMapper.xml映射文件:
<delete id="DeleteEmployee"> delete from emp where ename = #{ename}; </delete>
结果截图:
思路:
在映射文件使用delete标签,在接口写好对应的方法,然后在test类中调用即可。
注:以上都可以使用注解开发,会比配置文件更方便。一般是简单语句使用注解开发,复杂语句使用配置文件开发。
查询:
@Select('select * from emp')
public List<Employee> SelectAll();
删除:
@delete('delete from emp where ename = #{ename}')
public void DeleteByName(String ename);
插入:
@insert('insert into dept values (#{deptno},#{dname},#{loc}'))
public void InsertDept(Department dept);
更新:
@update('update dept set loc = #{loc} where deptno = #{deptno}')
public void UpdateLoc(String loc,String deptno);
selectByName(“Smith”);
System.out.println(e);
EmployeeMapper接口:
public void DeleteEmployee(String ename);
EmployeeMapper.xml映射文件:
<delete id="DeleteEmployee">
delete from emp where ename = #{ename};
</delete>
结果截图:
[外链图片转存中...(img-ACmKqufb-1688957264224)]
思路:
在映射文件使用delete标签,在接口写好对应的方法,然后在test类中调用即可。
注:以上都可以使用注解开发,会比配置文件更方便。一般是简单语句使用注解开发,复杂语句使用配置文件开发。
查询:
@Select('select * from emp')
public List<Employee> SelectAll();
删除:
@delete('delete from emp where ename = #{ename}')
public void DeleteByName(String ename);
插入:
@insert('insert into dept values (#{deptno},#{dname},#{loc}'))
public void InsertDept(Department dept);
更新:
@update('update dept set loc = #{loc} where deptno = #{deptno}')
public void UpdateLoc(String loc,String deptno);