day14_mybatis1

day14_mybatis1

1mybatis框架介绍

dao层框架 数据持久层 对jdbc做了封装 简化程序编码

ORM框架 实体关系映射 半自动的orm框架 支持sql语句 主要做结果集(ResultSet)的自定封装

数据库 关系型数据库

java 面向对象的语言

2mybatis基本示例(了解)

image-20250812101832483

1引入jar包

pom.xml中增加


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.19</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.38</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.13.4</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>


    </dependencies>

2配置mybatis全局配置文件

mybatis配置文件 加载和启动的参数

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--XML 可扩展标记语言
        可以使用自定义标签
    dtd 模板文件 规范了 不同的xml文件可写的标签不同
        配置文件报红 配置错误 通常无法正常启动和使用
-->
<!-- configuration 配置 -->
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/userMapper.xml"/>
    </mappers>
</configuration>

3配置sql映射文件

存放需要指定的sql语句 根据实体类对应存放

userMapper.xml

image-20250812101128120

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="aa.bb">
    <select id="selectUser" resultType="com.javasm.entity.User">
        select * from user where id = 16
    </select>
</mapper>

4 创建mybatis对象 执行sql语句

import com.javasm.entity.User;
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.jupiter.api.Test;

import java.io.IOException;
import java.io.InputStream;

/**
 * @className: MyBatisTest
 * @description:
 * @author: gfs
 * @date: 2025/8/12 10:00
 * @version: 0.1
 * @since: jdk17
 */
public class MyBatisTest {


    @Test
    public void selectUserTest() throws IOException {

        //创建mybatis公共对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //SqlSession            sql会话
        //SqlSessionFactory     sql会话 工厂  mybatis全局对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //使用mysql连接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user =(User) sqlSession.selectOne("aa.bb.selectUser");
        System.out.println(user);
        sqlSession.close();


    }

}

3mybatis-config.xml 全局配置文件

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--XML 可扩展标记语言
        可以使用自定义标签
    dtd 模板文件 规范了 不同的xml文件可写的标签不同
        配置文件报红 配置错误 通常无法正常启动和使用
-->
<!-- configuration 配置 -->
<configuration>
<!-- 引入独立的sql连接参数配置文件 xxx.properties  -->
    <properties resource="jdbc.properties">
    </properties>
<!-- settings mybatis运行参数  -->
    <settings>
<!-- 开启驼峰转换       -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启mybatis日志输出       -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
<!-- 别名配置 给对象类型起别名 sql映射文件xxxMapper.xml文件中 可以直接使用别名
     别名配置有的公司不用

     mybatis有内置别名  比如  string   java.lang.String
                       80种内置别名
-->
    <typeAliases>
        <typeAlias alias="User" type="com.javasm.entity.User"/>
    </typeAliases>

<!-- 连接数据库的环境 -->
    <environments default="development">
<!-- 允许配置多种环境 使用时通过 default参数 指定dao一个环境
      开发环境
      测试环境
      生产环境
      -->
        <environment id="development">
<!--    事务控制 使用jdbc事务控制         -->
            <transactionManager type="JDBC"/>
<!--    数据源配置 连接基本参数
            数据库连接池   数据库连接 tcp连接
                         维持一定数量的连接 减少建立连接和断开连接的消耗
-->
            <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>

<!-- 配置mybatis要使用的sql映射文件
    支持  配置路径
         配置报名
         配置包扫描

 -->
    <mappers>
        <mapper resource="mapper/userMapper.xml"/>
    </mappers>
</configuration>

注意:

1全局配置文件 只需要配置一次 了解即可

2官网地址 https://mybatis.org/mybatis-3/zh_CN/configuration.html 可以参考官网查看配置参数

3全局配置 在启动mybatis时 会读取并加载入sqlSessionFactory对象

image-20250812112214145

4mybatis接口映射

image-20250812114135426

5.接口映射相关插件

1.mybatisCodeHelperPro 代码提示插件

image-20250812114350939

2easyCode 通过mybatis数据库插件 连接数据库 生成代码

配置jar包 位置

image-20250812115002640

D:\maven\repository\com\mysql\mysql-connector-j\8.3.0

在库表上可以生成需要的java代码

image-20250812115721273

6工具类封装

package com.javasm.utils;

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.InputStream;

/**
 * @className: MyBatisHealper
 * @description:
 * @author: gfs
 * @date: 2025/8/12 14:32
 * @version: 0.1
 * @since: jdk17
 */
public class MyBatisHealper {

    private static SqlSessionFactory sqlSessionFactory;
    static{
        try{
            //创建mybatis公共对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //SqlSession            sql会话
            //SqlSessionFactory     sql会话 工厂  mybatis全局对象
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    //获得连接
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
    //归还连接
    public static void backSqlSession(SqlSession sqlSession){
        sqlSession.close();
    }
    //提交事务 归还连接
    public static void backAndSaveSqlSession(SqlSession sqlSession){
        sqlSession.commit();
        sqlSession.close();
    }

}

7sql映射文件的 用法

1传参

动态参数标记 #{} 动态参数标记 需要配合传参使用

​ ${} 动态参数标记

{} 与 ${} 区别

{} 使用 ? 占位符 主要用于 参数传参

${} sql 硬拼接 主要用于 拼接sql语法

//切换排序顺序场景使用 
select * from emp
     order by sal ${sort}
  1 简单数据  字符串  数字  bol
    在接口方法的形参中标记 在sql映射文件中 使用#{xxx}取值 可以不对应 尽量还是用形参名
  2 对象数据  自定义数据对象
    标记传入对象
    List<Emp> listEmpByJobAndDept(Emp emp);
    在sql映射文件中 直接使用对象的属性
    select * from emp where job = #{job} and deptno = #{deptno}
    注意 核对属性与sql语句的对应关系
         如果使用的属性名错误 会报错

  3 使用map传参 (尽量少用)
    如果要使用map 使用mybatis提供的自动封装map功能
    List<Emp> listEmpByJobAndDept3(@Param("myjob") String job,@Param("mydeptno")Integer deptno);
    sql映射文件中 直接使用map的key
    select * from emp where job = #{myjob} and deptno = #{mydeptno}

  4 使用list传参
    很少使用

传入不同参数的案例

EmpDao.java

    List<Emp> listEmp(Integer empno);

    List<Emp> listEmp2(Integer empno);

    List<Emp> listEmpByJobAndDept(Emp emp);

    List<Emp> listEmpByJobAndDept2(Map paramMap);

// 自动封装map
    List<Emp> listEmpByJobAndDept3(@Param("myjob") String job,@Param("mydeptno")Integer deptno);


    List<Emp> listEmpByJobAndDept4(List paraList);


    List<Emp> listEmpSortBySal(String sort);

EmpMapper.xml

   <select id="listEmp"   resultType="com.javasm.entity.Emp">
        select * from emp where empno = #{xxxx}
    </select>

    <select id="listEmp2"  resultType="com.javasm.entity.Emp">
        select * from emp where empno = ${xxxx}
    </select>

    <select id="listEmpByJobAndDept" resultType="com.javasm.entity.Emp">
        select * from emp where job = #{job} and deptno = #{deptno}
    </select>

    <select id="listEmpByJobAndDept2" resultType="com.javasm.entity.Emp">
        select * from emp where job = #{paramJob} and deptno = #{paramDeptno}
    </select>


    <select id="listEmpByJobAndDept3" resultType="com.javasm.entity.Emp">
        select * from emp where job = #{myjob} and deptno = #{mydeptno}
    </select>

    <select id="listEmpByJobAndDept4" resultType="com.javasm.entity.Emp">
        select * from emp where job = #{list[0]} and deptno = #{list[1]}
    </select>

    <select id="listEmpSortBySal" resultType="com.javasm.entity.Emp">

        select * from emp
        order by sal ${sort}

    </select>

测试类测试方法

    @Test
    public void listEmpTest(){
        SqlSession sqlSession = MyBatisHealper.getSqlSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);

        List<Emp> emps = mapper.listEmp(1001);
        List<Emp> emps1 = mapper.listEmp2(1001);
        System.out.println(emps);
        MyBatisHealper.backSqlSession(sqlSession);

    }

    @Test
    public void listEmpByJobAndDeptTest(){
        SqlSession sqlSession = MyBatisHealper.getSqlSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);

        Emp inputEmp = new Emp();
        inputEmp.setJob("经理");
        inputEmp.setDeptno(10);

        List<Emp> emps = mapper.listEmpByJobAndDept(inputEmp);
        System.out.println(emps);
        MyBatisHealper.backSqlSession(sqlSession);

    }

    @Test
    public void listEmpByJobAndDeptTest2(){
        SqlSession sqlSession = MyBatisHealper.getSqlSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);

        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("paramJob","12");
        paramMap.put("paramDeptno",10);
        List<Emp> emps = mapper.listEmpByJobAndDept2(paramMap);
        System.out.println(emps);
        MyBatisHealper.backSqlSession(sqlSession);

    }

    @Test
    public void listEmpByJobAndDeptTest3(){
        SqlSession sqlSession = MyBatisHealper.getSqlSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);

        List<Emp> emps = mapper.listEmpByJobAndDept3("经理",30);
        System.out.println(emps);
        MyBatisHealper.backSqlSession(sqlSession);

    }

    @Test
    public void listEmpByJobAndDeptTest4(){
        SqlSession sqlSession = MyBatisHealper.getSqlSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);
        List listParam = new ArrayList();
        listParam.add("理塘");
        listParam.add(11);
        List<Emp> emps = mapper.listEmpByJobAndDept4(listParam);

        System.out.println(emps);
        MyBatisHealper.backSqlSession(sqlSession);

    }


    @Test
    public void listEmpSortBySalTest(){
        SqlSession sqlSession = MyBatisHealper.getSqlSession();
        EmpDao mapper = sqlSession.getMapper(EmpDao.class);
        List<Emp> emps = mapper.listEmpSortBySal("desc");
        System.out.println(emps);
        MyBatisHealper.backSqlSession(sqlSession);

    }

2返回值类型

  resultType  标记单条数据的类型
  两种形式    1  返回实体对象     查询语句使用
             2  返回Integer    添加 修改 删除语句 使用

             3  返回String     个别请情况 如果只想查询某个字段 或者某个字段的集合

3 常用sql语句用法

3.1查询语句
//模糊查询   
List<Emp> listEmpByEname(String ename);
//sql映射
    <select id="listEmpByEname" resultType="com.javasm.entity.Emp">
        select * from emp  where  ename LIKE CONCAT('%',#{ename},'%')
    </select>

注意 模糊查询的语法        
//统计查询
Integer  countEmp();
//sql映射
    <select id="countEmp" resultType="java.lang.Integer">
        select count(1) from emp
    </select>
注意 统一查询的返回值
//查询单条
Emp getEmpByEmpno(Integer empno);
//sql映射
    <select id="getEmpByEmpno" resultType="com.javasm.entity.Emp">
        select * from emp where empno = #{empno}
    </select>

单条查询基本语法        
//查询多条
List<Emp> listEmpByJob(String job);
//sql映射	
    <select id="listEmpByJob" resultType="com.javasm.entity.Emp">
        select * from emp where job = #{job}
    </select>

多条查询基本语法  
3.2添加语句
//普通添加
    //添加用户
    Integer insertEmp(Emp inputEmp);
//sql映射
    <insert id="insertEmp">
        insert into emp (empno,ename,job,mgr)
        VALUES (#{empno},#{ename},#{job},#{mgr})

    </insert>


获取自增主键 在程序中使用

//添加用户 使用自增主键 获取自增主键
    Integer insertEmp2(Emp inputEmp);
//sql映射
<!-- 获取自增主键 把自增主键的值 传入主键属性 -->
    <insert useGeneratedKeys="true" keyProperty="empno" id="insertEmp2">
        insert into emp (ename,job,mgr) VALUES (#{ename},#{job},#{mgr})
    </insert>

image-20250812163952293

3.3修改语句
//修改工资
    Integer updateEmp(@Param("sal") Double sal,@Param("comm")Double comm,@Param("empno")Integer empno);
//sql映射
    <update id="updateEmp">
        update emp set sal = #{sal},comm = #{comm} where empno = #{empno}
    </update>

3.4删除语句
//删除Emp
    Integer deleteEmp(Integer empno);
//sql映射
    <delete id="deleteEmp">
        delete from emp where empno = #{empno}
    </delete>
3.5插件能适配的dao方法名规范
查询
   单条查询    getXXX
   多条查询    listXXX
添加           insertXXX
修改           updateXXX
删除           deleteXXX

带条件   ByXXX
带排序   OrderXXX

  

作业

image-20250812165455470

1 通过easyCode 生成 实体类 com.javasm.entity

​ dao com.javasm.dao

​ mapper 资源根目录 mapper

​ 如果没有建立好 会提示建立目录

2 做dept表的增删改查

查询 查询dept列表 dname模糊 loc 精确

​ 查询dept单条 通过deptno

添加 添加一条dept数据 获取自增主键

修改 修改部门名称

删除 删除一条部门数据

posted @ 2025-08-16 15:32  小胡coding  阅读(11)  评论(0)    收藏  举报