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>



相关文章
|
19天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
25天前
|
SQL Java 数据库连接
MyBatis-Plus快速入门:从安装到第一个Demo
本文将带你从零开始,快速入门 MyBatis-Plus。我们将首先介绍如何安装和配置 MyBatis-Plus,然后通过一个简单的示例演示如何使用它进行数据操作。无论你是 MyBatis 的新手还是希望提升开发效率的老手,本文都将为你提供清晰的指导和实用的技巧。
126 0
MyBatis-Plus快速入门:从安装到第一个Demo
|
2月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
48 1
|
4月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
94 3
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
5月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
72 3
|
4月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
若依修改,集成mybatisplus报错,若依集成mybatisplus,总是找不到映射是怎么回事只要是用mp的方法就找报,改成mybatisPlus配置一定要改
|
4月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
下一篇
无影云桌面