尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行

秒鲨后端之MyBatis【2】默认的类型别名、MyBatis的增删改查、idea中设置文件的配置模板、MyBatis获取参数值的两种方式、特殊SQL的执行 别忘了请点个赞收藏关注支持一下博主喵! ! !下篇更新 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。默认的类型别名-------MyBatis的增删改查------------1. 添加 insert into t_user values(null,‘admin’,‘123456’,23,‘男’,‘12345qq.com’) 2. 删除为什么delete函数的返回值为int从数据库操作的角度来看大多数数据库管理系统如MySQL、Oracle、SQL Server等在执行DELETE语句时会返回一个表示受影响的行数即被删除的行数的整数值。(同理增删改都是返回一个表示受影响的行数)delete from t_user where id 6 3. 修改 update t_user set username ‘张三’ where id 5 4. 查询一个实体类对象 select * from t_user where id 2 //如何打印结果 User user userMapper.getUserById(); System.out.println(user); 5. 查询集合多行多列 select * from t_user * //如何打印结果 List list mapper.getAlluer(); list,foreach(user - System.out.println(user)); * 注意 1. 查询的标签select【只有select才要】必须设置属性resultType或resultMap用于设置实体类和数据库表的映射关系因为mybatis不知道要用哪个映射关系所以才会报错 * resultType自动映射(类型)用于属性名和表中字段名一致的情况设置的是默认的映射关系 * resultMap设置自定义的映射关系用于一对多或多对一或字段名和属性名不一致的情况 2. 当查询的数据为多条时不能使用实体类作为返回值只能使用集合否则会抛出异常TooManyResultsException但是若查询的数据只有一条可以使用实体类或集合作为返回值例如 User getUserById()、List getUserList()idea中如何设置文件的配置模板----------------### 1. mybatis-config.xml核心配置文件这样就可以快速创建mybatis-config.xml核心配置文件了然后再设置一下这个模板的代码不固定的地方则空白即可如类型别名所在的包最后的映射文件等等具体情况具体设置。### 2. properties文件的模板我们这里设置一个模板名jdbc.properties的模板:因为核心配置文件我设置了properties所以也得必须创建该properties所以就来弄一个模板### 3. 映射文件的模板下面是mapper接口文件即创建的是interface-java类根据不同用法创建不同的mapper接口文件故不设置模板。如下创建了名为UserMapper的接口文件意为操作User表的接口文件接口文件创建后创建映射文件所以设置映射文件模板全类名为自己设置这样就方便还可以设置如一种sql方法就用一种接口映射的方式这样设置多个方式可选。MyBatis获取参数值的两种方式重点---------------------* MyBatis获取参数值的两种方式${}和#{}* ${}的本质就是字符串拼接#{}的本质就是占位符赋值*KaTeX parse error: Expected EOF, got # at position 51: …赋值时需要手动加单引号但是#̲{}使用占位符赋值的方式拼接s…{}和#{}以_任意的名称最好见名识意获取参数的值即如#{aaa}也行记住重要的只是#{}位置和传入的值对不对注意KaTeX parse error: Expected EOF, got # at position 158: …ere username #̲{username} …{username}’ ### 多个字面量类型的参数3.5.9以上的mybatis依赖可以直接用变量(参数)名而不用arg0arg1和param1param2了_* 若mapper接口中的方法参数为多个时此时MyBatis会自动将这些参数以如下两种方式放在一个map集合中 1. 以arg0,arg1…为键以参数为值 2. 以param1,param2…为键以参数为值* 因此只需要通过KaTeX parse error: Expected EOF, got # at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号。 * 使用arg或者param都行要注意的是arg是从arg0开始的param是从param1开始的 select * from t_user where username #{arg0} and password #{arg1} select * from t_user where username ‘param1′andpassword′{param1} and password param1′andpassword′{param2}’ ### map集合类型的参数* 若mapper接口中的方法需要的参数为多个时此时可以手动创建map集合将这些数据放在map中只需要通过KaTeX parse error: Expected EOF, got # at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号 select * from t_user where username #{username} and password #{password} Test public void checkLoginByMap() { SqlSession sqlSession SqlSessionUtils.getSqlSession(); ParameterMapper mapper sqlSession.getMapper(ParameterMapper.class); MapString,Object map new HashMap(); map.put(“usermane”,“admin”); map.put(“password”,“123456”); User user mapper.checkLoginByMap(map); System.out.println(user); } ### 实体类类型的参数* 若mapper接口中的方法参数为实体类对象时此时可以使用KaTeX parse error: Expected EOF, got # at position 4: {}和#̲{}通过访问实体类对象中的属…{}需要手动加单引号。实际可能用到这个比较多 insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email}) Test public void insertUser() { SqlSession sqlSession SqlSessionUtils.getSqlSession(); ParameterMapper mapper sqlSession.getMapper(ParameterMapper.class); User user new User(null,“Tom”,“123456”,12,“男”,“123321.com”); mapper.insertUser(user); } ### 使用Param标识参数* 可以通过Param注解标识mapper接口中的方法参数此时会将这些参数放在map集合中相当于第二和第三种方法的结合。 1. 以Param注解的value属性值为键以参数为值 2. 以param1,param2…为键以参数为值* 只需要通过KaTeX parse error: Expected EOF, got # at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号 select * from t_user where username #{username} and password #{password} Test public void checkLoginByParam() { SqlSession sqlSession SqlSessionUtils.getSqlSession(); ParameterMapper mapper sqlSession.getMapper(ParameterMapper.class); mapper.CheckLoginByParam(“admin”,“123456”); } ### 总结* 建议分成两种情况进行处理 1. 实体类类型的参数 2. 使用Param标识参数MyBatis的各种查询功能--------------1. 如果查询出的数据只有一条可以通过 1. 实体类对象接收 2. List集合接收 3. Map集合接收结果{password123456, sex男, id1, age23, usernameadmin}2. 如果查询出的数据有多条一定不能用实体类对象接收会抛异常TooManyResultsException可以通过 1. 实体类类型的LIst集合接收 2. Map类型的LIst集合接收 3. 在mapper接口的方法上添加MapKey注解### 查询一个实体类对象 /** * 根据用户id查询用户信息 * param id * return/ User getUserById(Param(“id”) int id); select * from t_user where id #{id} ### 查询一个List集合 /* * 查询所有用户信息 * return/ List getUserList(); select * from t_user ### 查询单个数据咱们这里的resultType依旧可以用User因为User数据库表里面有integer即通过User表识别查询的数据为integer当然也可以自己如下直接设置因为“单个数据”的“类型”这两个已知便自己写为integer /* * 查询用户的总记录数 * return * 在MyBatis中对于Java中常用的类型都设置了类型别名 * 例如java.lang.Integer–int|integer * 例如int–_int|_integer * 例如Map–map,List–list/ int getCount(); select count(id) from t_user ### 查询一条数据为map集合之后会用的很多是因为有可能resultType设置为User我们自己写的数据库表有可能里面没有查询表结果中某一个或是多个的数据类型的映射即实体对象此时就可以直接用map集合把他们全部存入map。 /* * 根据用户id查询用户信息为map集合 * param id * return/ MapString, Object getUserByIdToMap(Param(“id”) int id); select * from t_user where id #{id} ### 查询多条数据为map集合#### 方法一 /* * 查询所有用户信息为map集合 * return * 将表中的数据以map集合的方式查询一条数据对应一个map若有多条数据就会产生多个map集合此时可以将这些map放在一个list集合中获取/ ListMapString, Object getAllUserToMap(); select * from t_user #### 方法二 /* * 查询所有用户信息为map集合 * return * 将表中的数据以map集合的方式查询一条数据对应一个map若有多条数据就会产生多个map集合并且最终要以一个map的方式返回数据此时需要通过MapKey注解设置map集合的键值是每条数据所对应的map集合/ MapKey(“id”) MapString, Object getAllUserToMap(); select * from t_user 特殊SQL的执行--------### 模糊查询 /* * 根据用户名进行模糊查询 * param username * return java.util.Listcom.atguigu.mybatis.pojo.User * date 2022/2/26 21:56/ List getUserByLike(Param(“username”) String username); select * from t_user where username like “%”#{mohu}“%” * 其中select * from t_user where username like %#{mohu}%是最常用的### 批量删除只能使用KaTeX parse error: Expected EOF, got # at position 8: {}如果使用#̲{}则解析后的sql语句为…{ids}) //测试类 Test public void deleteMore() { SqlSession sqlSession SqlSessionUtils.getSqlSession(); SQLMapper mapper sqlSession.getMapper(SQLMapper.class); int result mapper.deleteMore(“1,2,3,8”); System.out.println(result); } ### 动态设置表名* 只能使用${}因为表名不能加单引号 /** * 查询指定表中的数据 * param tableName * return java.util.Listcom.atguigu.mybatis.pojo.User * date 2022/2/27 14:41/ List getUserByTable(Param(“tableName”) String tableName); select * from ${tableName} ### 添加功能获取自增的主键使用场景: * 当有班级表和学生表满足如下一对多或者多对多关系时需设置中间表时我们需要获取新添加的班级的id来给中间表。 * t_clazz(clazz_id,clazz_name) * t_student(student_id,student_name,clazz_id) 1. 添加班级信息 2. 获取新添加的班级的id 3. 为班级分配学生即将某学的班级id修改为新添加的班级的id* 在mapper.xml中设置两个属性 * useGeneratedKeys设置当前标签中的sql使用了自增的主键 * keyProperty因为增删改有统一的返回值是受影响的行数因此只能将获取的自增的主键放在传输的参数user对象的某个属性中(如下我们设置的为id属性即id列这样返回的每行数据就可以带上其对应的id了) /** * 添加用户信息 * param user * date 2022/2/27 15:04 */ void insertUser(User user); insert into t_user values (null,#{username},#{password},#{age},#{sex},#{email}) //测试类 Test public void insertUser() { SqlSession sqlSession SqlSessionUtils.getSqlSession(); SQLMapper mapper sqlSession.getMapper(SQLMapper.class); User user new User(null, “ton”, “123”, 23, “男”, “123321.com”); mapper.insertUser(user); System.out.println(user); //输出user{id10, username‘ton’, password‘123’, age23, sex‘男’, email‘123321.com’}自增主键存放到了user的id属性中 }别忘了请点个赞收藏关注支持一下博主喵! ! !下篇更新 秒鲨后端之MyBatis【3】自定义映射resultMap、动态SQL、MyBatis的缓存、MyBatis的逆向工程、分页插件。
返回列表