IDEA创建springboot项目

1、新建springboot项目

2、选择版本依赖

3、maven配置

4、yml文件配置

# YML文件的语法
# 1.数据结构   key-value结构
# 2.写法:     key:(空格)value
# 3.层级代码结构,注意缩进 !!!!!
# 4.字符集  文件读取时,默认采用UTF-8编码 可以写中文
# 规则: 命名时最好指定前缀.
server:
  port: 8080
mysql:
  username: root
  password: root

5、动态为属性赋值,编辑JDBCController

/**
 * 说明:
 *  1.将该类交给Spring容器管理
 *  2.SpringMVC负责调用该对象接收用户的请求.
 *  3.将业务处理之后的结果,为页面返回JSON数据.
 *  @ResponseBody作用: 将数据转化为JSON串
 */
@RestController
public class JDBCController {

    //${key} Spring提供的springel表达式 简称为:spel表达式
    //语法: 从spring容器内部获取key,动态为属性赋值.
    @Value("${mysql.username}")
    String username;     // = "root|";
    @Value("${mysql.password}")
    String password;     // = "root";

    @RequestMapping("/getMsg")
    public String getMsg(){

        return "你好数据库:"+ username +password;
    }

}

6、访问:http://localhost:8080/getMsg,浏览器页面显示

7、利用properties文件为属性赋值,编辑mysql.properties

#默认ISO-8859-1 中文必定乱码
mysql.username2=mysql数据库
mysql.password2=你猜猜

8、通过注解为属性赋值,可以指定字符集

/**
 * 说明:
 *  1.将该类交给Spring容器管理
 *  2.SpringMVC负责调用该对象接收用户的请求.
 *  3.将业务处理之后的结果,为页面返回JSON数据.
 *  @ResponseBody作用: 将数据转化为JSON串
 *
 *  propertySource:  value属性指定路径
 *                   encoding属性指定配置文件编码格式
 */
@RestController
@PropertySource(value="classpath:/mysql.properties", encoding = "UTF-8")
public class JDBCController {

    //${key} Spring提供的springel表达式 简称为:spel表达式
    //语法: 从spring容器内部获取key,动态为属性赋值.
    @Value("${mysql.username}")
    String username;     // = "root|";
    @Value("${mysql.password}")
    String password;     // = "root";

    @RequestMapping("/getMsg")
    public String getMsg(){

        return "你好数据库:"+ username +password;
    }


    /**
     * 难点: 如何将pro文件交给Spring容器管理????
     * 解决方案: @PropertySource("xxxxxx/xxx.properties") 指定配置文件交给Spring容器管理
     */
    @Value("${mysql.username2}")
    private String username2;
    @Value("${mysql.password2}")
    private String password2;

    @RequestMapping("/getMsg2")
    public String getMsg2(){

        return "你好数据库:"+ username2 +password2;
    }

}

9、访问:http://localhost:8080/getMsg2,浏览器页面显示

10、springboot高级用法,创建springboot项目

模板,maven

11、编辑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.jt</groupId>
    <artifactId>springboot_demo2</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--只需要复制 除了坐标之外的文件即可-->
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.4.1</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <mainClass>com.jt.SpringbootDemo1Application</mainClass>
                </configuration>
                <!--排除一些指定的配置-->
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

12、yml配置文件

开发 dev: 8080端口       生产 prod: 9000端口

#指定环境的默认配置
spring:
  profiles:
    active: dev
---
#为环境定义名称
server:
  port: 8080
spring:
  config:
    activate:
      on-profile: dev
# 采用---的方式实现环境分割
---
server:
  port: 9000
spring:
  config:
    activate:
      on-profile: prod

13、热部署

在开发阶段,需要频繁的修改配置文件/代码

需求:要求将代码保存之后,程序自动的编译,并且完成tomcat服务的重启

个别IDEA版本可能不生效

        <!--支持热部署 开发阶段有效-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

14、创建pojo,DemoUser

/**
 * 实体对象要求:
 *      1.类名一般与表名关联
 *      2.属性名称一般与字段关联
 *      3.pojo中的属性类型必须为引用类型(包装类型)
 *      4.实体对象必须有get/set方法
 *      5.一般实体对象需要实现序列化接口(规则)
 *          原因: 数据可能跨平台(跨服务器)传输,必须序列化
 */
public class DemoUser implements Serializable {

    private Integer id;
    private String name;
    private Integer age;
    private String sex;

}

15、lombok依赖

lombok可以为POJO实体对象,动态的生成get/set/toString/hashcode/equals等方法,无需程序员手动编辑

        <!--引入插件lombok 自动的set/get/构造方法插件  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

16、采用注解

@Data  //动态生成get/set/toString/equals等方法
@Accessors(chain = true) //开启链式加载 重写set方法
@NoArgsConstructor  //无参构造
@AllArgsConstructor //有参构造
public class DemoUser implements Serializable {

    private Integer id;
    private String name;
    private Integer age;
    private String sex;

    //方法测试
    public void add(){
        DemoUser user = new DemoUser();
        user.setId(100).setName("aaaa").setAge(18).setSex("女");
    }

}

17、Mybatis依赖

        <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

18、编辑DemoUser

@Data  //动态生成get/set/toString/equals等方法
@Accessors(chain = true) //开启链式加载 重写set方法
@NoArgsConstructor  //无参构造
@AllArgsConstructor //有参构造
public class DemoUser implements Serializable {

    private Integer id;
    private String name;
    private Integer age;
    private String sex;

}

19、编辑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>

    <!--环境配置标签 default 默认加载的环境 只能写一个   -->
    <environments default="development">

        <!--编辑开发环境  id是环境唯一标识符  -->
        <environment id="development">
            <!--事物管理器  利用jdbc控制事务 -->
            <transactionManager type="JDBC"/>
            <!--mybatis采用数据库链接池的方式整合数据源 -->
            <dataSource type="POOLED">
                <!--高版本数据库驱动 需要添加cj-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;allowMultiQueries=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

    </environments>

    <!--Mybatis加载Mapper映射文件-->
    <mappers>
        <mapper resource="mybatis/mappers/UserMapper.xml"/>
    </mappers>
</configuration>

20、构建DemoUserMapper接口

/**
 * 说明:
 *      1.根据面向接口开发的思想需要定义一个Mapper接口
 *      2.在接口中可以写接口方法, 谁用谁去实现!!!
 */
public interface DemoUserMapper {
    //1.查询所有的表数据
    public List<DemoUser> findAll();
}

21、编辑DemoUserMapper.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">
<!--xml映射文件 必须与接口一对一绑定
    namespace: 指定需要绑定的接口名称. 不能重复.
 -->
<mapper namespace="com.jt.mapper.DemoUserMapper">

    <!--实现接口中的方法
        id: 需要与接口中的方法绑定. 一般复制粘贴
        resultType: 对象的包路径.
        规则: sql语句不要添加多余的;号  Oracle数据库不能添加;号
    -->
    <select id="findAll" resultType="com.jt.pojo.DemoUser">
        select id,name,age,sex from demo_user
    </select>

    <!-- <insert id=""></insert>
     <update id=""></update>
     <delete id=""></delete>-->

</mapper>

22、编辑测试类TestMybatis,测试mybatis实现数据库查询

    /**
     * 业务说明: 实现mybatis入门案例
     * 步骤:
     *      1.动态生成SqlSessionFactory
     */
    @Test
    public void demo1() throws IOException {
        //指定配置文件地址
        String resource = "mybatis-config.xml";
        //通过IO流 加载指定的配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //动态生成SqlSessionFactory
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession  类比 数据库链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取Mapper接口
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        //获取数据
        List<DemoUser> userList = demoUserMapper.findAll();
        System.out.println(userList);
        //关闭链接
        sqlSession.close();
    }

23、查询结果

24、编辑DemoUserMapper,根据ID查询数据

DemoUser findOne(int id);

25、编辑DemoUserMapper.xml映射文件

    <!--
        parameterType: 参数类型
        mybatis中通过 #{} 获取参数
        resultType: 返回值结果对象
   -->
    <select id="findOne" parameterType="int" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where id = #{id}
    </select>

26、编辑测试类TestMybatis测试

    /***
     *  需求: 根据ID查询数据库记录   id=1的数据
     */
    @Test
    public void testFindOne() throws IOException {
        //指定配置文件地址
        String resource = "mybatis-config.xml";
        //通过IO流 加载指定的配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //动态生成SqlSessionFactory
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取接口
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        int id = 1;
        DemoUser demoUser = demoUserMapper.findOne(id);
        System.out.println(demoUser);
        //关闭链接
        sqlSession.close();
    }

27、测试结果

28、@BeforeEach

该注解的作用是在执行@Test方法前调用,是测试方法提供的测试API

编辑TestMybatis2

public class TestMybatis2 {

    //定义公共的属性
    private SqlSessionFactory sqlSessionFactory;
    /**
     * mybatis的核心 SqlSessionFacotry对象
     * @BeforeEach: 测试API中的注解 在执行@Test注解方法时,会提前执行!!!
     */
    @BeforeEach
    public void init() throws IOException {
        //1.指定资源文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void testMybatis01(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        List<DemoUser> list = demoUserMapper.findAll();
        System.out.println(list);
        sqlSession.close();
    }

}

29、运行结果

30、根据名称查询,编辑TestMybatis2

    /**
     * 作业:
     *      1. 查询name="王昭君"的用户
     */
    @Test
    public void testFindByName(){
        //保证每个线程都能获取一个链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        String name = "王昭君";
        //如果不能保证结果唯一,则使用List集合接收数据.
        List<DemoUser> list = demoUserMapper.findByName(name);
        System.out.println(list);
        sqlSession.close();
    }

31、编辑DemoUserMapper.xml

    <!--说明: parameterType其中的类型程序可以根据参数自动判断,所以可以省略不写
            根据名称,动态取值 使用#{}关键字
     -->
    <select id="findByName" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where name = #{name}
    </select>

32、编辑DemoUserMapper

List<DemoUser> findByName(String name);

33、运行结果

34、编辑TestMybatis2,mybatis中参数封装

    /**
     * 需求 :2. 查询sex=女 and age > 18岁
     * 条件 2个
     */
    @Test
    public void testFindBySA(){
        //保证每个线程都能获取一个链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        //编程习惯: 面向对象
        DemoUser user = new DemoUser();
        user.setAge(18).setSex("女");
        List<DemoUser> list = demoUserMapper.findBySA(user);
        System.out.println(list);
        sqlSession.close();
    }

35、编辑DemoUserMapper

List<DemoUser> findBySA(DemoUser user);

36、编辑DemoUserMapper.xml

    <!--
        查询sex=女 and age > 18岁
        参数: DemoUser user 意图:传递属性的
        规则: 如果传递的参数是对象,则通过#{属性} 可以直接获取数据.
    -->
    <select id="findBySA" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where sex= #{sex} and age > #{age}
    </select>

37、运行结果 

38、编辑TestMybatis2,参数封装的3种常见情景

    /**
     * 需求 :2. 查询sex=女 and age > 18岁
     * 方式1: User对象封装
     */
    @Test
    public void testFindBySA(){
        //保证每个线程都能获取一个链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        //编程习惯: 面向对象
        DemoUser user = new DemoUser();
        user.setAge(18).setSex("女");
        List<DemoUser> list = demoUserMapper.findBySA(user);
        System.out.println(list);
        sqlSession.close();
    }

    /**
     *    sex=女 and age > 18
     *    方式2: @Param方式封装.
     */
    @Test
    public void testFindBySA2(){
        //保证每个线程都能获取一个链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        String sex = "女";
        int age = 18;
        List<DemoUser> list = demoUserMapper.findBySA2(sex,age);
        System.out.println(list);
        sqlSession.close();
    }

    /**
     *    sex=女 and age > 18
     *    方式3: map集合封装
     */
    @Test
    public void testFindBySA3(){
        //保证每个线程都能获取一个链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("sex","女");
        map.put("age",18);
        List<DemoUser> list = demoUserMapper.findBySA3(map);
        System.out.println(list);
        sqlSession.close();
    }

39、编辑DemoUserMapper.xml

    <!--
        查询sex=女 and age > 18岁
        参数: DemoUser user 意图:传递属性的
        规则: 如果传递的参数是对象,则通过#{属性} 可以直接获取数据.
    -->
    <select id="findBySA" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where sex= #{sex} and age > #{age}
    </select>

    <!--
    如果参数被@Param("sex") String sex修饰
    则#{参数key}即可获取数据
    -->
    <select id="findBySA2" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where sex= #{sex} and age > #{age}
    </select>

    <!--
        Map<String, Object> map
            sex=女  age=18
        规则: 如果参数是一个map集合,则通过#{key}获取数据.
    -->
    <select id="findBySA3" resultType="com.jt.pojo.DemoUser">
        select * from demo_user where sex= #{sex} and age > #{age}
    </select>

40、编辑DemoUserMapper

    List<DemoUser> findBySA(DemoUser user);

    List<DemoUser> findBySA2(@Param("sex") String sex, @Param("age") Integer age);

    List<DemoUser> findBySA3(Map map);

41、编辑TestMybatis2,Mybatis常规CURD操作,新增操作

    /**
     * 需求: 实现用户入库操作
     * 关于事务说明:
     *    mybatis中的"更新"操作,默认事务都是开启的,如果进行更新操作,
     *    则必须提交事务.
     */
    @Test
    public void testSaveUser(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        //数据库主键自增,所以对象的ID可以为null.
        DemoUser user = new DemoUser(null,"宁荣荣",26,"女");
        int rows = demoUserMapper.saveUser(user);
        if(rows > 0){
            System.out.println("影响的行数:"+rows);
            //事务提交
            sqlSession.commit();
        }
        sqlSession.close();
    }

42、编辑DemoUserMapper

int saveUser(DemoUser user);

43、编辑DemoUserMapper.xml

    <!--
       需求: 需要返回影响的行数.
             mybatis执行"更新"操作时,自动的返回影响的行数
    -->
    <insert id="saveUser">
        insert into demo_user value (null,#{name},#{age},#{sex})
    </insert>

44、运行结果

45、查看数据库

46、Mybatis中的转义字符

    xml文件中的转义字符.
            &gt;  > 大于
            &lt;  < 小于
            &amp;  & 号
    说明:如果sql中有大量的转义字符 建议使用转义标签体
    语法: <![CDATA[  xxx内容 报文   ]]>

47、编辑TestMybatis2,查询age> 18 and age< 100 的用户信息

    /**
     * 需求: 查询age> 18 and age< 100 的用户信息.
     * 规则: 如果不能使用对象封装,则一般使用Map集合
     */
    @Test
    public void testSelect01(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("minAge",18);
        map.put("maxAge",100);
        List<DemoUser> userList = demoUserMapper.findByAge(map);
        System.out.println(userList);
        sqlSession.close();
    }

48、编辑DemoUserMapper

List<DemoUser> findByAge(Map<String,Object> map);

49、编辑DemoUserMapper.xml

    <select id="findByAge" resultType="com.jt.pojo.DemoUser">
        <!--select * from demo_user where age > #{minAge} and age &lt; #{maxAge}-->
        <![CDATA[  select * from demo_user where age > #{minAge} and age < #{maxAge}]]>
    </select>

50、运行结果

51、编辑TestMybatis2,Mybatis集合用法,批量删除

    /**
     * 例如: 删除id=232/233/234的数据?
     *  Sql: delete from demo_user where id in (232,233,234)
     * 规则: 如果遇到相同的多个数据,则一般采用集合的方式封装数据.
     * 封装方式:
     *      1. array
     *      2. list
     *      3. map<List>
     */
    @Test
    public void testDeleteIds(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        //将数据封装为数组
        int[] ids = {232,233,234};
        demoUserMapper.deleteIds(ids);
        System.out.println("删除操作成功!!!");
    }

52、编辑DemoUserMapper

void deleteIds(int[] ids);

53、编辑DemoUserMapper.xml

    <!--
        需求: 批量删除多个数据
        难点: 如果使用#{集合}获取的是集合对象的整体.删除无效.
        思路: 将数组拆分为单个数据. 可以通过遍历的方式操作
        语法: mybatis为了参数取值方便,特意封装了遍历的标签 foreach
        关于标签参数说明:
            <foreach collection=""></foreach>
            1.如果传递的参数是数组,     则collection="array"
            2.如果传递的参数是list集合, 则collection="list"
            3.如果传递的参数是Map集合,  则collection="map中的key"


        标签属性说明:
            1.collection 集合的名称
            2.item 每次遍历的数据的形参变量
            3.open 循环的开始标签
            4.close 循环的结束标签
            5.index 循环遍历下标 一般不用
            6.separator 循环遍历的分割符
     -->
    <delete id="deleteIds">
        delete from demo_user where id in (
        <foreach collection="array" item="id" separator=",">
            #{id}
        </foreach>
        )
    </delete>

54、编辑TestMybatis2,Mybatis集合用法,练习list/map的用法

    @Test
    public void testDeleteList(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        List list = new ArrayList();
        list.add(232);
        list.add(233);
        list.add(234);
        demoUserMapper.deleteList(list);
        System.out.println("删除操作成功!!!");
    }

    /*
     * 说明: 有时业务需求导致需要使用map封装list集合
     */
    @Test
    public void testDeleteMap(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        List list = new ArrayList();
        list.add(232);
        list.add(233);
        list.add(234);
        HashMap map = new HashMap();
        map.put("ids",list);
        demoUserMapper.deleteMap(map);
        System.out.println("删除操作成功!!!");
    }

55、编辑DemoUserMapper

    void deleteList(List list);

    void deleteMap(HashMap map);

56、编辑DemoUserMapper.xml

    <!--删除List集合中的数据-->
    <delete id="deleteList">
        delete from demo_user where id in (
        <foreach collection="list" item="id" separator=",">
            #{id}
        </foreach>
        )
    </delete>

    <!--删除List集合中的数据 如何是map,则写map中的key-->
    <delete id="deleteMap">
        delete from demo_user where id in (
        <foreach collection="ids" item="id" separator=",">
            #{id}
        </foreach>
        )
    </delete>

57、编辑TestMybatis2,模糊查询

    /*
        Mybatis作业:
            需求: 查询name中包含"王"的数据.并且按照年龄降序排列
     */
    @Test
    public void findLike(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        String name = "%王%";
        List<DemoUser> list = demoUserMapper.findLike(name);
        System.out.println(list);
        sqlSession.close();
    }

58、编辑DemoUserMapper.xml

    <!--关于模糊查询的说明: 使用%号需要使用""号包裹.
       注意事项: mybatis中的sql 最好小写. 因为不同的系统对于大小写 不敏感.
       键位:  eclipse    ctrl + shift + y  小写
                        ctrl + shift + u  大写/小写
     -->
    <select id="findLike" resultType="com.jt.pojo.DemoUser">
        <!--select * from demo_user where name like "%"#{name}"%" order by age desc -->
        select * from demo_user where name like #{name} order by age desc
    </select>

59、编辑DemoUserMapper

List<DemoUser> findLike(String name);

60、运行结果

61、编辑TestMybatis2,批量更新操作

    /**
     * 作业2: 将name为貂蝉/黄月英/宁荣荣的年龄改为28岁,性别女
     */
    @Test
    public void updateUser(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        Map<String,Object> map = new HashMap<>();
        String[] array = {"貂蝉","黄月英","宁荣荣"};
        map.put("names",array);
        map.put("age",28);
        map.put("sex","女");
        demoUserMapper.updateUser(map);
        sqlSession.close();
    }

62、编辑DemoUserMapper.xml

    <!--批量更新操作-->
    <update id="updateUser">
        update demo_user set age = #{age}, sex = #{sex}
        where name in (
        <foreach collection="names" item="name" separator=",">
            #{name}
        </foreach>
        )
    </update>

63、编辑DemoUserMapper

void updateUser(Map<String,Object> map);

64、编辑mybatis-config.xml,Mybatis简化

<!--核心配置文件-->
<configuration>

    <!--配置别名-->
    <typeAliases>
        <typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>
    </typeAliases>

65、编辑DemoUserMapper.xml,可以使用简化写法,代替类型的全路径

<mapper namespace="com.jt.mapper.DemoUserMapper">

    <!--实现接口中的方法
        id: 需要与接口中的方法绑定. 一般复制粘贴
        resultType: 对象的包路径.
        规则: sql语句不要添加多余的;号  Oracle数据库不能添加;号
    -->
    <!--
    <select id="findAll" resultType="com.jt.pojo.DemoUser">-->
    <select id="findAll" resultType="DemoUser">
        select id,name,age,sex from demo_user
    </select>

66、编辑mybatis-config.xml,如果有多个pojo,可以这样配置

<!--核心配置文件-->
<configuration>

    <!-- 配置别名 -->
    <typeAliases>
        <!--别名标签只对某个类有效.-->
        <!--<typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>-->

        <!--package 指定的是包路径的信息.-->
        <package name="com.jt.pojo"/>
    </typeAliases>

67、编辑DemoUserMapper.xml

<mapper namespace="com.jt.mapper.DemoUserMapper">
    
    <!--映射原理:
        如果配置文件中定义了包路径,则映射对象时会自动的完成路径的拼接
        resultType="com.jt.pojo.DemoUser"
    -->
    <select id="findAll" resultType="DemoUser">
        select id,name,age,sex from demo_user
    </select>

68、编辑DemoUser,注意新增注解

@Data  //动态生成get/set/toString/equals等方法
@Accessors(chain = true) //开启链式加载 重写set方法
@NoArgsConstructor  //无参构造
@AllArgsConstructor //有参构造
@Alias("DemoUser")
public class DemoUser implements Serializable {

    private Integer id;
    private String name;
    private Integer age;
    private String sex;

}

69、Mybatis简化,sql重复,可以使用sql标签

1. select id,name,age,sex from demo_user where id = 1
2. select id,name,age,sex from demo_user where name = xxx

70、用法

    <!--2.简化Sql标签 -->
    <sql id="demo_user_sql">
        select id,name,age,sex from demo_user
    </sql>

    <!--include 代表包含Sql标签 -->
    <select id="findAll" resultType="DemoUser">
        <include refid="demo_user_sql"/>
    </select>

71、sql标签的说明

优势:
1.使用Sql标签可以节省xml的文件大小.
2.代码的结构相对简单.
弊端:
1.Sql只能抽取公共的Sql语句,局限性稍大.
2.如果大量的使用Sql标签,则代码的可读性差

72、编辑TestMybatis2,Mybatis,动态sql

IF-WHERE用法

    /**
     *   封装DemoUser的对象,根据对象中不为null的属性查询
     */
    @Test
    public void testFindWhere(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser demoUser = new DemoUser();
        demoUser.setAge(3000);
        List<DemoUser> list = demoUserMapper.findWhere(demoUser);
        System.out.println(list);
        sqlSession.close();
    }

73、编辑DemoUserMapper.xml

    <!--动态Sql案例
      思路: 如果数据不为null,mybatis才会当做条件
      if标签说明:
          test: 判断的条件 直接写属性即可
      where标签: 去除条件中多余的 and 或者 or的
      说明: if和 where 几乎一起出现.
  -->
    <select id="findWhere" resultType="DemoUser">
        select id,name,age,sex from demo_user
        <where>
            <if test="name != null">name = #{name}</if>
            <if test="age !=null"> and age=#{age}</if>
            <if test="sex !=null"> and sex=#{sex}</if>
        </where>
    </select>

74、编辑DemoUserMapper

List<DemoUser> findWhere(DemoUser demoUser);

75、运行结果

76、编辑TestMybatis2,动态Sql-SET标签

    /**
     * 需求: 根据Id,动态的实现数据的更新.
     */
    @Test
    public void testUpdateSet(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser user = new DemoUser();
        user.setId(1).setName("守山大使");
        demoUserMapper.updateUser2(user);
        sqlSession.close();

    }

77、编辑DemoUserMapper

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值