Mybatis学习系列之(二)---crud(即增删改查)

Mybatis的crud操作

介绍:
在下面展示的内容中会依次介绍:
1. crud操作在Mapper文件中的配置。
2. 对Mapper配置文件中的增删改查操作的测试。
3. 展示Log4j配置。
4. 展示mybatis.cfg.xml配置。
5. 展示pojo。
6. 展示项目结构。

1. AddminsMapper.xml

<?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="test">

  <select id="findlist" resultType="com.bjsxt.sxl.entity.AdminTest">
  select * from a_admins
  </select>

  <!-- 单条记录查询,条件查询,占位符用#{}表示,其中括号里的名字随便起 -->
  <select id="findone" resultType="com.bjsxt.sxl.entity.AdminTest">
  select * from a_admins where id=#{id};
  </select>

   <!-- 单条记录查询,多条件查询,需要加paremeterType 
        此处括号中的名不能随便起,要和map中key键名相对应
   -->
   <select id="findOneMap" parameterType="map" resultType="com.bjsxt.sxl.entity.AdminTest">
   select * from a_admins where id=#{id} and roleId=#{roleId};
   </select>



  <!-- 插入一条记录, -->
  <insert id="save" parameterType="com.bjsxt.sxl.entity.AdminTest">
  insert into a_admins(roleId, email, password, status, createTime, updateTime)
  values(#{roleId}, #{email}, #{password}, #{status}, #{createTime}, #{updateTime});
  </insert>


   <!-- 插入一条记录,同时返回主键ID,方式一
   parameterType:参数的类型,pojo
   useGeneratedKeys:告诉Mybatis是否返回主键
   keyColumn:告诉Mybatis主键的列名
   keyProperty:告诉Mybatis主键放到POJO的哪个属性中
    -->
  <insert id="save1" parameterType="com.bjsxt.sxl.entity.AdminTest" useGeneratedKeys="true"
  keyColumn="id" keyProperty="id">
  insert into a_admins(roleId, email, password, status, createTime, updateTime)
  values(#{roleId}, #{email}, #{password}, #{status}, #{createTime}, #{updateTime});
  </insert>


  <!-- 插入一条记录,同时返回主键ID,方式二
   parameterType:参数的类型,pojo
    -->
  <insert id="save2" parameterType="com.bjsxt.sxl.entity.AdminTest" >
  insert into a_admins(roleId, email, password, status, createTime, updateTime)
  values(#{roleId}, #{email}, #{password}, #{status}, #{createTime}, #{updateTime});

        <!--
            selectKey:获取添加的sql语句执行之后获取的主键

            keyColumn:告诉Mybatis主键的列名
            keyProperty:告诉Mybatis主键放到POJO的哪个属性中
            order:告诉 Mybatis SelectKey里面的sql语句在Insert语句执行之前还是之后;
            当order的值是BEFORE时在有序列的数据库中使用,此时是先获取Id在执行sql语句。
            resultType:告诉Mybatis id是什么类型

            注意:order="AFTER"中的after必须大写
         -->

  <selectKey  keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
  <!-- 获取Mysql新插入的sql记录的最新ID,必须和插入语句一块使用 ,此处有两种方式-->
   <!-- 方式一 -->
   <!--select last_insert_id();-->
   <!-- 方式二 -->
    select @@identity;
  </selectKey>
  </insert>


     <!--  更新一条记录
           parameterType:pojo类型
     -->
  <update id="update" parameterType="com.bjsxt.sxl.entity.AdminTest" >
  update a_admins 
  set `roleId`=#{roleId}, `email`=#{email}, `password`=#{password}, 
        `status`=#{status}, `createTime`=#{createTime}, `updateTime`=#{updateTime} 
        WHERE `id`=#{id} LIMIT 1 
  </update>


     <!-- 删除一条记录,按照id删除
          parameterType: sql语句的条件,类型为:int:
          此处parameterType的值为删除时的条件值的类型,比如按照ID删除,Id的类型为int,所以
          此处值为int 。
          #{值:随便写}
     -->
     <delete id="delete" parameterType="int">
     delete from a_admins where id=#{aaasd};
     </delete>
  </mapper>

2.MainTest02.java

package com.bjsxt.sxl.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

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.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.bjsxt.sxl.entity.AdminTest;

public class MainTest02
{

    private Logger logger = LogManager.getLogger();
    private SqlSessionFactory sessionFactory;

    @Before
    public void init()
    {
        try
        {
            //1.加载配置文件
            InputStream inputStream = Resources.getResourceAsStream("mybatis.cfg.xml");
            //2.sessionFactory==driverManager
            sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e)
        {
            this.logger.error("mybatis初始化报错",e);
        }

    }


    /**
     * 单条记录查询,参数2:表示的是sql语句需要的条件
     */
    @Test
    public void  test1()
    {
        //3. session ====connection
        SqlSession session = this.sessionFactory.openSession();
        //4.单条记录查询
        AdminTest admins =session.selectOne("test.findone",2);

        this.logger.info("id:{},email:{},createTime:{}",
                admins.getId(),admins.getEmail(),admins.getCreateTime().toLocaleString());


        session.close();
    }

    /**
     * 单条记录查询,多条件查询,map中传条件值
     * 注意:进行空验证
     * selectOne中的参数2:表示的是sql语句需要的条件
     */
    @Test
    public void test2()
    {
        SqlSession session = this.sessionFactory.openSession();

        Map<String,Object>  map = new HashMap<String,Object>();

        map.put("id", 1);
        map.put("roleId",2);

    AdminTest admins = session.selectOne("test.findOneMap", map);

    if(admins !=null){
    this.logger.info("id:{},email:{},createTime:{}",
            admins.getId(),admins.getEmail(),admins.getCreateTime().toLocaleString());

    }
    else{
        this.logger.info("-----不存在此记录-------");
    }
    session.close();
    }


    /**
     * 插入一条记录
     * 在insert中第一个参数表示sql语句
     * 第二个参数表示条件parameterType,即插入的对象类型
     */
    @Test
    public void test3()
    {
        SqlSession session = this.sessionFactory.openSession();
        try
        {
            AdminTest admins = new AdminTest();
            admins.setEmail("22");
            admins.setPassword("22");
            admins.setCreateTime(new Date());
            admins.setUpdateTime(new Date());

            session.insert("test.save", admins);
            session.commit();
        } catch (Exception e)
        {
            this.logger.error("添加失败",e);
            session.rollback();
        }finally
        {
            session.close();
        }

    }


    /**
     * 插入一条记录,返回主键ID方式一
     * 在insert中第一个参数表示sql语句,
     * 第二个参数表示条件parameterType,即插入的对象类型
     * 需求:此处要求在插入记录的同时返回主键ID值
     */
    @Test
    public void test4()
    {
        SqlSession session = this.sessionFactory.openSession();
        try
        {
            AdminTest admins = new AdminTest();
            admins.setEmail("33");
            admins.setPassword("33");
            admins.setCreateTime(new Date());
            admins.setUpdateTime(new Date());


            //插入记录,返回主键ID
            session.insert("test.save1", admins);
            this.logger.info("主键ID:{}",admins.getId());
            session.commit();
        } catch (Exception e)
        {
            this.logger.error("添加失败",e);
            session.rollback();
        }finally
        {
            session.close();
        }

    }



    /**
     * 插入一条记录,返回主键ID,方式二
     * 在insert中第一个参数表示sql语句,
     * 第二个参数表示条件parameterType,即插入的对象类型
     * 需求:此处要求在插入记录的同时返回主键ID值
     */
    @Test
    public void test5()
    {
        SqlSession session = this.sessionFactory.openSession();
        try
        {
            AdminTest admins = new AdminTest();
            admins.setEmail("33");
            admins.setPassword("33");
            admins.setCreateTime(new Date());
            admins.setUpdateTime(new Date());


            //插入记录,返回主键ID
            session.insert("test.save2", admins);
            this.logger.info("主键ID:{}",admins.getId());
            session.commit();
        } catch (Exception e)
        {
            this.logger.error("添加失败",e);
            session.rollback();
        }finally
        {
            session.close();
        }

    }

    /**
     * 更新记录操作
     */
    @Test
    public void test6()
    {
        SqlSession session = this.sessionFactory.openSession();
        try
        {
            /*AdminTest admins = new AdminTest();
            admins.setId(1);
            admins.setEmail("33");
            admins.setPassword("33");
            admins.setCreateTime(new Date());
            admins.setUpdateTime(new Date());*/

            /* 先根据id查询出来
             * 更新指定的属性即可
             *  */
            AdminTest  admins = session.selectOne("test.findone",2);
            admins.setEmail("88888888");

            /*
             * 参数1:表示的是sql语句
             * 参数2:条件parameterType
             * 返回值:含义:此sql语句执行以后对数据库影响的条数
             * */
            int res = session.update("test.update", admins);
            this.logger.info("主键ID:{}",admins.getId());

            /* 事务提交 可以不用提交,在更新操作中事务会自动提交*/
            session.commit();
        } catch (Exception e)
        {
            this.logger.error("添加失败",e);
            session.rollback();
        }finally
        {
            session.close();
        }

    }

    /**
     * 删除操作
     */
    @Test
    public void test7()
    {
        SqlSession session = this.sessionFactory.openSession();
        try
        {



            /*
             * 参数1:表示的是sql语句
             * 参数2:条件
             * 返回值:含义:此sql语句执行以后对数据库影响的条数
             * */
            int res = session.delete("test.delete", 1);
            this.logger.info("更新的结果:{}",res);

            session.commit();
        } catch (Exception e)
        {
            this.logger.error("添加失败",e);
            session.rollback();
        }finally
        {
            session.close();
        }

    }

    @After
    public void close()
    {
        this.logger.info("--------关闭--------");
    }

}

3. Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>

        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </Console>

        <!-- 系统打印日志 
            name:名字,唯一噢
            fileName:文件的路径,默认放到classpath中
            filePattern:文件名的规则
            %d{yyyy-MM-dd}:日期
            i:如果当天的文件超出了最大值(大小),重新改名,从1开始,依次1
            与SizeBasedTriggeringPolicy相响应,表示每1m一个文件
        -->
        <RollingRandomAccessFile name="System" fileName="logs/system.log" filePattern="logs/system_%d{yyyy-MM-dd}_%i.log">
            <PatternLayout
                pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <!-- 
                    每一个文件的大小
                 -->
                <SizeBasedTriggeringPolicy size="1M" />
            </Policies>
        </RollingRandomAccessFile>  
    </Appenders>    
    <Loggers>
        <!-- 级别优先级:
            trace:最低的,
            debug:一般打印一些提示信息:给开发人员看的
            info:提示信息:一般是给运维看的
            warn:警告一下
            error:代码报异常,把异常信息记录下来
         -->
        <Root level="debug">
            <AppenderRef ref="STDOUT"/>

            <!-- 引入日志记录文件的标签配置名称 -->
            <AppenderRef ref="System"/>
        </Root>

    </Loggers> 
</Configuration>

4. mybatis.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <configuration>
  <environments default="myDefault">
  <environment id="myDefault">

 <!-- 数据库中的事务管理器 -->
  <transactionManager type="JDBC"></transactionManager>

 <!-- 连接池:里边内容包括驱动、url、用户名、密码 -->
  <dataSource type="POOLED">

  <!-- 驱动 -->
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <!-- url -->
  <property name="url" value="jdbc:mysql://localhost:3306/test"/>
  <!-- 用户名 -->
  <property name="username" value="root"/>
  <!-- 密码 -->
  <property name="password" value="123456"/>

  </dataSource>

  </environment>
  </environments>

  <mappers>
  <mapper resource="com/bjsxt/sxl/entity/AddminsMapper.xml"/>
  </mappers>
  </configuration>

5. pojo实体
MianTest.java

package com.bjsxt.sxl.entity;

import java.util.Date;

public class AdminTest
{

    private int id;
    private int roleId;
    private String email;
    private String password;
    private byte status;
    private Date createTime;
    private Date updateTime;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public int getRoleId()
    {
        return roleId;
    }

    public void setRoleId(int roleId)
    {
        this.roleId = roleId;
    }

    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    public String getPassword()
    {
        return password;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }

    public byte getStatus()
    {
        return status;
    }

    public void setStatus(byte status)
    {
        this.status = status;
    }

    public Date getCreateTime()
    {
        return createTime;
    }

    public void setCreateTime(Date createTime)
    {
        this.createTime = createTime;
    }

    public Date getUpdateTime()
    {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime)
    {
        this.updateTime = updateTime;
    }


}

6. 项目结构
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值