当前位置: 首页 > 图灵资讯 > 技术篇> mybatis小技巧2

mybatis小技巧2

来源:图灵教育
时间:2023-06-05 09:30:36

1.MyBatis中的别名机制:72

 <typeAliases>        <!--别名自己指定的-->        <typeAlias type="com.powernode.mybatis.pojo.Car" alias="aaa"/>        <typeAlias type="com.powernode.mybatis.pojo.Log" alias="bbb"/>        <!--采用默认别名机制-->        <typeAlias type="com.powernode.mybatis.pojo.Car"/>        <typeAlias type="com.powernode.mybatis.pojo.Log"/>        <!--包下所有类别的自动别名。--包下所有类别的自动命名。使用简名作为别名。-->        <package name="com.powernode.mybatis.pojo"/>    </typeAliases>

所有别名都不区分大小写。

namespace不能使用别名机制。

2.mapper标签配置733

mybatis-config.mappers标签在xml文件中。

必须有要求类的根路径:CarMapper.xml

要求在d:/下面是CarMaper.xml文件

2.1mapper标签可以有三个属性:73

resource:这种方法是从类的根路径开始寻找资源。这样,您的配置文件需要放入类路径中。

url: 这种方法是一种绝对路径的方法。这样,只要提供绝对路径,就不需要将配置文件放入类别路径中。由于移植性差,这种方法很少使用。

class: 该位置提供了mapper接口的全限定接口名,必须有包名。

思考:mapper标签的作用是指定Sqlmapper.指定接口名的xml文件路径有什么用?

<mapper class="com.powernode.mybatis.mapper.CarMapper"/>

若您的class指定为:com.powernode.mybatis.mapper.CarMapper

然后mybatis框会自动去com///powernode/mybatis/mapper目录查找Carmaper.xml文件。

这样,你必须保证CarMaper.xml文件和carmaper接口必须在同一目录下。名称相同。

carmaper接口->CarMapper.xml

Logmapper接口->LogMapper.xml

...

提醒!!!

如果在IDEAresources目录下新建多个目录,则必须以这种方式创建:

com/powernode/mybatis/mapper

mybatis小技巧2_主键

不能这样:

com.powernode.mybatis.mapper

<mappers>        <!--<mapper resource=""/>        <mapper url=""/>        <mapper class=""/>-->        <!--<mapper resource="CarMapper.xml"/>        <mapper resource="LogMapper.xml"/>-->        <!--使用这种方法的前提:CarMapper.xml文件的位置不能随意放置-->        <!--必须与CarMaper接口放在一起。-->        <!--XML文件的名称必须与接口名一致。-->        <mapper class="com.powernode.mybatis.mapper.CarMapper"/>        <mapper class="com.powernode.mybatis.mapper.LogMapper"/>        <!-- 这种方法用于实际开发。-- 这种方法用于实际开发。-->        <!--前提是XML文件必须与接口放在一起。而且名字一致。--><!--        <package name="com.powernode.mybatis.mapper"/>-->    </mappers>

3.idea设置模板744。插入数据时获取自动生成的主键75

前提是:主键是⾃动⽣成的。

业务背景:⼀个⽤户有多个⻆⾊。

mybatis小技巧2_xml_02

插⼊⼀条新记录后,⾃动⽣成了主键,⽽这个键需要在其他表中使用⽤时。

插⼊⼀个⽤需要同时给出户数据。⽤户分配⻆⾊:需要将⽣成的⽤户的id插⼊到⻆⾊user_id字段上的表。

第⼀种⽅风格:可以先插⼊⽤家庭数据,再写⼀查询语句获取id,然后插入⼊user_id字段。【⽐较麻烦】

第⼆种⽅公式:mybatis提供⼀种⽅风格更方便。

test中com.powernode.mybatis.testcarmapertest类testinsertcaruseneneratedkeyster

/////自动生成的主键在插入数据时获取  75    @Test    public void testInsertCarUseGeneratedKeys(){        SqlSession sqlSession = SqlSessionUtil.openSession();        CarMapper mapper = sqlSession.getMapper(CarMapper.class);        Car car = new Car(null,"9991", “凯美瑞”, 30.0, "2020-11-11", "燃油车";        mapper.insertCarUseGeneratedKeys(car);        System.out.println(car);        sqlSession.commit();        sqlSession.close();    }

CarMapper.xml

 <!--        useGeneratedKeys="true" 使用自动生成的主键值。  75        keyProperty="id" 指定主键值赋值对象的属性。这意味着将主键值赋值给Car对象的id属性。    -->    <insert id="insertCarUseGeneratedKeys" useGeneratedKeys="true" keyProperty="id">        insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})    </insert>

5.总代码main中的comm.powernode.mybatis.armapper接口Carmapperper

package com.powernode.mybatis.mapper;import com.powernode.mybatis.pojo.Car;import java.util.List;//这是一个接口   演示 #{ }和${ }的区别   67public interface CarMapper {    /**     * 插入Car信息,并使用生成的主键值。  75     * @param car     * @return     */    int insertCarUseGeneratedKeys(Car car);    /**     * 根据汽车品牌进行模糊查询   71     * @param brand     * @return     */    List<Car> selectByBrandLike(String brand);    /**     * 批量删除,根据id    70     * @param ids     * @return     */    int deleteBatch(String ids);    /**     * 查询所有汽车信息。然后通过asc升序,desc降序。  68     * @param ascOrDesc     * @return     */    List<Car> selectAllByAscOrDesc(String ascOrDesc);    /**     * 根据汽车类型获取汽车信息。67     * @param carType     * @return     */    List<Car> selectByCarType(String carType);}

com.powernode.mybatis.utilsSqlSessionUtil

package com.powernode.mybatis.utils;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 java.io.IOException;/** * MyBatis工具 * @author 动力节点 */public class SqlSessionUtil {    private SqlSessionUtil(){}    private static SqlSessionFactory sqlSessionFactory;    static {        try {            sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));        } catch (IOException e) {            throw new RuntimeException(e);        }    }    // 全局的,对于服务器级别,可以在服务器中定义一个。    // 为何将SqlSession对象放入Threadlocal?    // 为什么要把SqlSession对象放在Threadlocal中?确保一个线程对应于SqlSession。    private static ThreadLocal local = new ThreadLocal<>();    /**     * 获取会话对象。     * @return 会话对象     */    public static SqlSession openSession(){        SqlSession sqlSession = local.get();        if (sqlSession == null) {            sqlSession = sqlSessionFactory.openSession();            // 将sqlsession对象绑定到当前线程。            local.set(sqlSession);        }        return sqlSession;    }    /**     * 关闭SqlSession对象(从当前线程中删除SqlSession对象。)     * @param sqlSession     */    public static void close(SqlSession sqlSession){        if (sqlSession != null) {            sqlSession.close();            // 注意移除SqlSession对象与当前线程的绑定关系。= null) {            sqlSession.close();            // 注意移除SqlSession对象与当前线程的绑定关系。            // 因为Tomcat服务器支持线程池。也就是说,用过的线程对象T1下次可能会用到这个T1线程。            local.remove();        }    }}

com.powernode.mybatis.pojoCar

package com.powernode.mybatis.pojo;/** * Pojo类包装汽车相关信息。普通java类。 * @author 动力节点 */public class Car {    // 数据库表中的字段应与pojo属性一一对应。    // 建议使用包装类,以防止null问题。    private Long id;    private String carNum;    private String brand;    private Double guidePrice;    private String produceTime;    private String carType;    @Override    public String toString() {        return "Car{" +                "id=" + id +                ", carNum='" + carNum + '\'' +                ", brand='" + brand + '\'' +                ", guidePrice=" + guidePrice +                ", produceTime='" + produceTime + '\'' +                ", carType='" + carType + '\'' +                '}';    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getCarNum() {        return carNum;    }    /*public String getXyz() {        return carNum;    }*/    public void setCarNum(String carNum) {        this.carNum = carNum;    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        this.brand = brand;    }    public Double getGuidePrice() {        return guidePrice;    }    public void setGuidePrice(Double guidePrice) {        this.guidePrice = guidePrice;    }    public String getProduceTime() {        return produceTime;    }    public void setProduceTime(String produceTime) {        this.produceTime = produceTime;    }    public String getCarType() {        return carType;    }    public void setCarType(String carType) {        this.carType = carType;    }    public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType) {        this.id = id;        this.carNum = carNum;        this.brand = brand;        this.guidePrice = guidePrice;        this.produceTime = produceTime;        this.carType = carType;    }    public Car() {    }}

test中com.powernode.mybatis.testCarMapperTest

package com.powernode.mybatis.test;import com.powernode.mybatis.mapper.CarMapper;import com.powernode.mybatis.pojo.Car;import com.powernode.mybatis.utils.SqlSessionUtil;import org.apache.ibatis.session.SqlSession;import org.junit.Test;import java.util.List;//#{ }和${ }的区别   67public class CarMapperTest {    /////自动生成的主键在插入数据时获取  75    @Test    public void testInsertCarUseGeneratedKeys(){        SqlSession sqlSession = SqlSessionUtil.openSession();        CarMapper mapper = sqlSession.getMapper(CarMapper.class);        Car car = new Car(null,"9991", “凯美瑞”, 30.0, "2020-11-11", "燃油车";        mapper.insertCarUseGeneratedKeys(car);        System.out.println(car);        sqlSession.commit();        sqlSession.close();    }    ///模糊查询  71    @Test    public void testSelectByBrandLike(){        SqlSession sqlSession = SqlSessionUtil.openSession();        CarMapper mapper = sqlSession.getMapper(CarMapper.class);        List<Car> cars = mapper.selectByBrandLike(奔驰);        cars.forEach(car -> System.out.println(car));        sqlSession.close();    }    ///批量删除  70    @Test    public void testDeleteBatch(){        SqlSession sqlSession = SqlSessionUtil.openSession();        CarMapper mapper = sqlSession.getMapper(CarMapper.class);        int count = mapper.deleteBatch("11,12,13");        System.out.println(count);        sqlSession.commit();        sqlSession.close();    }    ///查询一切  排序  68    @Test    public void testSelectAllByAscOrDesc(){        SqlSession sqlSession = SqlSessionUtil.openSession();        CarMapper mapper = sqlSession.getMapper(CarMapper.class);        List<Car> cars = mapper.selectAllByAscOrDesc("asc");//升序        //List<Car> cars = mapper.selectAllByAscOrDesc("desc");//降序        cars.forEach(car -> System.out.println(car));        sqlSession.close();    }    //初步认识#{ }和${ }的区别   67    @Test    public void testSelectByCarType(){        SqlSession sqlSession = SqlSessionUtil.openSession();        CarMapper mapper = sqlSession.getMapper(CarMapper.class);        List<Car> cars = mapper.selectByCarType(“新能源”);        //遍历        cars.forEach(car -> System.out.println(car));        sqlSession.close();    }}

CarMapper.xml

<?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.powernode.mybatis.mapper.CarMapper">    <select id="selectByCarType" resultType="car">        select            id,            car_num as carNum,            brand,            guide_price as guidePrice,            produce_time as produceTime,            car_type as carType        from            t_car        where            car_type = #{carType}    </select>    <select id="selectAllByAscOrDesc" resultType="Car">        select            id,            car_num as carNum,            brand,            guide_price as guidePrice,            produce_time as produceTime,            car_type as carType        from            t_car        order by            produce_time ${ascOrDesc}    </select>    <delete id="deleteBatch">        <!--delete from t_car where id in(#{ids})-->        delete from t_car where id in(${ids})    </delete>    <select id="selectByBrandLike" resultType="car">        select            id,            car_num as carNum,            brand,            guide_price as guidePrice,            produce_time as produceTime,            car_type as carType        from            t_car        where            <!--brand like '%${brand}%'-->            <!--brand like '%${brand}%'-->            <!--brand like concat('%',#{brand},'%')-->            <!--brand like concat('''',''',''${brand}","%"-->            brand like "%"#{brand}"%"    </select>    <!--        useGeneratedKeys="true" 使用自动生成的主键值。  75        keyProperty="id" 指定主键值赋值对象的属性。这意味着将主键值赋值给Car对象的id属性。    -->    <insert id="insertCarUseGeneratedKeys" useGeneratedKeys="true" keyProperty="id">        insert into t_car values(null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})    </insert></mapper>

mybatis-config.xml

<?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="jdbc.properties" /><!--    起别名-->    <typeAliases>        <!--    起别名-->    <typeAliases>        <!--    72            type: 指定哪种类型的名称            alias:指定别名            注:别名不缺分大小写。            alias属性可以省略。有默认的别名。        -->        <!--<typeAlias type="com.powernode.mybatis.pojo.Car" alias="aaa"/>        <typeAlias type="com.powernode.mybatis.pojo.Log" alias="bbb"/>-->        <!--省略alias后,别名就是类的简名,比如:com.powernode.mybatis.pojo.Car的别名是Car/car/cAR/cAr,不缺分大小写。--省略alias后,别名就是类的简名,比如:com.powernode.mybatis.pojo.Car的别名是Car/car/cAR/cAr,不缺分大小写。 --><!--        <typeAlias type="com.powernode.mybatis.pojo.Car"/>--><!--        <typeAlias type="com.powernode.mybatis.pojo.Log"/>-->        <!--自动将这个包下的所有类别命名。别名是类简名。大小写没有区别。  -->        <package name="com.powernode.mybatis.pojo"/>    </typeAliases>    <environments default="powernodeDB">        <environment id="powernodeDB">            <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 resource=""/>        <mapper url=""/>        <mapper class=""/>-->        <!--<mapper resource="CarMapper.xml"/>        <mapper resource="LogMapper.xml"/>-->        <!--使用这种方法的前提:CarMapper.xml文件的位置不能随意放置-->        <!--使用这种方法的前提:CarMapper.xml文件的位置不能随意放置-->        <!--必须与CarMaper接口放在一起。-->        <!--XML文件的名称必须与接口名一致。-->        <!--<mapper class="com.powernode.mybatis.mapper.CarMapper"/>        <mapper class="com.powernode.mybatis.mapper.LogMapper"/>-->        <!-- 这种方法用于实际开发。-- 这种方法用于实际开发。-->        <!--前提是XML文件必须与接口放在一起。而且名字一致。-->        <package name="com.powernode.mybatis.mapper"/>    </mappers></configuration>

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.powernode</groupId>    <artifactId>course13</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>jar</packaging>    <dependencies><!--        依赖mybatis-->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis</artifactId>            <version>3.5.10</version>        </dependency><!--        依赖mysql-->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>8.0.30</version>        </dependency><!--        依赖junit-->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.13.2</version>            <scope>test</scope>        </dependency><!--        依赖logback-->        <dependency>            <groupId>ch.qos.logback</groupId>            <artifactId>logback-classic</artifactId>            <version>1.2.11</version>        </dependency>    </dependencies>    <properties>        <!--    jdk版本用于编译代码-->        <maven.compiler.source>1.8</maven.compiler.source>        <!--    使用jdk版本的操作程序-->        <maven.compiler.target>1.8</maven.compiler.target>    </properties></project>