MyBatis 之二:MyBatis 的 CRUD 操作快速掌握

实现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>
  • 40
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zp8126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值