[一点笔记]Mybatis配置及sql操作(一)

这篇博客记录了在maven项目中使用Mybatis进行数据库操作的学习过程,包括全局配置、映射文件的配置,涉及增删改查操作,深入讲解了select、resultMap、association、collection、discriminator等标签的用法,以及返回类型封装、自定义映射规则、关联查询、级联封装、分步查询和延迟加载等高级特性。详细内容见代码注释和项目结构解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建maven项目进行的mybatis相关知识学习,包括:

  mybatis全局配置
  mybatis映射文件配置与增删改查
  mybatis映射文件select、resoultmap、association、collection、discriminator标签
  mybatis返回类型封装、自定义映射规则、关联查询、级联封装、分步查询、延迟加载

#说明见代码中注释
项目结构如图:
在这里插入图片描述

mybatis-config

<?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>
    <!--
        引入properties配置文件内容
        resource:引入类路径下资源
        url:引入网络路径或磁盘路径资源
        -->
    <properties resource="dbcconfig.properties"></properties>

    <!--设置每一个项设置值
    name:项名
    value:值-->
    <!--开启驼峰命名-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--懒加载,所有值在使用时被检索-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--关闭时检索的内容中被使用的部分在调用时才被加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

    <!--typeAliases为某个java类起别名(别名不区分大小写)
    在类中可以使用@Alias("")注解起别名
    默认全小写,
    alias:指定新别名-->
    <typeAliases>
        <typeAlias type="com.model.User" alias="usr"/>
        <!--批量起别名
        package为某个包下所有类批量起名
        name:指定包名,为当前包以及下面所有的后代包的每一个类都起一个默认包名(别名为类名小写)-->
        <!--<package name="com.model"/>-->
    </typeAliases>

    <environments default="development">
        <!--配置环境default指定某种环境
            environment配置具体环境必须有两个标签id表示当前环境标识
                transactionManager:事务管理器
                    type:事务管理器类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
                dataSource:数据源
                    type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)|POOLED(PooledDataSourceFactory)|JNDI(JndiDataSourceFactory)
                        默认为POOLED
                    自定义数据源:实现DataSourceFactory接口-->
        <environment id="development">
            <transactionManager type="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>
    <mappers>
        <!--mapper:注册SQL映射文件
            注册配置文件
            resource:引用类路径下的sql映射文件
            url(完全限定资源定位符):引用网络或磁盘路径下的sql映射
                <mapper url="file:///var/mappers/AuthorMapper.xml"/>
            注册接口
            class:使用映射器接口实现类的完全限定类名
                需求1)有sql映射文件.xml,并且与接口放在同一目录下
                    2)没有sql映射文件,所有sql用注解写在接口上(不推荐)
            package:批量注册-->
        <mapper resource="mapper.xml"/>
        <mapper resource="jobmapper.xml"/>
    </mappers>
</configuration>

mapper

<?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 namespace="com.model.UserMapper">
    <!--Mybatis传参时,
        单个参数可以随意取名
        多个参数时会被封装成一个map
             [arg1, arg0, param1, param2]
             表示1:
             key:param1。。。paramN;使用参数索引取值
             value:传入的参数值
             表示2:
             key:在接口中使用@Param标签明确指定value名称
             value:传入的参数值
            #{}从map中获取指定的key值
            表示3:
            使用pojo中的属性值
            表示4:
            传入map
        #{}:以预编译的形式将参数设置到sql语句中PreparedStatement
        ${}:取出的值直接拼装在sql语句中
            -->
    <select id="getUserById" resultType="usr">
        SELECT * FROM user WHERE ID = #{ID}
    </select>

    <select id="bufferedGetUser" resultType="usr">
        SELECT * FROM user WHERE ID = ${id} AND username = ${"username"}
        <!--SELECT * FROM user WHERE ID = #{id} AND username = #{username}-->
    </select>

    <!--自定义封装规则
        使用id标签定义主键会有底层优化
        type:自定义规则的Java类型
        id:唯一id方便引用-->
    <resultMap id="Myusr" type="usr">
        <!--指定主键列的封装规则
            column:指定数据库中的列
            property:指定对应javabean属性-->
        <id column="ID" property="ID"/>
        <!--定义普通列封装-->
        <result column="username" property="username"/>
        <result column="password" property="password"/>
    </resultMap>

    <select id="getUserLikeName" resultMap="Myusr">
        SELECT * FROM user WHERE username LIKE #{username}
    </select>

    <!--联合查询
        同时查询个人信息和职业
        对应表:
        | ID | username | password | jobid | job  |-->
    <resultMap id="usrjob" type="usr">
        <id column="ID" property="ID"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <result column="jobid" property="job.ID"/>
        <result column="job" property="job.jobName"/>
    </resultMap>
    <select id="getUserAndJob" resultMap="usrjob">
        select u.ID,u.username,u.password,u.j_ID jobid,j.job_name job FROM user u,job j WHERE u.j_ID=j.ID AND u.ID=#{id};
    </select>

    <!--resultmap 中使用association实现分步查询-->
    <resultMap id="userjobByStep" type="usr">
        <id column="ID" property="ID"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <!--association用于定义对象
            column="j_ID"
            column="{id=j_ID}"都可以
            fetchType="lazy"表示延迟加载,-->
        <association property="job" select="com.model.JobMapper.getJobByID" column="{id=j_ID}" fetchType="lazy"/>
    </resultMap>
    <select id="getUserJobByStep" resultMap="userjobByStep">
        SELECT * FROM user WHERE ID = #{id}
    </select>

    <!--discriminator
        鉴别器:用于判断某列的值,然后根据某列的值改变封装行为-->
    <resultMap id="userDis" type="usr">
        <id column="ID" property="ID"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
        <!--column:指定判定的类名
            javaType:列值对应的java类型-->
        <discriminator javaType="string" column="username">
            <!--resultType:指定封装结果类型,不能缺少。resltType/resultMap二选一-->
            <case value="kk" resultType="usr">
                <association property="job" select="com.model.JobMapper.getJobByID" column="{id=j_ID}" fetchType="lazy"/>
            </case>
        </discriminator>
    </resultMap>
    <!--parameterType:参数类型(可省略)
        useGeneratedKeys="true" 使用自增主键获取主键值策略
        keyProperty 指定对应的主键,MyBatis获取追主键值后将这个值赋给javaBean的哪个主键
        -->
    <insert id="addUser" useGeneratedKeys="true" keyProperty="ID">
        INSERT INTO user(username,password) VALUES(#{username},#{password})
    </insert>

    <update id="updateUser">
        UPDATE user SET username=#{username},password=#{password} WHERE ID=#{ID}
    </update>

    <delete id="deleteUserById">
        DELETE FROM user WHERE ID=#{id}
    </delete>
</mapper>

jobmapper

<?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 namespace="com.model.JobMapper">
    <select id="getJobByID" resultType="com.model.Job">
        SELECT ID,job_name jobName FROM job WHERE ID=#{id}
    </select>

    <!--| ID | username | J_ID | jid  | job_name |-->
    <resultMap id="job" type="com.model.Job">
        <id column="jid" property="ID"/>
        <result column="job_name" property="jobName"/>
        <!--collection用于定义集合类型的属性封装规则
            oftype:指定集合里面元素类型-->
        <collection property="users" ofType="com.model.User">
            <!--定义集合内封装规则-->
            <id column="ID" property="ID"/>
            <result column="username" property="username"/>
            <result column="J_ID" property="j_ID"/>
        </collection>
    </resultMap>
    <select id="getUserjobByID" resultMap="job">
        SELECT u.ID,u.username,u.J_ID,j.ID jid,j.job_name FROM job j LEFT JOIN user u ON u.j_ID=1 AND u.j_ID=j.ID WHERE u.j_ID=#{id}
    </select>
</mapper>

dbcconfig.properties

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/mybatis_1?serverTimezone=UTC
jdbc.username = root
jdbc.password = 123456

Job

package com.model;

import java.util.List;

public class Job {
    private Integer ID;
    private String jobName;
    private List<User> users;

    public Integer getID() {
        return ID;
    }

    public void setID(Integer ID) {
        this.ID = ID;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    @Override
    public String toString() {
        return "Job{" +
                "ID=" + ID +
                ", jobName='" + jobName + '\'' +
                '}';
    }
}

Jobmapper

package com.model;

import java.util.List;

public interface JobMapper {

    Job getJobByID(Integer id);

    Job getUserjobByID(Integer id);
}

User

package com.model;

import java.io.Serializable;

public class User implements Serializable{
    private Integer ID;
    private String username;
    private int password;
    private Integer j_ID;
    private Job job;

    public User() {
    }

    public User(Integer ID, String username, int password) {
        this.ID = ID;
        this.username = username;
        this.password = password;
    }

    public Integer getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getPassword() {
        return password;
    }

    public void setPassword(int password) {
        this.password = password;
    }

    public Integer getJ_ID() {
        return j_ID;
    }

    public void setJ_ID(Integer j_ID) {
        this.j_ID = j_ID;
    }

    public Job getJob() {
        return job;
    }

    public void setJob(Job job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "User{" +
                "ID=" + ID +
                ", username='" + username + '\'' +
                ", password=" + password +
                '}';
    }
}

UserMapper

package com.model;

import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {

    User getUserById(Integer id);

    User bufferedGetUser(@Param("id") Integer id, @Param("username") String username);
//    User bufferedGetUser(Integer id, String username);

    List<User> getUserLikeName(String username);

    User getUserAndJob(Integer id);

    User getUserJobByStep(Integer id);

    void addUser(User user);

    boolean updateUser(User user);

    boolean deleteUserById(Integer id);
}

sqlSF(测试类)

package com.model.test;

import com.model.Job;
import com.model.JobMapper;
import com.model.User;
import com.model.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

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

public class sqlSF {
    public SqlSessionFactory getfactory(String configPath)throws Exception{
        String resource = configPath;
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        return sqlSessionFactory;
    }

    @Test
    public void getTest()throws Exception{
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = userMapper.getUserById(1);
            System.out.println(user);
        }finally {
            session.close();
        }
    }

    @Test
    public void addTest()throws Exception{
        //openSession不会自动提交数据
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = new User(null,"xiaoke2",110);
            userMapper.addUser(user);
            //使用自增主键后Bean中可获得id值
            System.out.println(user.getID());
            //手动提交数据
            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void updateTest()throws Exception{
        //openSession不会自动提交数据
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = new User(1,"like2",12345678);
            /*Mybatis允许的增删改返回值
                Integer, Long, Boolean, void
              openSession()手动提交
              openSession(true)自动提交
             */
            boolean updateUser = userMapper.updateUser(user);
            System.out.println(updateUser);

            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void deleteTest()throws Exception{
        //openSession不会自动提交数据
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            Boolean deleteUser =  userMapper.deleteUserById(9);
            System.out.println(deleteUser);
            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void select2Test()throws Exception{
        //openSession不会自动提交数据
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = userMapper.bufferedGetUser(1,"like2");
            System.out.println(user);
//            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void select3Test()throws Exception{
        SqlSession session = getfactory("mybatis-config.xml").openSession(true);

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            List<User> user = userMapper.getUserLikeName("%ke%");
            for (User u:user){
                System.out.println(u);
            }
//            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void select4Test()throws Exception{
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = userMapper.getUserAndJob(1);
            System.out.println(user);
            System.out.println(user.getJob());
//            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void jobselectTest()throws Exception{
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            JobMapper jobMapper = session.getMapper(JobMapper.class);
            Job job = jobMapper.getJobByID(1);
            System.out.println(job);
//            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void userjobByStepTest()throws Exception{
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = userMapper.getUserJobByStep(7);
            System.out.println(user);
            System.out.println(user.getJob());
//            session.commit();
        }finally {
            session.close();
        }
    }

    @Test
    public void jobuserTest()throws Exception{
        SqlSession session = getfactory("mybatis-config.xml").openSession();

        try {
            JobMapper jobMapper = session.getMapper(JobMapper.class);
            Job job = jobMapper.getUserjobByID(1);
            System.out.println(job);
            System.out.println(job.getUsers());
        }finally {
            session.close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值