mybatis入门程序--增删改查

mybatis入门程序

准备工作

入门学习中已经创建好maven项目,并导入相关依赖,接下来就可以利用mybatis对数据库进行操作

准备数据库

数据库包含两个表:
image
image
image

创建实体类

在pojo层创建一个Employee实体类
image

代码:

Employee.java
package com.neuedu.pojo;
import java.util.Date;

public class Employee {
	private Integer id;
	private String loginName;
	private String password;
	private String name;
	private Date hiredate;
	private String email;
	private Integer status;
	private String photoPath;
	private Integer deptId;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getLoginName() {
		return loginName;
	}
	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Integer getStatus() {
		return status;
	}
	public void setStatus(Integer status) {
		this.status = status;
	}
	public String getPhotoPath() {
		return photoPath;
	}
	public void setPhotoPath(String photoPath) {
		this.photoPath = photoPath;
	}
	public Integer getDeptId() {
		return deptId;
	}
	public void setDeptId(Integer deptId) {
		this.deptId = deptId;
	}
	@Override
	public String toString() {
		return "Employee [id=" + id + ", loginName=" + loginName + ", password=" + password + ", name=" + name
				+ ", hiredate=" + hiredate + ", email=" + email + "]";
	}
}

创建映射文件

可以直接在resources下创建xml映射文件,EmpMapper.xml
如果idea识别不出xml文件,可以看IDEA创建Mapper.xml文件识别不成功的问题参考一下

基本格式

<?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="">
</mapper>

根标签mapper的namespace属性现在可以随意给值 ,但当使用mapper代理方式开发时,有特定的取值。
数据库的查询语句也在这个文件中写

入门程序一:按id查询用户

sql语句

<select id="findEmpById" parameterType="int" resultType="com.neuedu.pojo.Employee">
        <!-- id就是这条语句的唯一标识,parameterType是员工id的属性,resultType是返回类型,要把实体类的路径写完整 -->
        select * from tb_emp where id = #{value}
        <!-- 占位符要使用#{} parameterType的类型如果为 简单类型(基本类型和String),#{}中的值任意。-->
    </select>

测试

创建一个测试类

package com.neuedu.test;

import java.io.InputStream;

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.Test;
import com.neuedu.pojo.Employee;
public class TestMybatis {
   @Test
    public void testFindById() throws Exception{

        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        sf = new SqlSessionFactoryBuilder().build(in);
        SqlSession session = sf.openSession();
        Employee emp = session.selectOne("findEmpById", 3);
        System.out.println(emp.getName());
        session.close();
    }
}

查询实质上调用的还是session,session调用完成后要关闭

InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
该语句引入了映射文件,还需要由映射文件去寻找sql语句所在的文件EmpMapper.xml
所以要在SqlMapConfig.xml中引入EmpMapper.xml

image

测试结果

image

对比数据库

image
成功!

入门程序二:按名称的模糊查询

sql语句

<!-- 按名称模糊查询,当查询结果有多个时,resultType的类型为pojo-->
    <select id="findEmpByName" parameterType="string" resultType="com.neuedu.pojo.Employee">
    <!-- 不使用拼接,测试时要在test类中加% -->
          SELECT * FROM tb_emp WHERE NAME LIKE #{value}
    </select>

注意:
①按名称的模糊查询,查出来的结果可能有很多个,但是返回类型还是实体pojo不是list,但是在测试的时候可以以list输出
②sql语句的占位符写的还是#{value},以string类型查询是要加上%,但是编译器不会自己补上,所以在测试的时候要加上

或者可以在sql语句上加%
SELECT * FROM tb_emp WHERE NAME LIKE '%${value}%'
用字符串的拼接方法加上%,但是慎用,不注意会产生sql的注入
举一个注入的例子SELECT * FROM tb_emp WHERE NAME='tom' AND PASSWORD='' OR '1'='1'
会把数据库的数据全部查询出来
image

测试

测试语句:

@Test
    public void testFindByName() throws Exception{

        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
        sf = new SqlSessionFactoryBuilder().build(in);
        SqlSession session = sf.openSession();
//        字符串拼接不用加tom
//        List<Employee> empList = session.selectList("findEmpByName", "ke");
//        System.out.println(empList.size());
//        不用拼接,手动加%
        List<Employee> empList = session.selectList("findEmpByName", "%ke%");
        System.out.println(empList);
        session.close();
    }

查询的是姓名中包含ke的员工

测试结果

image
对比数据库
image
成功!

入门程序三:增删改操作

sql语句

    <!-- 删除员工 -->
    <delete id="deleteEmp" parameterType="int">
	delete from tb_emp where id=#{value}
    </delete>
    <!-- 更新员工 如果输入参数为pojo类型,#{pojo对象的属性名}-->
    <update id="editEmp" parameterType="com.neuedu.pojo.Employee">
	update tb_emp set
		loginName=#{loginName},name=#{name},email=#{email},
		status=#{status},deptId=#{deptId},photoPath=#{photoPath}
		where id=#{id}
    </update>
    <!-- 插入员工 -->
    <insert id="saveEmp" parameterType="com.neuedu.pojo.Employee">
        INSERT INTO tb_emp
        (loginname,PASSWORD,NAME,hiredate,email,photopath,deptId)
        VALUES (#{loginName},#{password},#{name},#{hiredate},#{email},#{photoPath},#{deptId})
        <!-- order: 执行时机   keyColumn:表中自动名称  keyProperty:映射的pojo属性名称 -->
        <selectKey order="AFTER" resultType="int" keyColumn="id" keyProperty="id">
            SELECT LAST_INSERT_ID()
        </selectKey>
    </insert>

增删改就按照sql语句书写规范,然后注意一下输入的类型
在插入员工的sql语句中加入了一个查询语句,查找插入的最后一个员工的id,order就定义了她的执行顺序,先插进去再去查找,不会发生冲突

测试

由上面的两个案例看出定义session的代码重复使用了,所以单独拿出来整合
代码头如下

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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.Before;
import org.junit.Test;

import com.neuedu.pojo.Employee;

public class TestMybatis {
    private SqlSessionFactory sf;

    @Before
    public void startUp() {
        InputStream in=null;
        try {
            in = Resources.getResourceAsStream("SqlMapConfig.xml");
            sf = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

测试的语句

@Test
@Test
    public void testDelete() {
        SqlSession session = sf.openSession();

        int temp = session.delete("deleteEmp", 10);
        System.out.println(temp);

        session.commit();
        session.close();
    }
    @Test
    public void testEdit() {
        SqlSession session = sf.openSession();

        Employee emp = session.selectOne("findEmpById", 1);
        emp.setName("jerry");

        int temp = session.update("editEmp", emp);
        System.out.println(temp);

        session.commit();
        session.close();
    }
    @Test
    public void testAdd() {
        SqlSession session = sf.openSession();
        Employee emp = new Employee();
        emp.setLoginName("100002");
        emp.setPassword("123");
        emp.setName("平头哥");
        emp.setEmail("aaa@qq.com");
        emp.setHiredate(new Date());

        int temp = session.insert("addEmp", emp);
        System.out.println(temp);

        session.commit();
        session.close();
        System.out.println("emp的id=" + emp.getId());
    }

测试结果
都能运行,截最后一个增添操作的
image

补充

在写sql语句时,注意到写实体类的类型时,比如com.neuedu.pojo.Employee很长,所以想到用typeAlias来起别名,可以为单个起,也可以批量起别名,将语句加在SQLMapConfig.xml中,就可把com.neuedu.pojo.Employee简化为Employee/employee

 <!-- 为实体起别名 -->
    <typeAliases>
        <!-- <typeAlias type="com.neuedu.pojo.Employee" alias="employee"/> -->
        <!-- 批量起别名
            为name指定的包中,所有类起别名,别名为类名首字母大小写均可。
        -->
        <package name="com.neuedu.pojo"/>
    </typeAliases>
后续完整的笔记在mybatis框架
posted @ 2021-08-07 13:15  九尾。  阅读(187)  评论(0编辑  收藏  举报