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

MyBaits

MyBaits

  • MyBaits的jar包介绍
  • MyBaits的入门案例
    • 创建实体
  • java日志处理框架
    • 常用的日志处理框架
    • Log4j的日志级别
  • Mybatis配置的完善
    • Mybatis的日志管理
    • 使用别名alias
      • 方式一
      • 方式二
  • SqlSession对象下的常用API
    • 查询操作
  • Mapper动态代理
  • Mapper 动态代理规范
    • 查询所有用户
    • 根据用户ID查询用户
  • Mapper动态代理模式下的多参数处理
    • @Param注解传参法
    • POJO传参法

MyBaits的jar包介绍

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

MyBaits的入门案例

创建实体

E:\java\MyBaits\mybatisdemo\src\com\bjsxt\pojo\Users.java

java日志处理框架

常用的日志处理框架

在这里插入图片描述
Log4j: Log For Java(Java 的日志) 是 Apache 提供的一个开源的 Java主流日志框架

Log4j的日志级别

在这里插入图片描述

Mybatis配置的完善

Mybatis的日志管理

使用别名alias

Mybatis 中的别名配置它只和 XML 配置有关, 只用来减少类完全限定名的多余部分。注
意:别名都是大小写不敏感的。

方式一

使用 typeAlias 指定单个类的别名

<typeAliases><typeAlias type="com.bjsxt.pojo.Users" alias="u"/>
</typeAliases>
<!--注意该标签的顺序,放在<settings>标签后面,具体顺序查看Ctrl+<configuration>-->
<select id="selectUsersById" parameterType="int" resultType="u">select * from users where userid = #{suibian}
</select>

表示用u来代替com.bjsxt.pojo.Users

方式二

使用package指定某个包下所有类的默认别名

<typeAliases><package name="com.bjsxt.pojo"/>
</typeAliases>

引入后的映射文件

<select id="selectUsersById" parameterType="int" resultType="users">select * from users where userid = #{suibian}
</select>

这段代码的主要意思呢就是给com.bjsxt.pojo这个包结构下所有的类都起一个别名这个别名就是这个类名的小写字母,以后就可以用小写字母来代替这个包结构了。

eg:com.xxx.xxx.GoodsName就可以替换为goodsnamecom.xxx.xxx.GoodsNumber就可以替换为goodsnumber

SqlSession对象下的常用API

查询操作

1.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\mapper\UsersMapper.xml

<!--    根据用户名与用户性别查询用户,用集合返回--><select id="selectUsersByNameAndSex" resultType="users">select * from users where username = #{name} and usersex = #{sex}</select>
</mapper>
//2.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\UsersDao.javaMap<Integer,Users> selectUsersByNameAndSex(String username, String usersex);
//3.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\dao\impl\UsersDaoImpl.java(省略了UsersDao.java)@Overridepublic Map<Integer, Users> selectUsersByNameAndSex(String username, String usersex) {SqlSession sqlSession = MybatisUtils.getSqlSession();Map<String,String> param = new HashMap<>();param.put("name",username);//要和UserMapper.xml中username = #{name} and usersex = {sex}对应param.put("sex",usersex);Map<Integer, Users> users = sqlSession.selectMap("com.bjsxt.mapper.UserMapper.selectUsersByNameAndSex", param, "userid");return users;}
//4.E:\java\MyBaits\mybatisdemo\src\com\bjsxt\service\serviceimpl\UsersServiceImpl.java
@Overridepublic Map<Integer, Users> findUsersByNameAndSex(String username, String usersex) {SqlSession sqlSession = MybatisUtils.getSqlSession();Map<Integer, Users> integerUsersMap = null;try {UsersDaoImpl usersDao = new UsersDaoImpl();integerUsersMap = usersDao.selectUsersByNameAndSex(username, usersex);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return integerUsersMap;}
//5.测试
@Testpublic void findUsersByNameAndSex(){UsersServiceImpl usersService = new UsersServiceImpl();Map<Integer, Users> usersByNameAndSex = usersService.findUsersByNameAndSex("潘海宸", "男");Set<Integer> integers = usersByNameAndSex.keySet();for (Integer key:integers){Users users = usersByNameAndSex.get(key);System.out.println(key + "\t" + users.getUserid() + "\t" + users.getUsername() + "\t" + users.getUsersex());}}

Mapper动态代理

在 MyBatis 中提供了另外一种 Dao 层的实现方式,既:Mapper 动态代理(或称为接口
绑定)的操作方式。这种方式下程序员只需要写 Dao 接口,不需要创建 Dao 的接口实现类,
Mybatis 会自动生成接口实现类的代理对象。在 Dao 层我们只要创建接口与映射配置文件即
可。这种方式可以大大简化 Dao 层的代码结构,是在开发中最常见的使用方式。

Mapper 动态代理规范

  • 接口名称需要与映射配置文件名称相同
  • 映射配置文件中 namespace 必须是接口的全名
  • 接口中的方法名和映射配置文件中的标签的 id 一致
  • 接口中的返回值类型和映射配置文件中的 resultType的指定类型一致

注意:引入mapper映射配置文件时mapper标签内有所不同,需要用package标签

<!--引入 Mapper 映射配置文件-->
<mappers><package name="com.bjsxt.mapper"/>
</mappers>

查询所有用户

1.修改映射配置文件

<!--查询所有用户-->
<select id="selectUsersAll" resultType="users">select * from users
</select>

2.修改UserMapper接口添加抽象方法

public interface UsersMapper {
List<Users> selectUsersAll();
}

3.创建业务层接口

public interface UsersService {
List<Users> findUsersAll();
}
  1. 创建业务层接口实现类
    //可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了
 public List<Users> findUsersAll() {List<Users> list = null;SqlSession sqlSession = MybatisUtils.getSqlSession();try {//getMapper 方法的作用是根据给定的接口的 Class 对象,生成该接口的接口实现类的代理对象UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);//可以通过接口的名字定位到映射配置文件,所以要求映射配置文件里面的namespace属性的值要和使用接口的全名相同;//定位到映射配置文件后,根据方法名定位到要2使用的标签,所以方法名要和id的值相同。这样就能执行标签里的Sql语句了list = mapper.selectUsersAll();} catch (Exception e) {sqlSession.rollback();e.printStackTrace();} finally {MybatisUtils.closeSqlSession();}return list;}

5.测试

@Testpublic void findUsersAll(){UsersServiceImpl usersService = new UsersServiceImpl();List<Users> usersAll = usersService.findUsersAll();Iterator<Users> iterator = usersAll.iterator();while (iterator.hasNext()){Users next = iterator.next();System.out.println(next.toString());}}

根据用户ID查询用户

  1. 修改映射配置文件
<select id="selectUsersById" parameterType="_int" resultType="users">select * from users where userid = #{id}
</select>
  1. 修改UsersMapper接口添加抽象方法
Users selectUsersById(int id);
  1. 修改业务层接口
Users findUsersById(int id);
  1. 修改业务层接口实现类
 @Overridepublic Users findUsersById(int id) {SqlSession sqlSession = MybatisUtils.getSqlSession();Users users = null;try {UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);users = mapper.selectUsersById(id);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return users;}
  1. 测试
@Testpublic void findUsersById(){UsersServiceImpl usersService = new UsersServiceImpl();Users user = usersService.findUsersById(2);System.out.println(user.toString());}

Mapper动态代理模式下的多参数处理

@Param注解传参法

注解中@param(“…”)中的参数代表的是Mapper映射文件中#{…}里面的值。

  1. 修改映射配置文件
<!--根据用户姓名与性别查询用户,使用@Param 注解传参法-->
<select id="selectUsersAnnParam" resultType="users">select * from users where username = #{name} and usersex= #{sex}
</select>
  1. 修改UsersMapper接口添加抽象方法
List<Users> selectUsersAnnParam(@Param("name") String username,@Param("sex") String usersex);
  1. 修改业务层接口
List<Users> findUsersAnnParam(@Param("name") String username1, @Param("sex") String usersex);
  1. 修改业务层接口实现类
@Overridepublic List<Users> findUsersAnnParam(String username1, String usersex) {SqlSession sqlSession = MybatisUtils.getSqlSession();List<Users> list = null;try {UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);list = mapper.selectUsersAnnParam(username1, usersex);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return list;}
  1. 测试
@Testpublic void findUsersAnnParam(){UsersServiceImpl usersService = new UsersServiceImpl();List<Users> user = usersService.findUsersAnnParam("潘海宸", "男");Iterator<Users> iterator = user.iterator();while (iterator.hasNext()){Users next = iterator.next();System.out.println(next.toString());}

POJO传参法

在 Mapper 动态代理中也可以使用 POJO 作为传递参数的载体,在 SQL 语句中绑定参数
使用 POJO 的属性名作为参数名即可。此方式推荐使用。

  1. 修改映射配置文件
<!--根据用户姓名与性别查询用户,使用 POJO 传参法-->
<select id="selectUsersPOJOParam" resultType="users">select * from users where username = #{username} and usersex=#{usersex}
</select>
  1. 修改UsersMapper接口添加抽象方法
List<Users> selectUsersPOJOParam(Users users);
  1. 修改业务层接口
 List<Users> findUsersPOJOParam(Users users);
  1. 修改业务层接口实现类
@Overridepublic List<Users> findUsersPOJOParam(Users users) {SqlSession sqlSession = MybatisUtils.getSqlSession();List<Users> list = null;try {UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);list = mapper.selectUsersPOJOParam(users);} catch (Exception e) {e.printStackTrace();sqlSession.rollback();} finally {MybatisUtils.closeSqlSession();}return list;}
  1. 测试
@Testpublic void selectUsersPOJOParam(){UsersServiceImpl usersService = new UsersServiceImpl();Users user = new Users();user.setUsername("潘海宸");user.setUsersex("男");List<Users> usersPOJOParam = usersService.findUsersPOJOParam(user);Iterator<Users> iterator = usersPOJOParam.iterator();while (iterator.hasNext()){Users next = iterator.next();System.out.println(next.toString());}}
http://www.lryc.cn/news/14235.html

相关文章:

  • kubeadm的部署、Dashboard UI以及连接私有仓库
  • 刷题记录:牛客NC20325[SDOI2009]HH的项链
  • 【REACT-路由v6】
  • 【离散数学】3. 代数系统
  • 深度学习常用的优化器整理
  • Java 内部类
  • 【FAQ】集成分析服务的常见问题及解决方案
  • 11.注意力机制
  • 45岁当打之年再创业,剑指中国版ChatGPT,这位美团联合创始人能否圆梦?
  • 数据结构——第二章 线性表(2)——链式存储结构
  • 【更新】囚生CYの备忘录(20230216~)
  • 分布式事务几种方案
  • Eclipse各版本安装Tomcat插件全攻略
  • 志趣相投的人总会相遇——社科院与杜兰大学金融管理硕士项目
  • 算法专题训练营
  • 让ChatGPT生成以自己为主角的短篇小说
  • c++提高篇——vector容器
  • 使用BP神经网络诊断恶性乳腺癌(Matlab代码实现)
  • # Rust Web入门(二):Actix
  • jvm之String
  • WebRTC系列-工具系列之ByteBuffer,BitBuffer及相关类
  • Spring中bean的生命周期(通俗易懂)
  • 雷达编程实战之恒虚警率(CFAR)检测
  • Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿
  • @JsonSerialize—优雅地封装返回值
  • 【Python网络编程】利用Python进行TCP、UDP套接字编程
  • fuzz测试之libfuzzer使用小结
  • 电子标签拣货系统——外接供电版
  • 为什么启动一个线程不用run()方法,而是用start()方法
  • Java File相关操作