Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析

前言

上篇文章讲述了Mybatis是什么以及简单的将Mybatis的查询流程过了一便。使用Mybatis的应用应该从导包开始,导入mybatis依赖包,后在resources资源文件夹下新增mybatis-config.xml核心配置文件,配置数据库连接等信息,然后完成实体类、接口和SQL语句文件*Mapper.xml的映射。
本篇文章主要是完成一些增删改查工作,了解有参数情况下应该怎么操作。除此之外还有了解一下配置文件标签,以及配置文件的一些优化。

Mybatis的增删改查

首先完成接口方法的创建

package com.mybatis.dao;
import com.mybatis.pojo.User;
import java.util.List;
public interface userMapper {
    //增加用户
    int addUser(User user);
}

第二步完成userMapper.xml的SQL语句实现

    <insert id="addUser" parameterType="com.mybatis.pojo.User">
        insert into user (id, name , pwd) value (#{id}, #{name}, #{pwd});
    insert>

上述代码红有两个知识点:

  1. parameterType所映射的是addUSer()接口方法中传进来的参数类型,因为传进来的是User类型,所以parameterType填写的是User的完全限定名。
  2. 传递进来的参数在SQL语句中怎么使用呢?使用#{}包裹参数名的方式完成,注意这里的参数名必须和addUser()传递进来的参数一致才可以。此处语句中的id name pwd也要和User类中的属性名一致。
    可能有的人会觉得麻烦,因为如果项目庞大可能找不到对应的类型或参数名,这个后面的注解开发中会解决。

到此处增加的代码已经完成,接下来进行测试阶段:

    @Test
    public void addUserTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userMapper mapper = sqlSession.getMapper(userMapper.class);
        User user = new User();
        user.setId(4);
        user.setName("天使");
        user.setPwd("1614700");
        mapper.addUser(user);

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

查看结果:
Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析_第1张图片
在上述测试代码中有两个知识点:

  1. 在Mybatis中,当要完成增删改的操作时,都要执行sqlSession.commit()方法提交,否则数据库不会更新同步,会自动回滚到未操作时的状态。
  2. 在完成全部操作后记得要关闭sqlSession

如果觉得每次提交都比较麻烦的话,可以在获取sqlSession的方法中做出一些改变,使其默认提交。

	public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }

让我们看一下其内置的方法:

    public SqlSession openSession(boolean autoCommit) {
        return this.sqlSessionFactory.openSession(autoCommit);
    }

这里的autoCommit就是提交的意思。

userMapper文件

    //修改name
    int updateNameByName(Map map);

userMapper.xml文件

    <update id="updateNameByName" parameterType="map">
        update user set name = '枫华' where name = #{name};
    update>

上述代码中可以看到我传递类型是Map,而SQL中引用参数名称是name。由此可以知道使用Map集合可以随自己的心意传递任意参数名。

测试代码

    @Test
    public void updateNameTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userMapper mapper = sqlSession.getMapper(userMapper.class);
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "张三");
        mapper.updateNameByName(map);
        sqlSession.close();
    }

执行结果:
Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析_第2张图片

userMapper文件

    //根据name删除李四
    int deleteByName(String name);

userMapper.xml文件

    <delete id="deleteByName" parameterType="string">
        delete from user where name = #{name}
    delete>

上述代码中可以看到我传递类型是Map,而SQL中引用参数名称是name。由此可以知道使用Map集合可以随自己的心意传递任意参数名。

测试代码

    @Test
    public void deleteByName(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userMapper mapper = sqlSession.getMapper(userMapper.class);
        int result = mapper.deleteByName("李四");
        if (result > 0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
        sqlSession.close();
    }

执行结果:
Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析_第3张图片

细心的读者可以看到三个不同的SQL语句我传递的参数都是不一样的,但是这个不是乱写的,不同参数类型对应的写法是不一样,随文章增表一张
Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析_第4张图片
Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析_第5张图片

场景:查找出name枫华天使的用户全部信息
userMapper.java文件

    //查询name为枫华和天使的全部信息
    List<User> selectByName(@Param("names")List<String> names);

上述代码中我使用了一个注解@Param,这个注解就是传递参数的注解,它的value就是参数名,可以在SQL语句中直接使用;同时也看到了我所传递的参数是List类型的,那么在SQL中怎么应用呢?怎么遍历呢?
userMapper.xml文件

    <select id="selectByName" resultType="com.mybatis.pojo.User">
        select * from user
            where name in
                <foreach collection="names" item="name" index="index" open="(" close=")" separator=",">
                    #{name}
                foreach>
    select>

从上述代码中可以看到采用了foreach标签来完成对list参数的遍历。其中属性也有不同意思:
collection:集合名称,也可以说是传递过来的参数名
item:遍历后每个元素的名称
index:索引
open:起到拼接SQL的作用,即开头使用(包裹
close:起到拼接SQL的作用,即结尾使用)包裹
separator:起到拼接SQL的作用,即每个元素之间使用,分割

测试代码

    @Test
    public void selectByName(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        userMapper mapper = sqlSession.getMapper(userMapper.class);
        List<String> list = new ArrayList<String>();
        list.add("枫华");
        list.add("天使");
        List<User> users = mapper.selectByName(list);

        for(User user : users){
            System.out.println(user.toString());
        }
        sqlSession.close();
    }

查询结果:

User(id=1, name=枫华, pwd=123456)
User(id=4, name=天使, pwd=1614700)

到目前为止,增删改查的简单语句都完成了。

配置解析

动态配置属性——properties

db.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&useUnicode=false&characterEncoding=UTF-8
username=root
password=2222

mybatis-config.xml文件

    <properties resource="db.properties">
    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>

属性配置可以采用外部引入的方式,可以灵活的完成数据库配置。具体应用场景可以想象以下:公司开发一般有三套数据库,测试一套、uat实测环境一套、生产测试一套,当环境变更的时候一般不会直接修改核心配置文件。
使用properties标签可以配置属性,其中的resources属性可以指定资源文件,从中获取到信息,而后在property标签中的value属性使用${}来完成映射。
那么就需要思考一个问题,properties标签和property标签谁的优先级更高呢?即两者都配置属性,系统以哪个为准呢?

   <properties resource="db.properties">
        <property name="username" value="root"/>
        <property name="password" value="1111"/>
    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="root"/>
                <property name="password" value="${password}"/>
            dataSource>
        environment>
    environments>

properties标签中配置的账号、密码分别是root 1111,正确的账号密码分别是root 2222,即properties密码错误,dataSource下的property标签配置正确。测试发现可以正常运行,当二者反过来时报异常错误。

由此可以得出结论:properties标签的优先级更高,系统在读取时先读取properties标签的配置信息,而后再读取后续的配置信息并将properties的配置信息覆盖,最后的结果以property为准。

设置——settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。许多操作都要在这里配置方能够使用,比如日志、驼峰映射、缓存等等。具体只能通过自己摸索得出结论,这里只附表一张:
Mybatis学习随笔(2)—— Mybatis增删改查以及配置解析_第6张图片

类型别名——typeAliases

com.mybatis.pojo.User——这是全限定类名,这是XML独有的写法,主要用于类与XML文件之间的映射。在开发过程中经常会使用到,也是经常错误的地方。全限定类名不仅繁琐而且不符合程序员的开发习惯,如果一个实体类在十几个包下,那么全限定类名就会及其的长。为了解决这种繁琐的定类名,可以从核心配置文件的typeAliases中进行配置,配置一次后可以全局使用别名进行映射,简单有效。

类型别名的配置方法有三种:类配置、包配合、注解配置

类配置

类配置别名也成为了自定义别名,使用typeAlias标签配置别名,type别名填写全限类定名,alias填写别名,将二者映射在一起。
mybatis-config.xml文件

    <typeAliases>
        <typeAlias type="com.mybatis.pojo.User" alias="user"/>
    typeAliases>

userMapper.xml文件

    <select id="userList" resultType="user">
        select * from user;
    select>

包配置

包配置别名,系统会自动扫描mybatis-config.xml指定的包下面的类。使用类的非全限定名形式即可,但是建议使用全小写的形式,为了代码美观也为了区分类。
mybatis-config.xml文件

    <typeAliases>
        <package name="com.mybatis.pojo"/>
    typeAliases>

userMapper.xml文件

    <select id="userList" resultType="user">
        select * from user;
    select>

注解配置别名

使用注解配置较为自由,和类配置别名一样可以选用自己习惯的名字进行配置别名。
User文件

@Data
@AllArgsConstructor
@NoArgsConstructor
@Alias("BAT")
public class User implements Serializable {
    private int id;
    private String name;
    private String pwd;
}

userMapper.xml文件

        <select id="userList" resultType="BAT">
        select * from user;
    select>

映射器——mappers

映射器是Mybatis中十分重要的,其完成的是注册*Mapper.xml,使得系统能够扫描到对应的xml文件。
方式有三个:XML文件映射、class映射、package映射
映射器的映射和类型别名的映射类似,可以做练习,这里无多介绍。

总结

本篇文章内容就是这样,下一篇文章将介绍结果集映射、复杂语句时的处理以及动态SQL

你可能感兴趣的:(java,java,java-ee,intellij-idea)