当前位置: 首页 > news >正文

瑞幸咖啡网站建设方案四川seo平台

瑞幸咖啡网站建设方案,四川seo平台,做医疗设备的网站,动漫设计和动画设计MyBatis的基础操作 1.打印日志2. 参数传递2.1不传参2.2 固定参数 3. 增(Insert)3.1 用对象接参3.2 用param注解接收参数3.3 返回主键 4. 删(Delete)4.1 用Integer接参4.2 用对象接参 5. 改(Update)6. 查(Select)6.1 查6.2 拼接SQL语句6.3 列名和属性名匹配6.3.1 起别名 as6.3.2…

MyBatis的基础操作

  • 1.打印日志
  • 2. 参数传递
    • 2.1不传参
    • 2.2 固定参数
  • 3. 增(Insert)
    • 3.1 用对象接参
    • 3.2 用@param注解接收参数
    • 3.3 返回主键
  • 4. 删(Delete)
    • 4.1 用Integer接参
    • 4.2 用对象接参
  • 5. 改(Update)
  • 6. 查(Select)
    • 6.1 查
    • 6.2 拼接SQL语句
    • 6.3 列名和属性名匹配
      • 6.3.1 起别名 as
      • 6.3.2 结果映射 @Result
      • 6.3.3 配置文件中开启驼峰命令

1.打印日志

在Mybatis当中我们可以借助⽇志, 查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
在配置⽂件中进⾏配置即可

Applicaion.yml配置文件中添加:

mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

或,在Applicaion.properties配置文件中添加:

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

当我们在测试类中运行后,可以在控制面板中看到打印的详细日志:
在这里插入图片描述
在下面的章节中可通过起别名来解决该问题

2. 参数传递

2.1不传参

查询所有的用户(不传参):

@Mapper
public interface UserInfoMapper {// 查询所有用户@Select("select * from user_info")List<UserInfo> queryAllUser();
}

运行结果:
从MySQL中查询的结果:
在这里插入图片描述
Java中UserInfo类的属性:
在这里插入图片描述
为什么有的属性为空值呢?

说明MySQL的对象与Java的对象之间的映射出现了问题,通常是java对象的属性和MySQL对象的字段没有对应上
在这里插入图片描述

2.2 固定参数

需求: 查找id=4的用户,对应的SQL就是: select * from user_info where id=4

@Mapper
public interface UserInfoMapper {@Select("select * from user_info where id =4 ")UserInfo queryById();
}

但是这样的话, 只能查找id=4 的数据, 所以SQL语句中的id值不能写成固定数值,需要变为动态的数值解决⽅案:在queryById⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句
使⽤ #{} 的⽅式获取⽅法中的参数:

@Mapper
public interface UserInfoMapper {@Select("select * from user_info")List<UserInfo> queryAllUser();// 获取参数中的 id@Select("select * from user_info where id = #(id) ")UserInfo queryById(Integer id);
}

如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…} ⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致

添加测试⽤例:
在这里插入图片描述
也可以通过 @Param , 设置参数的别名, 如果使⽤ @Param 设置别名, #{…}⾥⾯的属性名必须和@Param 设置的⼀样:

@Mapper
public interface UserInfoMapper {// 获取参数中的 UserId@Select("select * from user_info where id = #{userId} ")UserInfo queryById(@Param("userId") Integer id);
}

3. 增(Insert)

3.1 用对象接参

Mapper接口:

@Mapper
public interface UserInfoMapper {@Insert("insert into user_info (username, password, age, gender, phone) values(#{username}, #{password}, #{age}, #{gender}, #{phone})")Integer insert(UserInfo userInfo); //用UserInfo获取
}

解释:自动从userInfo对象中找出usernamepassword等属性

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid insert() {UserInfo userInfo =new UserInfo();userInfo.setUsername("liming");userInfo.setPassword("liming");userInfo.setAge(18);userInfo.setGender(1);userInfo.setPhone("888888");userInfoMapper.insert(userInfo);}
}

运行结果:
在这里插入图片描述
在mysql中查询:
在这里插入图片描述

3.2 用@param注解接收参数

下面代码中的SQL语句是拼接的(用两行表示):

@Mapper
public interface UserInfoMapper {@Insert("insert into user_info (username, password, age, gender, phone)"+"values(#{username}, #{password}, #{age}, #{gender}, #{phone})")Integer insert(@Param("userInfo") UserInfo uInfo);
}

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid insert() {UserInfo userInfo =new UserInfo();userInfo.setUsername("lisi");userInfo.setPassword("lisi");userInfo.setAge(20);userInfo.setGender(1);userInfo.setPhone("888888");userInfoMapper.insert(userInfo);}
}

运行结果:
在这里插入图片描述
报错解释:SQL语句中的#{username}找不到在哪,但是有一个参数userInfo

说明重命名后不能自动从对象userInfo中找出username属性,重命名对象后需要在@Insert中准确表达插入属性的来源:

@Mapper
public interface UserInfoMapper {@Insert("insert into user_info (username, password, age, gender, phone)"+" values(#{userInfo.username}, #{userInfo.password}, #{userInfo.age},"+ "" +" #{userInfo.gender}, #{userInfo.phone})")Integer insert(@Param("userInfo") UserInfo uInfo);
}

运行结果:
在这里插入图片描述
MySQL中:
在这里插入图片描述

3.3 返回主键

Insert 语句默认返回的是受影响的⾏数,但有些情况下, 数据插⼊之后, 还需要有后续的关联操作, 需要获取到新插⼊数据的id

⽐如订单系统
当我们下完订单之后, 需要通知物流系统, 库存系统, 结算系统等, 这时候就需要拿到订单ID

如果想要拿到⾃增id, 需要在Mapper接⼝的⽅法上添加⼀个Options的注解:

@Mapper
public interface UserInfoMapper {@Options(useGeneratedKeys= true, keyProperty = "id") //把返回的主键赋值给id@Insert("insert into user_info (username, password, age, gender, phone)"+"values(#{username}, #{password}, #{age}, #{gender}, #{phone})")Integer insert(UserInfo userInfo);
}

解释:
useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段),默认值:false.

keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid insert() {UserInfo userInfo =new UserInfo();userInfo.setUsername("lisi");userInfo.setPassword("lisi");userInfo.setAge(20);userInfo.setGender(1);userInfo.setPhone("888888");Integer count = userInfoMapper.insert(userInfo);log.info("影响的行数:"+count + "  返回的id:"+ userInfo.getId());}
}

运行结果:
在这里插入图片描述

注意: 设置 useGeneratedKeys=true 之后, 方法返回值依然是受影响的行数,自增id会返回到上述 keyProperty 指定的属性中.

4. 删(Delete)

4.1 用Integer接参

Mapper接口:

@Mapper
public interface UserInfoMapper {@Delete("delete from user_info where id = #{id}")Integer delete(Integer id);
}

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid delete() {Integer count = userInfoMapper.delete(1);}
}

运行结果:
在这里插入图片描述

MySQL:
在这里插入图片描述

4.2 用对象接参

mapper接口:

@Mapper
public interface UserInfoMapper {@Delete("delete from user_info where id = #{id}")Integer delete(UserInfo userInfo);
}

测试代码:

@Testvoid delete() {UserInfo userInfo = new UserInfo();userInfo.setId(2);Integer count = userInfoMapper.delete(userInfo);}
}

运行结果:
在这里插入图片描述
MySQL:
在这里插入图片描述

5. 改(Update)

mapper接口:

@Mapper
public interface UserInfoMapper {@Update("update user_info set username=#{username} where id = #{id} ")Integer update(UserInfo userInfo);
}

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setId(9);userInfo.setUsername("88888");userInfoMapper.update(userInfo);}
}

运行结果:
在这里插入图片描述
MySQL:
在这里插入图片描述

6. 查(Select)

6.1 查

mapper接口:

@Mapper
public interface UserInfoMapper {// 注意,企业中尽量不用 *@Select("select username, password, age, gender, phone,delete_flag,create_time,update_time from user_info")List<UserInfo> queryAllUser();
}

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid queryAllUser() {List<UserInfo> list = userInfoMapper.queryAllUser();for(Object item: list) {log.info(item.toString());}}
}

运行结果:
在这里插入图片描述

6.2 拼接SQL语句

下面代码中的SQL语句是拼接的(用两行表示):

@Mapper
public interface UserInfoMapper {// 注意,企业中尽量不用 *@Select("select username, password, age, gender, phone,delete_flag,create_time,update_time"+"from user_info")List<UserInfo> queryAllUser();
}

运行结果:
在这里插入图片描述
SQL语句错误,再看日志里面的结果可以发现update_timefrom写一起了
在这里插入图片描述
正确的SQL拼接:

@Mapper
public interface UserInfoMapper {// 注意,企业中尽量不用 *@Select("select username, password, age, gender, phone,delete_flag,create_time,update_time"+" from user_info")List<UserInfo> queryAllUser();
}

图解:
在这里插入图片描述

运行结果:
在这里插入图片描述
上述图片中看到的是SQL语句运行的结果,java对象映射的结果如下:

该Mapper接口如下:

@Mapper
public interface UserInfoMapper {// 注意,企业中尽量不用 *@Select("select id,username, password, age, gender, phone,delete_flag,create_time,update_time"+" from user_info")List<UserInfo> queryAllUser();
}

运行结果:
在这里插入图片描述
上述图片是SQL语句运行的结果,查询的结果映射到java对象中的结果是:
在这里插入图片描述
从运⾏结果上可以看到, 我们SQL语句中, 查询了delete_flag, create_time, update_time, 但是这⼏个属性却没有赋值.

MyBatis 会根据方法的返回结果进⾏赋值.
方法用对象 UserInfo接收返回结果, MySQL 查询出来数据为⼀条, 就会自动赋值给对象.
方法用List接收返回结果, MySQL 查询出来数据为多条时, 也会⾃动赋值给List。
但是⽅法使⽤UserInfo接收,MySQL 查询返回的数据为多条时, MyBatis执⾏就会报错。

原因分析:
当对象中有多个属性时,自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性。 这意味着如果发现了 id 列和 id 属性,MyBatis 会将列 id的值赋给 id 属性,如果发现了delete_flag列和 deleteFlag属性,MyBatis 不会将delete_flag列的值赋给 deleteFlag属性
在这里插入图片描述
解决方法在下面的章节

6.3 列名和属性名匹配

6.3.1 起别名 as

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样(Mapper接口):

@Mapper
public interface UserInfoMapper {// 注意,企业中尽量不用 *@Select("select id, username, password, age, gender, phone,"+"delete_flag as deleteFlag,create_time as createTime,"+"update_time as updateTime"+" from user_info")List<UserInfo> queryAllUser();
}

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid queryAllUser() {List<UserInfo> list = userInfoMapper.queryAllUser();for (Object item : list) {log.info(item.toString());}}
}

运行结果:
在这里插入图片描述

6.3.2 结果映射 @Result

需要使用@Result注解进行映射(Mapper接口):

@Mapper
public interface UserInfoMapper {@Results({@Result(column="delete_flag", property="deleteFlag"),@Result(column="create_time", property="createTime"),@Result(column="update_time", property="updateTime")})// 注意,企业中尽量不用 *@Select("select id,username, password, age, gender, phone,delete_flag,create_time,update_time "+" from user_info")List<UserInfo> queryAllUser();
}

一个@Results可以被重复使用,给@Results设置id,其他的方法使用@ResultMap时只需要指定value就行了:

@Mapper
public interface UserInfoMapper {// 设置Result id@Results(id ="queryAllUser" , value={@Result(column="delete_flag", property="deleteFlag"),@Result(column="create_time", property="createTime"),@Result(column="update_time", property="updateTime")})// 注意,企业中尽量不用 *@Select("select id,username, password, age, gender, phone,delete_flag,create_time,update_time "+" from user_info")List<UserInfo> queryAllUser();// 使用ResultMapper@ResultMap(value ="queryAllUser")@Select("select id,username, password, age, gender, phone,delete_flag,create_time,update_time "+" from user_info")List<UserInfo> queryAllUser_2();

在这里插入图片描述

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid queryAllUser() {List<UserInfo> list = userInfoMapper.queryAllUser();for (Object item : list) {log.info(item.toString());}}
}

运行结果:
在这里插入图片描述
图解:
在这里插入图片描述

6.3.3 配置文件中开启驼峰命令

在配置文件Application.yml文件中添加如下的配置:

mybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换

在配置文件Application.properties文件中添加如下的配置:

mybatis.configuration.map-underscore-to-camel-case: true #配置驼峰⾃动转换

Mapper接口:

@Mapper
public interface UserInfoMapper {@Select("select id,username, password, age, gender, phone,delete_flag,create_time,update_time "+" from user_info")List<UserInfo> queryAllUser();
}

测试代码:

@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid queryAllUser() {List<UserInfo> list = userInfoMapper.queryAllUser();for (Object item : list) {log.info(item.toString());}}
}

运行结果:
在这里插入图片描述
数据库的字段名 => 类的属性名
驼峰命名规则: abc_xyz => abcXyz
表中字段名:abc_xyz
类中属性名:abcXyz

http://www.cadmedia.cn/news/2901.html

相关文章:

  • 拉了专线可以直接做网站吗爱站网挖掘工具
  • 中国风手机网站模板东莞做网站优化
  • 品牌网站设计公司哪家在线代理浏览网页
  • 深圳自己做网站 服务器短视频seo推广
  • 昆明网站建设哪家便宜东莞seo优化
  • 有域名怎么建设网站淘宝指数官网的网址
  • 中国招标信息公开网惠东seo公司
  • 长沙传媒公司排行英文seo实战派
  • 自己注册公司网站全国31省市疫情最新消息今天
  • 杭州建设企业网站的郑州好的seo外包公司
  • 北京网站设计服务深圳网站优化
  • 华为网站推广策略哪里可以做
  • 漳州商城网站建设宁波seo推广优化哪家强
  • 国外免费b2b网站排名百度小说app
  • 成都哪家做网站游戏行业seo整站优化
  • 建设网站找什么条件百度搜索网址大全
  • 商丘专业做网站市场推广怎么做
  • 济南万网站建设有限公司地址樱桃bt磁力天堂
  • wordpress网站建设网站关键词排名如何提升
  • 老板企业管理培训课程无锡网站建设seo
  • 柳州市住房和城乡建设部网站百度推广个人怎么开户
  • 成品网站分享一下培训网站设计
  • 郑州做网站 汉狮网络专业做网站公司
  • 专做沙发批发的网站seo建设
  • 如果使用自己电脑做网站站长推荐黄色
  • 做商铺最好的网站杭州优化seo
  • 商品网站建设设计思路今天最近的新闻
  • 常州网络推广哪家好优化资源配置
  • 网站建设的技术有哪些河南网站建设
  • 做购物网站哪家公司好整合营销传播的明显特征是