在入门学习中已经建立好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>