2021-10-28

1.Mybatis案例学习

1.1 简化测试操作

private SqlSessionFactory sqlSessionFactory;

    /**
     * 设计思路:
     *   1.要求每次执行测试方法时 都先生成一个SqlSessionFactory
     *   2.从sqlSessionFactory中获取sqlSession
     *   3.完成业务操作
     *   注解说明:
     *      @BeforeEach 当每次执行@Test注解方法时,都会先执行该方法.
     */
    @BeforeEach
    public void init() throws IOException {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    }

    @Test
    public void testFind2(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
        sqlSession.close();
    }

2.Mybatis CUDR操作

2.1根据ID查询数据

2.1.1 需求说明

查询 id=1的用户数据

2.1.2 编辑接口方法

在这里插入图片描述

2.1.3 编辑UserMapper.xml映射文件

<!--根据ID查询用户数据-->
    <select id="findUserById" parameterType="Integer" resultType="com.jt.pojo.User">
        select * from demo_user where id = #{id}
    </select>

2.1.4 编辑单元测试方法

 @Test
    public void testUserById(){
        int id = 1;
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findUserById(id);
        System.out.println(user);
        sqlSession.close();
    }

2.2 用户新增测试

2.2.1 编辑UserMapper 接口

在这里插入图片描述

2.2.2 编辑UserMapper.xml

<!--
        实现用户新增
            1.关于对象参数传递说明: saveUser(User user);
            2.mybatis取值语法: #{属性名}
            3.用户在执行"更新"操作时,自动的返回影响的行数
    -->
    <insert id="saveUser">
        insert into demo_user(id,name,age,sex)
            value (null,#{name},#{age},#{sex})
    </insert>

2.2.3 编辑测试代码

/实现User对象的新增操作
    //mybatis在执行"更新"操作时 需要提交事务
    @Test
    public void testSaveUser(){
        User user = new User(null,"嫦娥",16, "女");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int rows = userMapper.saveUser(user);
        System.out.println("影响的行数:"+rows);
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }

2.3 用户修改

2.3.1 编辑测试API

/**
     *  需求:  要求将id=232的数据 name="嫦娥姐姐" age=99岁
     */
    @Test
    public void testUpdateUser(){
        //1.封装数据
        User user = new User(232,"嫦娥姐姐",99,null);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int rows = userMapper.updateUser(user);
        if(rows>0){
            //事务提交
            sqlSession.commit();
        }
        System.out.println("影响了:" + rows+"行");
        sqlSession.close();
    }

2.3.2 编辑UserMapper 接口

在这里插入图片描述

2.3.3 编辑UserMapper 映射文件

update demo_user set name=#{name},age=#{age} where id=#{id} ## 2.4用户删除 ### 2.4.1编辑测试方法 ```java /** * 完成删除操作 将name="嫦娥姐姐"的数据删除. * sql: delete from demo_user where name=#{嫦娥姐姐} */ @Test public void deleteUserByName(){ //获取SqlSession,之后自动提交事务 SqlSession sqlSession = sqlSessionFactory.openSession(true); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); String name = "嫦娥姐姐"; int rows = userMapper.deleteUserByName(name); sqlSession.close(); } ``` ### 2.4.2 编辑Mapper接口和映射文件
int deleteUserByName(String name);
	
	<delete id="deleteUserByName">
        delete from demo_user where name=#{name}
    </delete>

2.5 利用Map 集合封装数据

2.5.1需求说明

需求:查询 age > 100 并且 age < 1000 的用户
sql: select * from demo_user where age > 100 and age < 1000

2.5.2 编辑测试方法

//需求:  查询 age> 100 并且  age < 1000的用户.
    //知识点: 如果有重名属性,一般使用Map集合封装数据
    @Test
    public void testMap(){
        //获取SqlSession,之后自动提交事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map map = new HashMap();
        map.put("minAge",100);
        map.put("maxAge",1000);
        List<User> userList = userMapper.findByAge(map);
        System.out.println(userList);
        sqlSession.close();
    }

2.5.3 编辑接口 / 映射文件

UserMapper文件中添加方法
	 List<User> findByAge(Map map);
	<!--
        语法: findByAge(Map map);
        取值: #{key}  根据key 获取value的数据
        关于转义的说明:
            xml文件中个别的字母需要转义
            大于  >  &gt;
            小于  <  &lt;
            与号  &  &amp;
            转义标签  <![CDATA[  需要转义的内容  ]]>
    -->
    <select id="findByAge" resultType="com.jt.pojo.User">
        <!--select * from demo_user where age > #{minAge}
           and age &lt; #{maxAge}
         -->
       <![CDATA[
           select * from demo_user where age > #{minAge}
           and age < #{maxAge}
        ]]>
   </select>

2.5.4 转义标签总结

大于  >  &gt;
小于  <  &lt;
与号  &  &amp;
转义标签  <![CDATA[  需要转义的内容  ]]>

2.6 @Param 注解说明

2.6.1 注解用法

在这里插入图片描述

2.6.2 编辑测试方法

/**
     * 测试@Param注解
     * 需求:  查询 age> 100 并且  age < 1000的用户.
     */
    @Test
    public void testParam(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int minAge =  100;
        int maxAge =  1000;
        List<User> userList = userMapper.findParam(minAge,maxAge);
        System.out.println(userList);
        sqlSession.close();
    }

2.6.3 编辑接口 / 映射文件

List<User> findParam(@Param("minAge") int minAge,
                         @Param("maxAge") int maxAge);
	
	<select id="findParam" resultType="com.jt.pojo.User">
         <![CDATA[
           select * from demo_user where age > #{minAge}
           and age < #{maxAge}
        ]]>
    </select>

2.7 模糊查询

2.7.1 业务需求

查询 name 中包含 "乔"字的用户
sql : select * from demo_user where name like “%乔%”

2.7.2 编辑测试类

/**
     * 查询name中包含"乔"字的用户
     */
    @Test
    public void testLike(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        String name = "乔";
        List<User> userList = userMapper.findUserByLike(name);
        System.out.println(userList);
        sqlSession.close();
    }

2.7.3 编辑接口 和映射文件

List<User> findUserByLike(String name);
	
	 <select id="findUserByLike" resultType="com.jt.pojo.User">
        select * from demo_user where name like "%"#{name}"%"
    </select>

3.简化Mybatis 配置

3.1 别名设置

3.1.1 别名说明

说明:resultType中的属性 每次都需要添加全路径 比较繁琐 可以 使用别名进行优化
在这里插入图片描述

3.1.2别名设置

在这里插入图片描述

3.1.3 使用别名

在这里插入图片描述

3.1.4 使用 别名包

在这里插入图片描述

3.2 简化sql语句

<!--说明:
        1.如果配置了别名包: 则映射时会自动的拼接包路径
        2. include refid="引用SqlID"
     -->
    <select id="findUser" resultType="User">
        select <include refid="user_cloumn"/>  from demo_user
    </select>

    <!--2.简化Sql-->
    <sql id="user_cloumn">
        id,name,age,sex
    </sql>

4. 课堂总结

1. 简化test 方法 @BeforeEach
2. Mybatis常用 CURD操作
	2.1  编辑接口
	2.2  编辑映射文件 接口与 映射文件必须  一   一 对应 
	2.3  insert / update /delete  自动 返回影响行数         select  必须 有 resultType  包路径
3. 参数传递
	3.1  基本类型数据 1  个 
	3.2  可以将多个参数封装为POJO对象  不能有重名属性
	3.3  更加通用的封装为 Map 集合 @Param ("key")
4. xml 中转义字符写法 
5. 模糊查询 xml写法 like "%"#{属性名}"%"	
6. 简化配置
	6.1 别名包
	6.2  sql标签 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个可能的Java实现: ```java import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; public class RentPlanGenerator { private static final double RENT_INCREASE_RATE = 0.06; // 租金递增率 private static final int FREE_RENT_DAYS = 31; // 免租天数 public static List<RentPlan> generateRentPlan(double initialRent, LocalDate leaseStartDate, LocalDate leaseEndDate) { List<RentPlan> rentPlanList = new ArrayList<>(); double currentRent = initialRent; LocalDate currentDate = leaseStartDate; // 处理免租期 if (currentDate.isBefore(leaseStartDate.plusDays(FREE_RENT_DAYS))) { currentDate = leaseStartDate.plusDays(FREE_RENT_DAYS); } while (currentDate.isBefore(leaseEndDate)) { LocalDate nextIncreaseDate = currentDate.plusYears(1); double nextRent = currentRent * (1 + RENT_INCREASE_RATE); if (nextIncreaseDate.isBefore(leaseStartDate.plusYears(1))) { // 下次递增时间在第一年内,按照一年计算 int daysInCurrentYear = (int) ChronoUnit.DAYS.between(currentDate, nextIncreaseDate); rentPlanList.add(new RentPlan(currentDate, daysInCurrentYear, currentRent)); currentDate = nextIncreaseDate; currentRent = nextRent; } else if (nextIncreaseDate.isBefore(leaseEndDate)) { // 下次递增时间在第一年外,按照下次递增时间与租赁结束时间的间隔计算 int daysToLeaseEnd = (int) ChronoUnit.DAYS.between(currentDate, leaseEndDate); rentPlanList.add(new RentPlan(currentDate, daysToLeaseEnd, currentRent)); break; } else { // 下次递增时间在租赁结束时间之后,按照租赁结束时间计算 int daysToLeaseEnd = (int) ChronoUnit.DAYS.between(currentDate, leaseEndDate); rentPlanList.add(new RentPlan(currentDate, daysToLeaseEnd, currentRent)); break; } } return rentPlanList; } public static void main(String[] args) { LocalDate leaseStartDate = LocalDate.of(2021, 3, 1); LocalDate leaseEndDate = LocalDate.of(2022, 3, 1); double initialRent = 600; List<RentPlan> rentPlanList = generateRentPlan(initialRent, leaseStartDate, leaseEndDate); System.out.printf("%-12s%-12s%-12s%n", "时间", "天数", "租金"); for (RentPlan rentPlan : rentPlanList) { System.out.printf("%-12s%-12d%-12.2f%n", rentPlan.getStartDate(), rentPlan.getDays(), rentPlan.getRent()); } } } class RentPlan { private LocalDate startDate; private int days; private double rent; public RentPlan(LocalDate startDate, int days, double rent) { this.startDate = startDate; this.days = days; this.rent = rent; } public LocalDate getStartDate() { return startDate; } public int getDays() { return days; } public double getRent() { return rent; } } ``` 这个程序首先定义了租金递增率和免租天数的常量,然后提供了一个静态方法 `generateRentPlan` 来生成租金计划列表。该方法接受三个参数:初始月租金、租赁开始时间和租赁结束时间。 具体实现时,我们使用循环来逐月生成租金计划。在每次循环中,我们首先计算下次递增租金的时间和金额。然后根据下次递增时间与租赁开始时间的间隔,决定本次循环处理的天数和租金金额。最后将这些信息保存到一个 `RentPlan` 对象中,并添加到租金计划列表中。 在主函数中,我们使用 `generateRentPlan` 方法生成租金计划列表,并以表格形式输出。输出结果如下: ``` 时间 天数 租金 2021-04-01 30 600.00 2021-05-01 31 636.00 2021-06-01 30 674.16 2021-07-01 31 713.57 2021-08-01 31 754.29 2021-09-01 30 796.39 2021-10-01 31 840.94 2021-11-01 30 887.02 2021-12-01 31 934.72 2022-01-01 31 984.12 2022-02-01 28 1035.30 ``` 可以看到,程序正确地根据递增周期和递增率生成了每个月的租金计划,并且考虑了免租期的影响。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值