MyBatis使用-2-MyBatis标签的使用

目录

0、Maven项目结构

1、MyBatis的全局配置文件:myBatis-config.xml

1.1 properties:引入外部配置文件

1.1.1 数据库配置文件:jdbc.properties

1.1.2 MyBatis的全局配置文件:myBatis-config.xml

1.2 settings:设置MyBatis的属性

1.2.1 mapUnderscoreToCamelCase:开启驼峰命名的自动匹配

1.3 typeAlisses:项目中定义的类的别名

1.4 typeHandlers:数据库类型和java类型的映射

1.5 plugins:MyBatis插件

扫描二维码关注公众号,回复: 12141566 查看本文章

1.6 environments:MyBatis配置多种环境

1.7 databaseIdProvider:MyBatis支持多种不同的数据库厂商

1.7.1 不同类型的数据库厂商配置:jdbc.properties

1.7.2 MyBatis全局配置文件给不同数据库厂商起别名:mybatis-config.xml

1.7.3 MyBatis全局配置文件中不同数据库环境下的environment配置:mybatis-config.xml

1.7.4 mapper.xml文件中使用不同的数据库厂商标识ID

1.7.5 每个表所对应的xxxMapper.xml配置文件需要注册在MyBatis全局配置文件中才能被使用

2、MyBatis的映射文件

2.1 MyBatis的增删改查

2.1.1 EmployeeTest 类

2.1.2 EmployeeDao 接口

2.1.3 EmployeeMapper.xml

2.1.4 测试结果

2.2 向DB中插入一条数据时自动返回该条数据的自增主键ID

2.3 MyBatis的参数处理

2.3.1 参数是单个时,MyBatis不会做特殊处理直接使用即可

2.3.2 参数是多个时,建议使用@Param命名参数

2.3.3 参数是entity时,建议使用@Param命名参数

2.3.4 参数是map时,建议使用@Param命名参数

2.4 MyBatis中 #{ } 和 ${ } 之间的区别和联系

2.5 Select元素详解

2.5.1 myBatis的返回值是个List集合时

2.5.2 myBatis的返回值是一个entity时把它封装成一个Map

2.5.3 myBatis的返回值是多个entity时, 把它封装成一个Map(key=id, value=entity)时

2.6 MyBatis结果集的自动映射

2.6.1 无级联版本:DAO层接口+mapper.xml配置文件+测试

2.6.2 select-resultMap-关联查询-级联属性封装

0、Maven项目结构

1、MyBatis的全局配置文件:myBatis-config.xml

1.1 properties:引入外部配置文件

1.1.1 数据库配置文件:jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.username=root
jdbc.password=root

1.1.2 MyBatis的全局配置文件: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>

    <!--1.MyBatis可以使用properties标签来引入外部的properties配置文件:
    (1)url:引用网络路径下或者磁盘路径的资源
    (2)resource:引入类路径下的资源
    -->
    <properties resource="jdbc.properties"/>

    <!--配置MyBatis运行环境的全局配置文件-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置POOLED类型的JDBC数据源连接池-->
            <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/EmployeeMapper.xml"/>
    </mappers>

</configuration>

1.2 settings:设置MyBatis的属性

1.2.1 mapUnderscoreToCamelCase:开启驼峰命名的自动匹配

    <!--2.MyBatis的设置,settings标签包含很多的设置项
    (1)name:设置项的名称
    (2)value:设置项的取值-->
    <settings>
        <!--开启在控制台打印SQL日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--开启自动的驼峰命名匹配-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

1.3 typeAlisses:项目中定义的类的别名

    <!--3.MyBatis中entity别名的设置,这里使用的是包,也即包下的所有类都有别名了,默认的别名是类名的首字母小写-->
    <typeAliases>
        <package name="com.wind.entity"/>
    </typeAliases>

1.4 typeHandlers:数据库类型和java类型的映射

1.5 plugins:MyBatis插件

1.6 environments:MyBatis配置多种环境


    <!--4.配置MyBatis运行环境的全局配置文件-->
    <!--
    (1)environments:环境们,MyBatis可以配置多种不同的环境以提供给不同的角色使用,比如配置一个环境给开发使用【development】,再配置一个环境给测试使用【test】。
    (2)environment:每一个具体的环境信息,id 是该环境信息的唯一标识,比如配置一个环境给开发使用【development】,再配置一个环境给测试使用【test】,
        它被用在environments标签后面的default属性中。
        同时,environment必须要有两个标签:
        (2.1)transactionManager:配置数据库的事务管理器
            JDBC:JdbcTransactionFactory
            MANAGED:ManagedTransactionFactory
        (2.2)dataSource:配置数据源,有三种选择
            POOLED:PooledDataSourceFactory
            UNPOOLED:UnpooledDataSourceFactory
            JNDI:JndiDataSourceFactory
    -->
    <environments default="test">

        <!--1.给测试使用的数据源环境-->
        <environment id="test">
            <transactionManager type="JDBC"/>
            <!--配置POOLED类型的JDBC数据源连接池-->
            <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>

        <!--2.给开发使用的数据源环境-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置POOLED类型的JDBC数据源连接池-->
            <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>

1.7 databaseIdProvider:MyBatis支持多种不同的数据库厂商

1.7.1 不同类型的数据库厂商配置:jdbc.properties

1.7.2 MyBatis全局配置文件给不同数据库厂商起别名:mybatis-config.xml

1.7.3 MyBatis全局配置文件中不同数据库环境下的environment配置:mybatis-config.xml

1.7.4 mapper.xml文件中使用不同的数据库厂商标识ID

1.7.5 每个表所对应的xxxMapper.xml配置文件需要注册在MyBatis全局配置文件中才能被使用

    <!--单个mapper注册:把一个个的mapper配置文件注册到全局配置文件中-->
    <mappers>
        <mapper resource="mapper/EmployeeMapper.xml"/>
    </mappers>

2、MyBatis的映射文件

2.1 MyBatis的增删改查

2.1.1 EmployeeTest 类

import com.wind.dao.EmployeeDao;
import com.wind.entity.EmployeeEntity;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
public class EmployeeTest {

    public static void main(String[] args) {
        //1.加载MyBatis配置文件
        InputStream inputStream = EmployeeTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //2.获取实现接口的代理对象
        EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
        System.out.println(employeeDao);
        //增
        EmployeeEntity entity = new EmployeeEntity();
        entity.setName("小刘");
        entity.setGender("男");
        entity.setEmail("[email protected]");
        Integer addResult = employeeDao.addEmployee(entity);
        System.out.println(addResult);

        //删
        Boolean deleteResult = employeeDao.deleteEmployee(20);
        System.out.println(deleteResult);

        //改
        EmployeeEntity entity2 = new EmployeeEntity();
        entity2.setId(4);
        entity2.setName("小刘2");
        entity2.setGender("男");
        entity2.setEmail("[email protected]");
        Boolean updateResult = employeeDao.updateEmployee(entity2);
        System.out.println(updateResult);

        //查
        EmployeeEntity entity3 = employeeDao.queryEmployeeById(4);
        System.out.println(entity3);

        //提交数据
        sqlSession.commit();

        //上面那个sqlSession关闭
        sqlSession.close();
    }
}

2.1.2 EmployeeDao 接口

package com.wind.dao;

import com.wind.entity.EmployeeEntity;
import org.apache.ibatis.annotations.Param;

/**
 * @Description: 这是与MyBatis中的mapper.xml文件相互绑定的接口。注意:该接口是用来操作DB的。
 */
public interface EmployeeDao {
    //增
    Integer addEmployee(@Param("entity") EmployeeEntity entity);
    //删
    Boolean deleteEmployee(@Param("id") int id);
    //改
    Boolean updateEmployee(@Param("entity") EmployeeEntity entity);
    //查
    EmployeeEntity queryEmployeeById(@Param("id") int id);
}

2.1.3 EmployeeMapper.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.xml文件都有一个命名空间,该命名空间表示:该mapper.xml文件和哪个接口绑定起来。
注意:该接口是用来操作DB的。-->
<mapper namespace="com.wind.dao.EmployeeDao">

    <insert id="addEmployee">
        insert into TBL_Employee (name, gender, email)
        values (#{entity.name}, #{entity.gender}, #{entity.email})
    </insert>

    <delete id="deleteEmployee">
        delete from TBL_Employee
        where id = #{id}
    </delete>

    <update id="updateEmployee">
        update TBL_Employee
        set name = #{entity.name}, gender = #{entity.gender}, email = #{entity.email}
        where id = #{entity.id}
    </update>

    <select id="queryEmployeeById" parameterType="int" resultType="EmployeeEntity">
        select *
        from TBL_Employee
        where id = #{id}
    </select>

</mapper>

2.1.4 测试结果

2.2 向DB中插入一条数据时自动返回该条数据的自增主键ID

2.3 MyBatis的参数处理

2.3.1 参数是单个时,MyBatis不会做特殊处理直接使用即可

Boolean deleteEmployee(@Param("id") int id);
    <delete id="deleteEmployee">
        delete from TBL_Employee
        where id = #{id}
    </delete>

2.3.2 参数是多个时,建议使用@Param命名参数

EmployeeEntity queryEmployeeByIdName(@Param("id") int id, @Param("name") String name);
    <select id="queryEmployeeByIdName" resultType="EmployeeEntity">
        select *
        from TBL_Employee
        where id = #{id} and name = #{name}
    </select>

2.3.3 参数是entity时,建议使用@Param命名参数

Integer addEmployee(@Param("entity") EmployeeEntity entity);
   <insert id="addEmployee" keyProperty="entity.id" useGeneratedKeys="true">
        insert into TBL_Employee (name, gender, email)
        values (#{entity.name}, #{entity.gender}, #{entity.email})
    </insert>

2.3.4 参数是map时,建议使用@Param命名参数

EmployeeEntity queryEmployeeByMap(Map<String, Object> map);

//下面是测试代码
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 4);
map.put("name", "小刘2");
EmployeeEntity employeeEntity = employeeDao.queryEmployeeByMap(map);
System.out.println(employeeEntity);
  <select id="queryEmployeeByMap" resultType="EmployeeEntity">
        select *
        from TBL_Employee
        where id = #{id} and name = #{name}
    </select>

2.4 MyBatis中 #{ } 和 ${ } 之间的区别和联系

2.5 Select元素详解

2.5.1 myBatis的返回值是个List集合时

List<EmployeeEntity> queryEmployeeByName(@Param("name") String name);

//下面是测试代码
List<EmployeeEntity> list = employeeDao.queryEmployeeByName("%小%");
System.out.println(list);
 <select id="queryEmployeeByName" resultType="com.wind.entity.EmployeeEntity">
        select *
        from TBL_Employee
        where name like #{name}
</select>

2.5.2 myBatis的返回值是一个entity时把它封装成一个Map

Map<String, Object> queryEmployeeReturnMap(@Param("id") int id);

//下面是测试代码
Map<String, Object> objectMap = employeeDao.queryEmployeeReturnMap(1);
System.out.println(objectMap);
    <select id="queryEmployeeReturnMap" resultType="java.util.Map">
        select *
        from TBL_Employee
        where id = #{id}
    </select>

2.5.3 myBatis的返回值是多个entity时, 把它封装成一个Map(key=id, value=entity)时

    //是多条记录的内容封装成map
    //key=EmployeeEntity的ID,value=EmployeeEntity
    //key=EmployeeEntity的name,value=EmployeeEntity也OK的
    @MapKey("id")
    Map<Integer, EmployeeEntity> queryEmployeesReturnMap(@Param("name") String name);

//下面是测试代码
        Map<Integer, EmployeeEntity> entityMap = employeeDao.queryEmployeesReturnMap("%小%");
        System.out.println(entityMap);
    <select id="queryEmployeesReturnMap" resultType="com.wind.entity.EmployeeEntity">
        select *
        from TBL_Employee
        where name like #{name}
    </select>

2.6 MyBatis结果集的自动映射

2.6.1 无级联版本:DAO层接口+mapper.xml配置文件+测试

EmployeeEntity queryEmployeeById(@Param("id") int id);
<?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.xml文件都有一个命名空间,该命名空间表示:该mapper.xml文件和哪个接口绑定起来。
注意:该接口是用来操作DB的。-->
<mapper namespace="com.wind.dao.EmployeeDao">

    <resultMap id="myEmployeeEntity" type="com.wind.entity.EmployeeEntity">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="gender" property="gender"/>
        <result column="email" property="email"/>
    </resultMap>

    <select id="queryEmployeeById" parameterType="int" resultMap="myEmployeeEntity">
        select *
        from TBL_Employee
        where id = #{id}
    </select>

</mapper>
import com.wind.dao.EmployeeDao;
import com.wind.entity.EmployeeEntity;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EmployeeTest {

    public static void main(String[] args) {
        //1.加载MyBatis配置文件
        InputStream inputStream = EmployeeTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //2.获取实现接口的代理对象
        EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
        System.out.println(employeeDao);
        EmployeeEntity employeeEntity = employeeDao.queryEmployeeById(1);
        System.out.println(employeeEntity);

        //提交数据
        //sqlSession.commit();

        //上面那个sqlSession关闭
        sqlSession.close();
    }
}

2.6.2 select-resultMap-关联查询-级联属性封装

(1)方式一:级联查询

(2)方式二:级联查询:一个Entity的一个属性是另一个entity的普通字段时,使用association

(3)方式三:分步查询:association,非懒加载

(4)方式四:分步查询:association,懒加载的方式,在全局配置文件中新增2个配置

(5)方式五:Entity的一个属性是一个list集合时,使用collection

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/111731272
今日推荐