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标签配置733mybatis-config.mappers标签在xml文件中。
必须有要求类的根路径:CarMapper.xml
要求在d:/下面是CarMaper.xml文件
2.1mapper标签可以有三个属性:73resource:这种方法是从类的根路径开始寻找资源。这样,您的配置文件需要放入类路径中。
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
不能这样:
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前提是:主键是⾃动⽣成的。
业务背景:⼀个⽤户有多个⻆⾊。
插⼊⼀条新记录后,⾃动⽣成了主键,⽽这个键需要在其他表中使用⽤时。
插⼊⼀个⽤需要同时给出户数据。⽤户分配⻆⾊:需要将⽣成的⽤户的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接口Carmapperperpackage 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.utilsSqlSessionUtilpackage 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.pojoCarpackage 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.testCarMapperTestpackage 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>