实现CRUD
为了简化,先封装工具类 MyBatisUtil
插入操作:保存员工
-
修改映射文件,新增 节点
<!--insert--> <insert id="saveEmp" parameterType="com.wdzl.pojo.Emp"> insert into emp (ename,sal,hiredate,deptno)values (#{ename},#{salary},#{hiredate},#{deptno}) </insert>
-
为了简化获取session步骤,封装工具类
package com.wdzl.util; 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 java.io.IOException; import java.io.InputStream; public class MyBatisUtil { private static String configFile = "mybatis-config.xml"; private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder; private static SqlSessionFactory sqlSessionFactory; static{ sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); try { InputStream resourceAsStream = Resources.getResourceAsStream(configFile); sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream); } catch (IOException e) { throw new RuntimeException(e); } } /** * 默认是true * @return */ public static SqlSession getSqlSession(){ return getSqlSession(true) ; } public static SqlSession getSqlSession(boolean commit){ return sqlSessionFactory.openSession(commit); } public static void close(SqlSession session){ if(session != null){ session.close(); } } }
-
调用
public class TestInsert { public static void main(String[] args) { SqlSession session = MyBatisUtil.getSqlSession(); //封装实体类 Emp emp = new Emp(); emp.setEname("孙悟空"); emp.setDeptno(30); emp.setSalary(9000F); emp.setHiredate(new Date()); // 保存 int rows = session.insert("saveEmp", emp); System.out.println(rows); MyBatisUtil.close(session); } }
-
注意:
为了方便调试,最好在执行过程中能显示打印执行过程的日志信息,可以通过配置文件,配置开启日志功能
<settings> <!--日志配置--> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
根据编号查询员工
-
修改映射文件,新增查询节点
<select id="getEmpById" resultType="emp"> select empno,ename,sal salary,hiredate from emp where empno=#{eno} </select>
-
注意别名:为了简化实体类写法,可以在配置文件中配置别名
<typeAliases> <!--配置一个实体类的别名--> <!-- <typeAlias type="com.wdzl.pojo.Emp" alias="emp"></typeAlias>--> <!--配置包下所有类别名,在映射文件中,默认在此包下找实体类--> <package name="com.wdzl.pojo"/> </typeAliases>
-
编写代码调用
public class TestSelect { public static void main(String[] args) { SqlSession session = MyBatisUtil.getSqlSession(); Emp emp = session.selectOne("getEmpById", 10); System.out.println(emp); MyBatisUtil.close(session); } }
修改员工信息
- 修改映射文件,新增 <update> 标记元素
- 先查询,再修改
映射文件:
<!--根据用户编号 修改员工信息-->
<update id="updateEmp" parameterType="emp" >
update emp set ename=#{ename},sal=#{salary},
deptno=#{deptno}
where empno=#{empno}
</update>
代码:
/**
* 先查询 再修改
*/
public class TestUpdate {
public static void main(String[] args) {
SqlSession session = MyBatisUtil.getSqlSession();
// Emp emp = new Emp();
Emp emp = session.selectOne("getEmpById",21);
emp.setEmpno(21);
emp.setSalary(emp.getSalary()+10000f);
session.update("updateEmp",emp);
}
}
根据员工编号删除
-
修改映射文件,新增<delete> 标记元素
<delete id="delEmp" > delete from emp where empno=#{no} </delete>
-
代码
public class TestDelete { public static void main(String[] args) { SqlSession session = MyBatisUtil.getSqlSession(); int rows = session.delete("delEmp", 21); System.out.println(rows); MyBatisUtil.close(session); } }
其他
useGeneratedKeys 用法
- 插入时,自动获取主键
场景描述:
需要同时新增新的部门,并新增员工属于次部门,所以需要在保存部门后,能直接获取到部门的编号
SqlSession session = MyBatisUtil.getSqlSession();
//新增部门同时新增员工
Dept dept = new Dept();
dept.setDname("教研部");
//保存部门
session.insert("save",dept);
System.out.println(">>>>>部门编号:"+dept.getDeptno());
//封装实体类
Emp emp = new Emp();
emp.setEname("孙悟空");
emp.setDeptno(dept.getDeptno());
int rows = session.insert("saveEmp", emp);
默认情况下,上面的部门编号为 null。
解决办法:在映射文件的<insert> 标记中添加 两个必须的属性 useGeneratedKeys="true" keyProperty="deptno"
<insert id="save" parameterType="dept" useGeneratedKeys="true" keyProperty="deptno">
insert into dept_0(dname)values(#{dname})
</insert>
这样,再次执行上面的代码,发现部门编号就有值了!
复用<sql>
-
先把公共的部分,提取到<sql> 标记中,并指定id编号
<!--公共的片段 单独编写到 sql 元素中--> <sql id="empCols"> empno,ename,sal salary,hiredate </sql>
-
在使用公共部分的位置,引用 <include> 标记元素
<select id="queryAll" resultType="emp">
select
<include refid="empCols"></include>
from emp
</select>