mybatis单框架实现数据库新增、删除、修改

mybatis单框架实现数据库新增、删除、修改

1 准备工作

1.1 导入依赖

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!--数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <!--测试的范围 只能在test模块使用 单元测试必须要用4以上的版本-->
            <scope>test</scope>
        </dependency>
        <!--加载日志的信息 log4j日志-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

1.2 配置java文件夹和resource资源文件夹都能输出到target目录中

 <build>
        <!--配置xml文件能够编译输出到target java和resources文件夹都配置-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <!--**任意目录及其子目录 **任意文件-->
                    <include>**/**</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <!--**任意目录及其子目录 **任意文件-->
                    <include>**/**</include>
                </includes>
            </resource>
        </resources>
    </build>

1.3 创建需要查询的实体类(全部引用数据类型)

package entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
//属性必须是引用数据类型 数据库Null值 动态sql都是判断属性是否为空
public class Emp {
    private Integer empno;
    private String ename;
    private String job;
    private Integer mgr;
    private String hiredate;
    private Double sal;
    private Double comm;
    private Integer deptno;
}

1.4 在resource资源文件夹下面创建jdbc.properties文件

# key-value 形式的文件 笔者使用的是mysql8
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/数据库名称
jdbc.username=账户
jdbc.password=密码

1.5 在resource资源文件夹下创建log4j.properties文件

#代表root节点整个工程下所有输出日志的地方配置的输出的级别和输出的位置。
log4j.rootLogger=DEBUG,Console,D
#代表配置控制台的类。
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.org.apache=INFO

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/mybatis.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH\:mm\:ss}  [ %t\:%r ] - [ %p ]  %m%n

1.6 在resource资源文件夹下面创建mybatis-config.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>
    <!--引入jdbc配置文件 引入文件后就能调用里面的值了-->
    <properties resource="jdbc.properties"></properties>
    <!--以类名作为别名 都是.的形式 让resultType写的短一些-->
    <typeAliases>
        <package name="entity"/>
    </typeAliases>
    <!--环境选择 default是谁 就选谁,只能选择一个-->
    <environments default="mysql">
        <!--多种环境之一 上面的id要与default里面的值要保持一致-->
        <environment id="mysql">
            <!--事物管理器 JDBC 使用JDBC管理事务(事物提交是自动的)
            MANAGED Spring容器去提交-->
            <transactionManager type="JDBC"/>
            <!--dataSource数据源 连接数据库的对象
                unPooled是没有连接池的
              POOLED是连接池的 pool游泳
              JNDi外部容器管理连接-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载mapper文件-->
    <mappers>
    <!--    <mapper resource="mapper/EmpMapper.xml"/>-->
        <!--扫描mapper接口的 该方式接口必须与mapper.xml文件名完全一致 且同一目录-->
        <package name="mapper"/>
    </mappers>
</configuration>
注意: mybatis-config.xml文件中导入jdbc.properties文件的指令
<!--引入jdbc配置文件 引入文件后就能调用里面的值了-->
<properties resource="jdbc.properties"></properties>
<!--若有多级目录,resource里面可以写成目录路径/文件名 如temp/jdbc.properties-->

1.7 创建SqlSessionFactoryFactory工具类

package util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class SqlSessionFactoryUtil {
    /*加载主配置文件*/
    private static String resource = "mybatis-config.xml";
    /*定义在外面*/
    private static SqlSessionFactory sf=null;
    static {
        /*加载主配置文件 得到SqlSessionFactory对象
        * 该对象是一个连接工厂对象
        * */
        try {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sf = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory sf(){
       return sf;
    }

}

1.8 创建EmpMapper接口和EmpMapper.xml文件

在这里插入图片描述

1.9 主配置文件引入其他配置文件(扫描该配置文件的根目录)

<!--加载mapper文件 mappeer是EmpMapper.xml文件的根目录-->
<mappers>
    <package name="mapper"/>
</mappers>

2 新增insert

2.1 在EmpMapper接口中的方法名

int add(Emp e);

2.2 在EmpMapper.xml中准备的sql语句

   <!--useGeneratedKeys= 注解回填 keyProperty查询到的key放入实体中的哪个属性,把自动增长的那个值回填到传入的实参的属性里面-->
    <insert id="add" useGeneratedKeys="true" keyProperty="empno">
        insert into emp values(null,#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})
    </insert>

2.3 在test文件夹下写的测试代码

@org.junit.Test
    public void t3(){
    //连接工厂
    SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
    /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
    SqlSession sqlSession = sf.openSession();
    //调用mapper中的sql 参数写命名空间.id
    /*调用自己的mapper 后面写接口.class*/
    EmpMapper em = sqlSession.getMapper(EmpMapper.class);
    Emp emp=new Emp(null,"小王","经理",1234,null,5000D,null,10);
    /*点击这个后就提交了*/
    em.add(emp);
    System.out.println("添加后:"+emp);
    sqlSession.commit();
    sqlSession.close();
}

2.4 新增结果

2.4.1 添加之前 emp表截图

在这里插入图片描述

2.4.2 运行截图

在这里插入图片描述

2.4.3 添加之后emp表截图

在这里插入图片描述

2.5 知识点总结

注意:新增时若某一字段设置了自动增长,那么插入的是null值的,得到的结果就算最新的自动增长的那个数字
设置了useGeneratedKeys="true" keyProperty="empno"就会自动回填到你填写的参数中
另外你传入的是实参是对象,那么可以通过#{}的方式去获取实参里面的每一个属性值

3 删除delete

3.1 在EmpMapper接口中的方法名

int delete(int id);

3.2 在EmpMapper.xml中准备的sql语句

<!--删除方法-->
<insert id="delete">
    delete from emp WHERE empno=#{id}
</insert>

3.3 在test文件夹下写的测试代码

public void t4(){
    //连接工厂
    SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
    /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
    SqlSession sqlSession = sf.openSession();
    //调用mapper中的sql 参数写命名空间.id
    /*调用自己的mapper 后面写接口.class*/
    EmpMapper em = sqlSession.getMapper(EmpMapper.class);
    /*点击这个后就提交了*/
    em.delete(8889);
    sqlSession.commit();
    sqlSession.close();
}

3.4 删除结果

3.4.1 删除之前

在这里插入图片描述

3.4.2 运行截图

在这里插入图片描述

3.4.2 删除之后

在这里插入图片描述

3.5 知识点总结

 sqlSession.commit();这是设置了该事务提交,因为transactionManager type="JDBC"是默认是手动提交的
 不写这句话的话,数据库是不会产生任何变化的

4 修改update

4.1 在EmpMapper接口中的方法名

 int update(Emp e);

4.2 在EmpMapper.xml中准备的sql语句

<!--修改方法 实体内里面的属性 丢个对象进去是可以获取对象的值-->
    <update id="update">
        update emp set ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},
        comm=#{comm},deptno=#{deptno}
         where empno=#{empno}
    </update>

4.3 在test文件夹下写的测试代码

 /*这个是修改方法的sql*/
    @org.junit.Test
    public void t5(){
        //连接工厂
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        /*打开一个连接对象 默认是自动提交 类似与connection 它的方法很难用不用*/
        SqlSession sqlSession = sf.openSession();
        //调用mapper中的sql 参数写命名空间.id
        /*调用自己的mapper 后面写接口.class*/
        EmpMapper em = sqlSession.getMapper(EmpMapper.class);
        /*点击这个后就提交了*/
        Emp emp=new Emp(8890,"张三","哈哈哈",1234,"2019-08-03",8888d,6666d,20);
        em.update(emp);
        sqlSession.commit();
        sqlSession.close();
    }

4.4 修改结果

4.4.1 修改之前

在这里插入图片描述

4.4.2 运行截图

在这里插入图片描述

4.4.2 修改之后

在这里插入图片描述

3.5 知识点总结

若你传入的参数是实体类的对象,对应的xml文件中的update标签中可以通过#{实体类属性名}来获取里面的对应的值
${实体类属性名}也是可以获取的值,正如之前所提到的,这个因为安全性的问题,使用场景一般是模糊查找
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SSS4362

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

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

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

打赏作者

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

抵扣说明:

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

余额充值