Mybatis快速入门--映射文件(一)(优化版)

简介: Mybatis快速入门--映射文件(一)(优化版)

MyBatis-映射文件


MyBatis 的真正强大在于它的语句映射,这是它的魔力所在

映射文件指导着Mybatis如何进行数据库CRUD,有着非常重要的意义

cache-命名空间的二级缓存配置

cache-ref-其他命名空间缓存配置的引用

resultMap-自定义结果集映射

sql抽取可重用语句块

insert -映射插入语句

update-映射更新语句

delete -映射删除语句

select-映射查询语句

SQL映射文件一般命名为接口名+Mapper

如EmployeeMapper、EmployeeMapperpro、EmployeeMapperpromax

下面我们来分别介绍sql映射文件中的这些元素~


增删改查元素


这里值得一提的是,获取到的openSession不会自动提交

因为openSession不会自动提交事务,对数据库进行修改操作后,要手动提交事务

==sqlSession.commit();==

1、Mybatis主配置文件

<?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配置文件-->
    <properties resource="jdbc.properties"></properties>
<!--    <settings>-->
<!--        <setting name="logImpl" value="LOG4J"/>-->
<!--    </settings>-->
    <!--数据源-->
    <environments default="development">
        <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>
        <package name="com.caq.study.mapper"></package>
    </mappers>
</configuration>

2、jdbc配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/heima_ssm?useSSL=false
jdbc.username=root
jdbc.password=root

3、mapper接口

package com.caq.study.mapper;
import com.caq.study.entity.Account;
public interface AccountMapper {
//    查询
    Account selectById(Integer id);
//    增加
    boolean save(Account account);
    boolean updateById(Account account);
    boolean deleteById(Integer id);
}

4、mapper映射文件

useGeneratedKeys="true",使用自增主键获取主键值策略 keyProperty,指定对应的生键属性,也就是mybatis获取到主键值以后,将这个值封装给javaBean的对应字段


<?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.caq.study.mapper.AccountMapper">
    <insert id="save" parameterType="com.caq.study.entity.Account" useGeneratedKeys="true" keyProperty="id">
        insert into account(name, money)
        values (#{name}, #{money})
    </insert>
    <update id="updateById">
        update account
        set name=#{name},
            money=#{money}
        where id = #{id}
    </update>
    <delete id="deleteById">
        delete from `account` where id = #{id}
    </delete>
    <select id="selectById" resultType="com.caq.study.entity.Account">
        select *
        from account
        where id = #{id}
    </select>
</mapper>

5、测试


public class demo {
    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("MybatisConfig.xml");
        // 3. 创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        return sqlSessionFactory;
    }
    @Test
    public void testSave() throws IOException {
        //这里获取的sqlsession不会自动提交
        SqlSession sqlSession = getSqlSessionFactory().openSession(true);
        AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
        Account account = new Account();
        account.setName("test1");
        account.setMoney("5000");
        boolean save = accountMapper.save(account);
        System.out.println(save);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testSelect() throws IOException {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
        Account account = accountMapper.selectById(1);
        System.out.println(account);
        sqlSession.close();
    }
    @Test
    public void testDelete() throws IOException {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
        boolean account = accountMapper.deleteById(8);
        System.out.println(account);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void testUpdate() throws IOException {
        SqlSession sqlSession = getSqlSessionFactory().openSession();
        AccountMapper accountMapper = sqlSession.getMapper(AccountMapper.class);
        Account account = new Account();
        account.setId(9);
        account.setName("test1");
        account.setMoney("7000");
        accountMapper.updateById(account);
        System.out.println(account);
        sqlSession.commit();
        sqlSession.close();
    }
}


参数处理


参数位置支持的属性

javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName

实际上通常被设置的是∶

可能为空的列名指定jdbcType

#{key}:获取参数的值,预编译到SQL中。安全。

key:获取参数的值,拼接到SQL中。有SQL注入问题。ORDERBY{key}:获取参数的值,拼接到SQL中。有SQL注入问题。ORDER BY key:获取参数的值,拼接到SQL中。有SQL注入问题。ORDERBY{name}

大多数情况选择#{key}的方式来获取参数的值

联合查询:级联属型封装结果集


<resultMap id="MyEmpPlus" type="com.caq.mybatis.bean.Employee">
    <id column="id" property="id"/>
    <result column="last_name" property="lastName"/>
    <result column="gender" property="gender"/>
    <result column="did" property="dept.id"/>
    <result column="dept_name" property="dept.departmentName"/>
</resultMap>
<select id="getEmpAndDept" resultMap="MyEmpPlus">
    SELECT e.id id,e.last_name last_name,e.gender gender,e.d_id d_id,d.id did,d.dept_name dept_name
    FROM tbl_employee e,tbl_dept d
    where e.d_id = d.id
    and e.id = 1
</select>

上述方式的确可以解决这个问题

但是你看它是不是写的太麻烦了啊,那有没有简单的方法查询呢?

association可以指定联合的javaBean对象 指定哪个属型是联合的对象 javaType指定属型对象的类型【不能省略】 使用association定义关联的单个对象的封装规则


<resultMap id="MyEmpByStep" type="com.caq.mybatis.bean.Employee">
    <!--        先按照员工id查询员工信息-->
    <!--        根据查询员工信息中的d_id值去查部门查处部门信息--> 
    <!--        部门设置到员工中-->  
    <id column="id" property="id"/>  
    <result column="last_name" property="lastName"/> 
    <result column="email" property="email"/>  
    <result column="gender" property="gender"/> 
    <!--        association来定义关联对象的封装规则            select表明当前属性是调用sekect指定的方法查出的结果            流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性--> 
    <association property="dept"select="com.caq.mybatis.dao.DepartmentMapper.getDeptById" column="d_id"> 
    </association>
</resultMap>
<select id="getEmpByIdStep" resultMap="MyEmpByStep"> 
    select * from tbl_employee where id = #{id}
</select>



相关文章
|
4月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
2月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
144 5
|
4月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
4月前
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
100 6
|
4月前
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
7月前
|
XML Java 数据库连接
Mybatis映射关系
简介:本文介绍了MyBatis框架中四种常见的关系映射方式,包括一对一、一对多、多对一及多对多。一对一通过简单属性映射实现;一对多通过在主对象中添加集合属性并使用`&lt;collection&gt;`标签映射子对象集合;多对一则利用`&lt;association&gt;`标签在主对象中映射单个子对象;多对多需引入第三方类,分别在两个主对象中添加对方的集合属性,并通过`&lt;collection&gt;`标签实现映射。
137 32
|
7月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
461 13
|
8月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
8月前
|
SQL Java 数据库连接
MyBatis-Plus快速入门:从安装到第一个Demo
本文将带你从零开始,快速入门 MyBatis-Plus。我们将首先介绍如何安装和配置 MyBatis-Plus,然后通过一个简单的示例演示如何使用它进行数据操作。无论你是 MyBatis 的新手还是希望提升开发效率的老手,本文都将为你提供清晰的指导和实用的技巧。
2526 0
MyBatis-Plus快速入门:从安装到第一个Demo
|
10月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用