MyBatis框架基本使用

目录

一、向sql语句传参

二、数据输入

三、数据输出

四、别名


一、向sql语句传参

1.基本使用MyBatis框架

使用到的jar包如下:

<!--    测试包-->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>RELEASE</version>
      <scope>test</scope>
    </dependency>
<!--  MyBatis核心-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>
<!--  数据库连接-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.33</version>
    </dependency>

使用MyBatis需要实现一个实体类对应一张表对应一个业务接口对应一个mapper映射

其中的mapper映射相当于业务接口的实现类。只不过通过mapper.xml配置文件将Java代码和sql代码实现区分。

注意:在业务接口中定义的方法不能进行重载,因为通过xml配置时候,配置对于的方法sql语句只看方法名称。

如下:

public interface EmployeeMapper {
    //通过id查找员工
     Employee queryById(Integer id);
  
    //通过id name 查找员工
     Employee queryById(Integer id,String name);

}

由于使用了相同的方法名称,会导致在xml根据方法名称封装对于sql语句时候出现问题。

2.使用${ key } 和 #{ key }传参

案例代码:

<!-- 通过#{key}传入参数   -->
    <select id="queryById" resultType="com.alphamilk.pojo.Employee">
        select * from mysqltest.employee where id = #{id}
    </select>
<!--通过${key} 传入参数-->
    <select id="queryByName" resultType="com.alphamilk.pojo.Employee">
        select * from mysqltest.employee where name = ${name}
    </select>

区别:

#{key}的本质是进行占位符处理,在代码中替代id的值。【推荐使用】

${key}的本质是进行拼接字符串,在案例代码中即封装成一个完整的sql语句。

注意:使用#{key}的值代替时候,不能传入列名,容器名。

3.实现MyBatis测试功能

完成测试功能需要实现以下几个步骤

1.创建ibatis的资源类 is

2.创建SqlSessionFactoryBuilder对象并进行Build( is ) 获取SqlSessionFactory对象

3.通过SqlSessionFactory对象的openSession方法获取SqlSession

4.获取Mapper对象

5.执行对于操作

6.提交事务和关闭相关流

案例代码:

public class MybatisTest {

    @Test
    public void Test() throws IOException {
        //步骤1,读取资源
        InputStream is = Resources.getResourceAsStream("mybatisConfig.xml");
        //步骤2,创建sqlSessionFactory
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        //步骤3,创建SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //步骤4,获取Mapper对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        //执行对应操作
        Employee employee = employeeMapper.queryById(1);
        System.out.println(employee);
        //管理事务提交与关闭操作
        sqlSession.close();

    }
}

二、数据输入

数据输入的概念:

这里数据输入具体是指上层方法(例如Service方法)调用Mapper接口时,数据传入的形式。

  • 简单类型:只包含一个值的数据类型
    • 基本数据类型:int、byte、short、double、……
    • 基本数据类型的包装类型:Integer、Character、Double、……
    • 字符串类型:String
  • 复杂类型:包含多个值的数据类型
    • 实体类类型:Employee、Department、……
    • 集合类型:List、Set、Map、……
    • 数组类型:int[]、String[]、……
    • 复合类型:List<Employee>、实体类中包含集合……

1.单个简单数据类型

由于只有一个简单参数,所以#{key}或者${key}中的key可以填写任意的值,当然推荐还是使用原本的参数名。

2.实体对象类型

当传入的数据是实体对象类型时候,只需要一一对应其属性即可

案例:

3.多个简单数据类型

当出现业务方法中有多个参数时候注意此时#{key}或者${key}中的key不能乱写,并且也不能通过形参的方式直接输入。面对多个简单数据类型的输入有两种方案解决问题。

  3.1 使用注解参数解决

需要用到@Param注解

案例:

  3.2使用顺序方式解决

参数还可以arg0 、arg1...的顺序进行参数匹配

案例代码:

4.map类型

传入key=map即可

接口对应的抽象方法

int updateEmployeeByMap(Map<String, Object> paramMap);

对应的sql语句

<update id="updateEmployeeByMap">

  update t_emp set emp_salary=#{empSalaryKey} where emp_id=#{empIdKey}

</update>

使用场景

有很多零散的参数需要传递,但是没有对应的实体类类型可以使用。使用@Param注解一个一个传入又太麻烦了。所以都封装到Map中。


三、数据输出

数据输出概念:

数据输出总体上有两种形式:

  • 增删改操作返回的受影响行数:直接使用 int 或 long 类型接收即可
  • 查询操作的查询结果

 我们需要做的是,指定查询的输出数据类型即可!

 并且插入场景下,实现主键数据回显示!

1.单个简单类型

<!--此处的namespace修改为对应的接口全类名-->
<mapper namespace="com.alphamilk.EmployeeMapper">
<!--    resultType 对应 类型的全限定符-->
    <select id="querySalaryById" resultType="java.lang.Integer">
        select salary from mysqltest.employee where id = #{id}
    </select>

    <select id="queryNameById" resultType="java.lang.String">
        select  name from mysqltest.employee where id=#{id}
    </select>
</mapper>

 在一般的简单类型中,Java都有对应的简写,可以用String int 去取代java.lang.String等

2.返回实体类对象

返回类的全限定符加类名

<!--此处的namespace修改为对应的接口全类名-->
<mapper namespace="com.alphamilk.EmployeeMapper">
<!--    resultType 对应 类型的全限定符-->
   <select id="" resultType="com.alphamilk.pojo.Employee">
       
   </select>
</mapper>

3.返回Map类型

<!-- Map<String,Object> selectEmpNameAndMaxSalary(); -->
<!-- 返回工资最高的员工的姓名和他的工资 -->
<select id="selectEmpNameAndMaxSalary" resultType="map">
  SELECT
    emp_name 员工姓名,
    emp_salary 员工工资,
    (SELECT AVG(emp_salary) FROM t_emp) 部门平均工资
  FROM t_emp WHERE emp_salary=(
    SELECT MAX(emp_salary) FROM t_emp
  )
</select>

4.返回List类型

<!-- List<Employee> selectAll(); -->
<select id="selectAll" resultType="com.atguigu.mybatis.entity.Employee">
  select emp_id empId,emp_name empName,emp_salary empSalary
  from t_emp
</select>

5.返回主键值

<!-- int insertEmployee(Employee employee); -->
<!-- useGeneratedKeys属性字面意思就是“使用生成的主键” -->
<!-- keyProperty属性可以指定主键在实体类对象中对应的属性名,Mybatis会将拿到的主键值存入这个属性 -->
<insert id="insertEmployee" useGeneratedKeys="true" keyProperty="empId">
  insert into t_emp(emp_name,emp_salary)
  values(#{empName},#{empSalary})
</insert>

四、别名

由于输出返回值时候要填写的内容包括类的全限定符,这种操作比较麻烦,所以Java中自带了72种默认的别名,比如java.lang.String可以直接写为String等等。但是对于一般的实体对象类型是没有

1.xml设置别名

在MyBatis-config.xml中进行配置

单个起别名

案例代码:

   <typeAliases>
<!--        单个xml配置-->
        <typeAlias type="com.alphamilk.pojo.Employee" alias="Employee"/>
    </typeAliases>
    

包起别名

当在包起别名的时候,在包下所有的类的别名都对应其类名

   <typeAliases>
<!--        包起别名-->
        <package name="com.alphamilk.pojo.Employee"/> 
    </typeAliases>

2.注解别名

如果认为在xml中配置十分麻烦并且不美观,则可以在实体类中对应使用注解方式进行起别名


猜你喜欢

转载自blog.csdn.net/dogxixi/article/details/132832373