1. CRUD

1.1 select

UserMapper

public interface UserMapper {
    List<User> getUserList();

    // 根据Id查询用户
    User getUserById(int id);
}

在UserMapper.xml 有这样:

<mapper namespace="com.dao.UserMapper">
    <!--id 对应着方法名-->
    <select id="getUserList" resultType="com.pojo.User" parameterType="">
        select * from mybatis.user;
    </select>
</mapper>

其中

  • select 对应着sql中的sql
  • id 对应着 UserMapper类中的函数(namespace所指向的类)
  • resultType: sql语言执行的返回值;
  • parameterType:参数类型

若使用parameterType,在UserMapper对应getUserById.在UserMapper.xml 可以这样写:

<mapper namespace="com.dao.UserMapper">

    <!--id 对应着方法名-->
    <select id="getUserList" resultType="com.pojo.User">
        select * from mybatis.user;
    </select>

    <select id="getUserById" parameterType="int" resultType="com.pojo.User">
        select * from user where id = #{id}
    </select>
</mapper>

1.2. Create

增加对应着:insert标签,
UserMapper

public interface UserMapper {
    // 查找用户
    //增加用户
    int addUser(User user);
    //删除用户
    //修改用户
}

在UserMapper.xml 对应着:

    <!-- 这里插入一个User对象, #{id}, #{name}, #{pwd} 可以直接从改对象中取值-->
    <insert id="addUser" parameterType="com.pojo.User" >
        insert into mybatis.user(id, name, pwd) values (#{id}, #{name}, #{pwd})
    </insert>

Test:

    @Test
    public void testAddUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        int result = userMapper.addUser(new User(4,"李西","7895"));
        if( result >1 ){
            System.out.println("insert successful");
        }
        // 提交事务
        sqlSession.commit();

        sqlSession.close();
    }

值得注意的是:在执行完增加操作后,需要提交事务,才能将值写入到数据库中去:
sqlSession.commit();

1.3. Update

增加对应着:update标签,
UserMapper

public interface UserMapper {
    // 查找用户
    //增加用户
    //删除用户
    //修改用户
    int updateUser(User user);
}

在UserMapper.xml 对应着:

    <!-- 这里插入一个User对象, #{id}, #{name}, #{pwd} 可以直接从改对象中取值-->
   <update id="updateUser" parameterType="com.pojo.User">
        update user set name = #{name},pwd = #{pwd} where id = #{id}
    </update>

Test:

   @Test
    public void testUpdateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        int res = userMapper.updateUser(new User(4,"Po张三","123asd"));
        if( res > 0){
            System.out.println("update successful");
        }

        sqlSession.commit();
        sqlSession.close();
    }

值得注意的是:在执行完增加操作后,需要提交事务,才能将值写入到数据库中去:
sqlSession.commit();

1.4. Delete

删除对应着:delete标签,
UserMapper

public interface UserMapper {
    // 查找用户
    //增加用户
    int deleteUser(int id);
    //删除用户

    //修改用户
}

在UserMapper.xml 对应着:

    <!-- 这里插入一个User对象, #{id}, #{name}, #{pwd} 可以直接从改对象中取值-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{id}
    </delete>

Test:

  @Test
    public void testDelteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        int res = userMapper.deleteUser(4);
        if( res > 0){
            System.out.println("delete sucessful");
        }
        sqlSession.commit();
        sqlSession.close();
    }

值得注意的是:在执行完增加操作后,需要提交事务,才能将值写入到数据库中去:
sqlSession.commit();

1.5. 注意

  • 增删改需要提交事务
    sqlSession.commit();
  • 不忘忘记关闭操作
    sqlSession.close();
  • 在mybatis-config.xml 中有:
    <mappers>
        <mapper resource="com/dao/UserMapper.xml"/>
    </mappers>

注意:这个是将配置的接口xml导入进去,还要resource里面的分割是"/",注意区分。

1.6 使用Map插入

若是一个实体自动过多,一般使用Map操作。下面听过Map来实现插入:

public interface UserMapper {
    List<User> getUserList();

    // 插入用户
    int addUser(Map<String, Object> map);
}

在UserMapper.xml:

        <insert id="addUser" parameterType="map">
            insert into user(id,name ) values (#{userId}, #{username})
        </insert>

Test:

 @Test
    public void testAdduser2(){
        //1. 获得 sqlsession
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //2. 执行Sql
        // 方式1:getMapper
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("userId","5");
        map.put("username","Pousi");
        userMapper.addUser(map);

        sqlSession.commit();
        // 关闭SqlSession
        sqlSession.close();
    }

在其它操作中,同样可以使用 Map来实现

1.7 模糊查询

1.7.1 添加sql通配符

UserMapper

// 模糊查询
List<User> selectLike(String value);
Test:

SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.selectLike("%李%");

<select id="selectLike" parameterType="com.pojo.User" resultType="com.pojo.User">
     select * from user where name like #{value}
</select>
1.7.2 在sql语句中拼接通配符,会引起sql注入
<select id="selectLike" parameterType="com.pojo.User" resultType="com.pojo.User">
     select * from user where name like "%"#{value}"%"
</select>

2. 配置解析

2.1 核心配置文件

mybatis-config.xml (官网推荐的,不一定这个名字)

  • properties(属性)
  • settings(设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境配置)
  • environment(环境变量)
  • transactionManager(事务管理器)
  • dataSource(数据源)
  • databaseIdProvider(数据库厂商标识)
  • mappers(映射器)
2.1.1 environments(环境配置)
  • MyBatis 可以配置成适应多种环境, 但但每个 SqlSessionFactory 实例只能选择一种环境。
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                ...
            </dataSource>
        </environment>
    </environments>

上述中,environments 有两个环境,一个development,一个test。通过environments 中的default属性来确定选择哪个环境。

其中,Mybatis的默认配置:

  • 默认的事务是 JDBC : <transactionManager type="JDBC"/>
  • 默认的连接类类型是POOLED : <dataSource type="POOLED"> (type="[UNPOOLED|POOLED|JNDI]")
2.1.2 properties(属性)

数据库这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。

编写配置文件 db.properties:

dirver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8;
username=root
password=1234

在核心配置文件中引用:
<properties resource="db.properties" />

最后,mybatis-config.xml文件为:

<configuration>
    <properties resource="db.properties" />

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/dao/UserMapper.xml"/>
    </mappers>
</configuration>

值得注意的是:properties 和 environments的标签位置不能交换,在其中有各自的顺序。

properties还可以通过以下的方式来定义(增加)属性:

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>
  • 如果自定义的属性和外部文件中的属性名冲突,优先使用外部配置文件
2.1.3 typeAliases(类型别名)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。

也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>
  • 在实体类比较少的时候,建议使用第一种方式;在实体类较多的时候,建议使用第二种方式;
  • 第一种可以自定义,第二种不行

除此之外,还可以使用注解来实现的别名。比如 domain.blog.Author 的别名为 author;若有注解,则别名为其注解值。见下面的例子:

@Alias("author")
public class Author {
    ...
}
2.1.4 settings(设置)

官网地址:
https://mybatis.net.cn/configuration.html#settings
一个完整的设置如下:

<settings>
 <setting name="cacheEnabled" value="true"/>
 <setting name="lazyLoadingEnabled" value="true"/>
 <setting name="multipleResultSetsEnabled" value="true"/>
 <setting name="useColumnLabel" value="true"/>
 <setting name="useGeneratedKeys" value="false"/>
 <setting name="autoMappingBehavior" value="PARTIAL"/>
 <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
 <setting name="defaultExecutorType" value="SIMPLE"/>
 <setting name="defaultStatementTimeout" value="25"/>
 <setting name="defaultFetchSize" value="100"/>
 <setting name="safeRowBoundsEnabled" value="false"/>
 <setting name="mapUnderscoreToCamelCase" value="false"/>
 <setting name="localCacheScope" value="SESSION"/>
 <setting name="jdbcTypeForNull" value="OTHER"/>
 <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
2.1.4 映射器(mappers)

方式一:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

方式二:

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

注意事项:

  • 接口和它的配置文件必须同名
  • 接口和它的Mapper的配置文件必须在同一个包下面

方式三:

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

注意事项:

  • 接口和它的配置文件必须同名
  • 接口和它的Mapper的配置文件必须在同一个包下面
  • 方式二和方式三的注意事项相同
2.1.4 作用域和生命周期

phang
1 声望3 粉丝