在入門學習中已經建立好maven項目,並導入相關依賴,接下來就能夠利用mybatis對數據庫進行操做html
數據庫包含兩個表:
java
在pojo層建立一個Employee實體類
sql
代碼:數據庫
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
<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
對比數據庫
成功!
<!-- 按名稱模糊查詢,當查詢結果有多個時,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'
會把數據庫的數據所有查詢出來
測試語句:
@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的員工
對比數據庫
成功!
<!-- 刪除員工 --> <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 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()); }
測試結果
都能運行,截最後一個增添操做的
在寫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>