//数据库建表代码 CREATE TABLE userInfo ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(127) NOT NULL, password VARCHAR(127) NOT NULL, age INT, gender INT, phone VARCHAR(15), delete_flag INT, create_time DATETIME DEFAULT NOW(), update_time DATETIME DEFAULT NOW(), PRIMARY KEY (id) );
MyBatis:用于去简化数据库操作
1.引入依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency>
2.配置数据库
spring: datasource: # java100对应的意思是创建的数据库的名称 url: jdbc:mysql://127.0.0.1:3306/java100?characterEncoding=utf8&useSSL=false username: root password: lcl15604007179 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*Mapper.xml configuration: # 配置打印 MyBatis 执行的 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true #自动驼峰转换
云服务器其实也是一个机器。
打印MyBatis的日志配置:
因为日志肯定也是影响性能的,打印的日志越多,受影响越大
//只出现开发的环境中,不要出现在线上环境 //开发环境(本地开发,一些公司也会提供单独的服务器让员工进行开发调试) -(有开发环境的数据库) //测试环境(给测试人员使用的)。 测试环境的数据库/配置等 下面两个通常使用同一个数据库 //预发布环境(和线上环境一样,但是不对外提供服务) //发布环境(线上环境) mybatis: mapper-locations: classpath:mapper/*Mapper.xml configuration: # 配置打印 MyBatis 执行的 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true #自动驼峰转换
灰度发布:指发布环境,比如发布环境有200台机器,发布的时候是一批一批的机器的发布
通常刚开始就发布一台,也就是1/200的流量进入了,观察一段时间之后,继续观察,如果没有问题,就会继续发布(可能发布20台)
发布=上线
如何获取自增id,使用注解(注意哈,你这个自增id使用前,要保证,建表,他的那个表的这个属性是自增主键,不然,他并不会给你加主键,换句话说他会一直都是空的状态,它更像是用来获取自增的主键值,因为我们进行插入的时候,因为已经在表内设置了自增主键,就算你不是这么插入的,也还会是有自增的效果)
参数为对象是对参数进行重命名:
如果你重命名了
2.删除与修改
//删除数据库内容 @Delete("delete from userInfo where id=#{id}") Integer delete(Integer id); //修改数据库内容 @Update("update userInfo set age=#{age} where id=#{id}") Integer update(UserInfo userInfo); //下面是测试代码 @Test void delete() { userInfoMapper.delete(1); } @Test void update() { UserInfo userInfo=new UserInfo(); userInfo.setAge(8); userInfo.setId(3); Integer result=userInfoMapper.update(userInfo); if(result>0){ log.info("恭喜成功"); } }
查询的问题:(create_time对应实体中createTime,面对这种情况的解决方法)
但是在开发中,属性名字和字段名字不一样是很常见的,我们该怎么办呢?
使用*和不用*效率不同,全量字段就全部写一遍即可。
使用@Results注解,这样就和上面的别名一个意思,column是数据库的列
但是一直这样也很麻烦,难道我执行一个查询,就要去写这么多东西?
于是产生了复用
自动转驼峰(优雅,最推荐使用)
mybatis: mapper-locations: classpath:mapper/*Mapper.xml configuration: # 配置打印 MyBatis 执行的 SQL log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true #自动驼峰转换
以上的方式的结果,都可以获取这个值
学习XML的方式
1.需要配置对应数据库
2.指明xml路径(结尾,必须是Mapper结尾,前面的**表示前缀任意,换句话说我们后面其实Mapper都可以不用写,但是写一下更规范肯定还是)
此时定义了一个UserInfoXML的类,那么那个类的xml文件就应该和这个类名字相同,然后写下面代码,就是一个简单的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.example.myBatis.mapper.UserInfoXMLMapper"> <select id="selectAll" resultType="com.example.myBatis.mapper.UserInfo"> select *from userinfo; </select> </mapper>
类里面的代码
package com.example.myBatis.mapper; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper //容器 public interface UserInfoXMLMapper { List<UserInfo> selectAll() ; }
对应的Test代码
package com.example.myBatis.mapper; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @Slf4j //用于输出日志 可以避免写log...很多的代码 @SpringBootTest //用于让Test文件有权限来访问Spring项目 class UserInfoXMLMapperTest { //属性注入 @Autowired private UserInfoXMLMapper userInfoXMLMapper; @Test void selectAll() { List<UserInfo>userInfos=userInfoXMLMapper.selectAll(); log.info(userInfos.toString()); } }
⚠️:很严重的问题:我调了两天才发现,我们在导入MyBatis的时候,有可能她就会自动在properties这个文件中,写关于MyBatis的xml路径,这样就会和我们在yml里面写的不同,也就会造成冲突,所以说当出现路径不匹配,并且你自己写的路径也都没毛病的时候,不妨再看看properties文件(真的难找,因为肯定没在properties这个文件写路径,所以也不回去怀疑)
1.增:(还是先定义方法)
<insert id="insert"> insert into userInfo(username,password,age,gender,phone) values(#{username},#{password},#{age},#{gender},#{phone}) </insert>
懒得写了,反正挺简单,一个类,一个xml,一个test测试一下就好啦