mybatis入門程序--增刪改查

mybatis入門程序

準備工做

入門學習中已經建立好maven項目,並導入相關依賴,接下來就能夠利用mybatis對數據庫進行操做html

準備數據庫

數據庫包含兩個表:
image
image
imagejava

建立實體類

在pojo層建立一個Employee實體類
imagesql

代碼:數據庫

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文件識別不成功的問題參考一下apache

基本格式session

<?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代理方式開發時,有特定的取值。
數據庫的查詢語句也在這個文件中寫mybatis

入門程序一:按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>

測試

建立一個測試類app

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.xmlmaven

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框架
相關文章
相關標籤/搜索