Mybatis基础(中)

116 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

配置文件说明

常见的配置属性

configuration(配置)

  • properties(属性)

  • settings(设置)

  • typeAliases(类型别名)

  • environments(环境配置)

    • environment(环境变量)

      • transactionManager(事务管理器)
      • dataSource(数据源)
  • mappers(映射器)

注意:mybatis配置文件中标签的顺序是指定的依次是:

properties(属性)->settings(设置)->typeAliases(类型别名)->environments(环境配置)->mappers(映射器)

properties(属性)

设置个jdbc.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/Mybatis
jdbc.username=root
jdbc.password=123456

导入到配置文件mybatis-config.xml中

<!--引l入properties文件,此后就可以在当前文件中使用${ key}的方式访问value-->
<properties resource="jdbc.properties"/>

之后就可以将datasource部分进行替换

<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>

environments(环境配置)

<?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>
    <!--引l入properties文件,此后就可以在当前文件中使用${ key}的方式访问value-->
    <properties resource="jdbc.properties"/>
    <!--
        environments:配置链接数据库的环境
        属性:default:设置默认使用环境的id
    -->
    <environments default="development">
        <!--
            environment:设置一个具体的链接数据库的环境
            属性:id:设置数据库的唯一表示,不能重复
        -->
        <environment id="development">
            <!--
                transactionManager:设置事务管理器
                属性:
                type:设置事务管理的方式
                type="JDBC /MANAGED”
                JDBC:表示使用JDBC中原生的事务管理方式
                MANAGED:被管理,例如Spring
            -->
            <transactionManager type="JDBC"/>
            <!--
                datasource:设置数据源
                属性:
                type:设置数据源的类型
                type="PoOLED/ UNPOOLED | JNDI"
                POOLED:表示使用数据库连接池
                UNPOOLED:表示不使用数据库连接池了
                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>
        
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/Mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
​
    <!--引入mybatis映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

typeAliases(类型别名)

注:该标签根据顺序需放在properties和setting标签后

<typeAliases>
    <!-- type:需要起别名的类型,alias:别名-->
    <!-- <typeAlias type="com.sentiment.pojo.User" alias="xxx"></typeAlias> -->
    
    <!--若不设置alias别名,则默认将类名当成别名,且不区分大小写-->
    <!-- <typeAlias type="com.sentiment.pojo.User"></typeAlias> -->
    
    <!-- 通过包名设置类型别名,默认将类名当成别名,且不区分大小写-->
    <package name="com.sentiment.pojo"/>
</typeAliases>

mapper(映射器)

若需要同时导入多个mapper.xml配置文件时,也可以包的形式全部导入,但需要满足如下两点:

<mappers>
    <!-- <mapper resource="mappers/UserMapper.xml"/> -->
    <!--
    以包的方式引入映射文件,但是必须满足两个条件:
     1、mapper接口和映射文件所在的包必须一致
     2、mapper接口的名字和映射文件的名字必须一致
     -->
    <package name="com.sentiment.mapper"/>
</mappers>

创建核心文件和映射文件模板

File -> Setting -> Editor -> File and Code Templates

image-20220902154028335.png

Mybatis获取参数的两种方式

MyBatis获取参数值的两种方式:${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值

{}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号({}可以有效的避免sql注入)

单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型

此时可以使用{}和#{}以任意的名称获取参数的值,注意{}需要手动加单引号

接口

User getUsername(String username);

mapper配置文件

<select id="getUsername" resultType="User">
    <!-- select * from t_user where username=#{username} -->
    select * from t_user where username='${username}'
</select>

实现

public void GetUsername(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user=mapper.getUsername("Sentiment");
    System.out.println(user);
}

多个字面量类型的参数

若mapper接口方法的参数为多个的字面量类型

此时Mybatis会将参数放在map集合中,以两种方式存储(也可arg,param混合使用):

  • 以arg0,arg1.....为键,以参数为值
  • 以param1,param2....为键,以参数为值

接口

User checklogin(String username ,String password);

配置文件

<select id="checklogin" resultType="User">
    <!--select * from t_user where username=#{arg0} and password=#{arg1}-->
    select * from t_user where username='${param1}' and password='${param2}'
</select>

通过Map自定义参数

若mapper接口中的方法需要多个参数时,此时可以手动创建map集合,讲这些数据放在map中,并通过${}或#{}访问map集合的键就可以获取对应的值

接口

User checkLoginByMap(Map<String,Object> map);

配置文件

<select id="checkLoginByMap" resultType="User">
    <!-- select * from t_user where username=#{username} and password=#{password};-->
    select * from t_user where username='${username}' and password='${password}'
</select>

实现

public void CheckLoginByMap(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> map = new HashMap<>();
    map.put("username","Sentiment");
    map.put("password",123456);
    User user=mapper.checkLoginByMap(map);
    System.out.println(user);
}

实体型类型的参数

需要通过#{}和${}访问实体类中的属性就可以获取相对应的属性值

接口

int insertUser(User user);

配置文件

<insert id="insertUser">
    insert into t_user values(#{id},#{username},#{password},#{age},#{gender},#{email})
</insert>

实现

public void insertUser(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user=new User(4,"xxx","123456",20,"男","123456@qq.com");
    mapper.insertUser(user);
}

@Param注解

通过接口定义@Param,此时mybatis会将注解中的参数放在map中进行存储,有两种存储方式:

  • 以@Param注解中的value属性值为键,以参数为值
  • 以param1,param2....为键,以参数为值

接口

User checkLoginByParam(@Param("username") String username,@Param("password") String password);

配置文件

<select id="checkLoginByParam" resultType="User">
    <!-- select * from t_user where username=#{param1} and password=#{param2} -->
    select * from t_user where username=#{username} and password=#{password}
</select>

实现

public void checkLoginByParam(){
    SqlSession sqlSession = SqlSeesionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user=mapper.checkLoginByParam("Sentiment","123456");
    System.out.println(user);
    }
}