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

做网站怎么配电脑低价网站建设哪家更好

做网站怎么配电脑,低价网站建设哪家更好,凡科建站代理商,兰州兼职做网站文章目录 前言一、#x1f4d6;MyBatis简介1.Mybatis历史2.MyBatis特性3.对比#xff08;其他持久化层技术#xff09; 二、#x1f4e3;搭建MyBatis1.开发环境2.创建maven工程3.创建MyBatis核心配置文件4.创建mapper接口5.创建MyBatis的映射文件6.通过junit测试功能7.加入… 文章目录 前言一、MyBatis简介1.Mybatis历史2.MyBatis特性3.对比其他持久化层技术 二、搭建MyBatis1.开发环境2.创建maven工程3.创建MyBatis核心配置文件4.创建mapper接口5.创建MyBatis的映射文件6.通过junit测试功能7.加入log4j日志功能8.核心配置文件详解 三、MyBatis的增删改查映射文件四、MyBatis获取参数值的两种方式重点1.单个字面量类型的参数2.多个字面量类型的参数3.map集合类型的参数4.实体类类型的参数5.使用Param标识参数 五、MyBatis的各种查询功能1.查询一个实体类对象2.查询一个List集合3.查询单个数据4.查询一条数据为map集合5.查询多条数据为map集合方法一方法二 6.测试类 六、特殊SQL的执行1.模糊查询2.批量删除3.动态设置表名5.添加功能获取自增的主键6.测试类 七、自定义映射resultMap1.resultMap处理字段和属性的映射关系2.多对一映射处理级联方式处理映射关系使用association处理映射关系分步查询1. 查询员工信息2. 查询部门信息 3.一对多映射处理collection分步查询1. 查询部门信息2. 根据部门id查询部门中的所有员工 4.延迟加载5.测试类 八、动态SQL1.if2.where3.trim4.choose、when、otherwise5.foreach6.SQL片段7.测试类 总结 前言 从Mybatis搭建到各种配置和注解带你快速学会MyBatis。 一、MyBatis简介 1.Mybatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来源于“internet”和“abatis”的组合是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access ObjectsDAO。 2.MyBatis特性 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解用于配置和原始映射将接口和Java的POJOPlain Old Java Objects普通的Java对象映射成数据库中的记录。MyBatis 是一个 半自动的ORMObject Relation Mapping框架。 3.对比其他持久化层技术 JDBC SQL 夹杂在Java代码中耦合度高导致硬编码内伤维护不易且实际开发需求中 SQL 有变化频繁修改的情况多见代码冗长开发效率低 Hibernate 和 JPA 操作简便开发效率高程序中的长难复杂 SQL 需要绕过框架内部自动生产的 SQL不容易做特殊优化基于全映射的全自动框架大量字段的 POJO 进行部分映射时比较困难。反射操作太多导致数据库性能下降 MyBatis 轻量级性能出色SQL 和 Java 编码分开功能边界清晰。Java代码专注业务、SQL语句专注数据开发效率稍逊于HIbernate但是完全能够接受 二、搭建MyBatis 1.开发环境 IDEAidea 2022.3.3构建工具maven 3.9.2MySQL版本MySQL 8.0MyBatis版本MyBatis 3.5.7 2.创建maven工程 dependencies!-- Mybatis核心 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.7/version/dependency!-- junit测试 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!-- MySQL驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency /dependencies3.创建MyBatis核心配置文件 习惯上命名为mybatis-config.xml这个文件名仅仅只是建议并非强制要求。将来整合Spring之后这个配置文件可以省略所以大家操作时可以直接复制、粘贴。 核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息。 核心配置文件存放的位置是src/main/resources目录下。 ?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !--设置连接数据库的环境-- environments defaultdevelopment environment iddevelopment transactionManager typeJDBC/ dataSource typePOOLED property namedriver valuecom.mysql.cj.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/mybatis/ property nameusername valueroot/ property namepassword valueroot/ /dataSource /environment /environments !--引入映射文件-- mappers mapper resourcemappers/UserMapper.xml/ /mappers /configuration4.创建mapper接口 MyBatis中的mapper接口相当于以前的dao。但是区别在于mapper仅仅是接口我们不需要提供实现类 package com.atguigu.mybatis.mapper; public interface UserMapper { /** * 添加用户信息 */ int insertUser(); }5.创建MyBatis的映射文件 相关概念ORMObject Relationship Mapping对象关系映射。 对象Java的实体类对象关系关系型数据库映射二者之间的对应关系 Java概念数据库概念类表属性字段/列对象记录/行 映射文件的命名规则 表所对应的实体类的类名Mapper.xml例如表t_user映射的实体类为User所对应的映射文件为UserMapper.xml因此一个映射文件对应一个实体类对应一张表的操作MyBatis映射文件用于编写SQL访问以及操作表中的数据MyBatis映射文件存放的位置是src/main/resources/mappers目录下 MyBatis中可以面向接口操作数据要保证两个一致 mapper接口的全类名和映射文件的命名空间namespace保持一致mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致 上图中的目录名一样请大家不要弄错。 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.atguigu.mybatis.mapper.UserMapper !--int insertUser();该方法就是UserMapper接口中的inserUser方法-- insert idinsertUser insert into t_user values(null,张三,123,23,女) /insert /mapper6.通过junit测试功能 依赖 dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/versionscopetest/scope/dependency在test包下的java下创建测试类运行 SqlSession代表Java程序和数据库之间的会话。HttpSession是Java程序和浏览器之间的会话。SqlSessionFactory是“生产”SqlSession的“工厂”。工厂模式如果创建某一个对象使用的过程基本固定那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中以后都使用这个工厂类来“生产”我们需要的对象。 public class UserMapperTest {Testpublic void testInsertUser() throws IOException {//读取MyBatis的核心配置文件InputStream is Resources.getResourceAsStream(mybatis-config.xml);//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory生产SqlSession对象SqlSessionFactory sqlSessionFactory sqlSessionFactoryBuilder.build(is);//获取sqlSession此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession sqlSessionFactory.openSession();//创建SqlSession对象此时通过SqlSession对象所操作的sql都会自动提交 SqlSession sqlSession sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法就可以根据UserMapper的全类名匹配元素文件通过调用的方法名匹配映射文件中的SQL标签并执行标签中的SQL语句int result userMapper.insertUser();//提交事务//sqlSession.commit();System.out.println(result: result);} }此时需要手动提交事务如果要自动提交事务则在获取sqlSession对象时使用SqlSession sqlSession sqlSessionFactory.openSession(true);传入一个Boolean类型的参数值为true这样就可以自动提交。 7.加入log4j日志功能 加入依赖!-- log4j日志 -- dependency groupIdlog4j/groupId artifactIdlog4j/artifactId version1.2.17/version /dependency加入log4j的配置文件 log4j的配置文件名为log4j.xml存放的位置是src/main/resources目录下日志的级别FATAL(致命)ERROR(错误)WARN(警告)INFO(信息)DEBUG(调试) 从左到右打印的内容越来越详细 ?xml version1.0 encodingUTF-8 ? !DOCTYPE log4j:configuration SYSTEM log4j.dtd log4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/appender nameSTDOUT classorg.apache.log4j.ConsoleAppenderparam nameEncoding valueUTF-8 /layout classorg.apache.log4j.PatternLayoutparam nameConversionPattern value%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n //layout/appenderlogger namejava.sqllevel valuedebug //loggerlogger nameorg.apache.ibatislevel valueinfo //loggerrootlevel valuedebug /appender-ref refSTDOUT //root /log4j:configuration如下图加入日志打印在控制台可以看到sql语句传入参数和影响行数。 8.核心配置文件详解 核心配置文件中的标签必须按照固定的顺序(有的标签可以不写但顺序一定不能乱) properties、settings、typeAliases、typeHandlers、objectFactory、objectWrapperFactory、reflectorFactory、plugins、environments、databaseIdProvider、mappers ?xml version1.0 encodingUTF-8 ? !DOCTYPE configurationPUBLIC -//MyBatis.org//DTD Config 3.0//ENhttp://MyBatis.org/dtd/MyBatis-3-config.dtd configuration!--引入properties文件此时就可以${属性名}的方式访问属性值--properties resourcejdbc.properties/propertiessettings!--将表中字段的下划线自动转换为驼峰--setting namemapUnderscoreToCamelCase valuetrue/!--开启延迟加载--setting namelazyLoadingEnabled valuetrue//settingstypeAliases!--typeAlias设置某个具体的类型的别名属性type需要设置别名的类型的全类名alias设置此类型的别名且别名不区分大小写。若不设置此属性该类型拥有默认的别名即类名--!--typeAlias typecom.dragon.mybatis.bean.User/typeAlias--!--typeAlias typecom.dragon.mybatis.bean.User aliasuser/typeAlias--!--以包为单位设置改包下所有的类型都拥有默认的别名即类名且不区分大小写--package namecom.dragon.mybatis.pojo//typeAliases!--environments设置多个连接数据库的环境属性default设置默认使用的环境的id--environments defaultmysql_test!--environment设置具体的连接数据库的环境信息属性id设置环境的唯一标识可通过environments标签中的default设置某一个环境的id表示默认使用的环境--environment idmysql_test!--transactionManager设置事务管理方式属性type设置事务管理方式typeJDBC|MANAGEDtypeJDBC设置当前环境的事务管理都必须手动处理typeMANAGED设置事务被管理例如spring中的AOP--transactionManager typeJDBC/!--dataSource设置数据源属性type设置数据源的类型typePOOLED|UNPOOLED|JNDItypePOOLED使用数据库连接池即会将创建的连接进行缓存下次使用可以从缓存中直接获取不需要重新创建typeUNPOOLED不使用数据库连接池即每次使用连接都需要重新创建typeJNDI调用上下文中的数据源--dataSource typePOOLED!--设置驱动类的全类名--property namedriver value${jdbc.driver}/!--设置连接数据库的连接地址--property nameurl value${jdbc.url}/!--设置连接数据库的用户名--property nameusername value${jdbc.username}/!--设置连接数据库的密码--property namepassword value${jdbc.password}//dataSource/environment/environments!--引入映射文件--mappers!-- mapper resourceUserMapper.xml/ --!--以包为单位将包下所有的映射文件引入核心配置文件注意1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下2. mapper接口要和mapper映射文件的名字一致--package namecom.dragon.mybatis.mapper//mappers /configuration三、MyBatis的增删改查映射文件 添加!--int insertUser();-- insert idinsertUserinsert into t_user values(null,admin,123456,23,男,12345qq.com) /insert删除!--int deleteUser();-- delete iddeleteUserdelete from t_user where id 6 /delete修改!--int updateUser();-- update idupdateUserupdate t_user set username 张三 where id 5 /update查询一个实体类对象!--User getUserById();-- select idgetUserById resultTypecom.atguigu.mybatis.bean.User select * from t_user where id 2 /select查询集合!--ListUser getUserList();-- select idgetUserList resultTypecom.atguigu.mybatis.bean.Userselect * from t_user /select如果配置文件中引入映射是以包的方式resultType的值直接可以是实体类名如User/user均可。 !--引入映射文件--mappers!-- mapper resourceUserMapper.xml/ --!--以包为单位将包下所有的映射文件引入核心配置文件注意1. 此方式必须保证mapper接口和mapper映射文件必须在相同的包下2. mapper接口要和mapper映射文件的名字一致--package namecom.atguigu.mybatis.mapper//mappers我把上述增删改查的测试类也给大家吧 package com.dragon.mybatis.test;import com.dragon.mybatis.mapper.UserMapper; import com.dragon.mybatis.pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test;import java.io.IOException; import java.io.InputStream; import java.util.List;public class MyBatisTest {Testpublic void testMyBatis() throws IOException {//读取MyBatis的核心配置文件InputStream is Resources.getResourceAsStream(mybatis-config.xml);//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory生产SqlSession对象SqlSessionFactory sqlSessionFactory sqlSessionFactoryBuilder.build(is);//获取sqlSession此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession sqlSessionFactory.openSession();//创建SqlSession对象此时通过SqlSession对象所操作的sql都会自动提交SqlSession sqlSession sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法就可以根据UserMapper的全类名匹配元素文件通过调用的方法名匹配映射文件中的SQL标签并执行标签中的SQL语句int result userMapper.insertUser();//提交事务 // sqlSession.commit();System.out.println(result: result);}Testpublic void testUpdate() throws IOException {InputStream is Resources.getResourceAsStream(mybatis-config.xml);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession sqlSessionFactory.openSession(true);UserMapper mapper sqlSession.getMapper(UserMapper.class);mapper.updateUser();}Testpublic void deleteUser() throws IOException {InputStream is Resources.getResourceAsStream(mybatis-config.xml);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession sqlSessionFactory.openSession(true);UserMapper mapper sqlSession.getMapper(UserMapper.class);mapper.deleteUser();}Testpublic void testCRUD() throws IOException {InputStream is Resources.getResourceAsStream(mybatis-config.xml);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession sqlSessionFactory.openSession(true);UserMapper mapper sqlSession.getMapper(UserMapper.class);User user mapper.getUserById();System.out.println(user);}Testpublic void testgetAllUser() throws IOException {InputStream is Resources.getResourceAsStream(mybatis-config.xml);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession sqlSessionFactory.openSession(true);UserMapper mapper sqlSession.getMapper(UserMapper.class);ListUser list mapper.getAllUser();list.forEach(user - System.out.println(user));} } 注意 查询的标签select必须设置属性resultType或resultMap用于设置实体类和数据库表的映射关系 resultType自动映射用于属性名和表中字段名一致的情况resultMap自定义映射用于一对多或多对一或字段名和属性名不一致的情况 当查询的数据为多条时不能使用实体类作为返回值只能使用集合否则会抛出异常TooManyResultsException但是若查询的数据只有一条可以使用实体类或集合作为返回值 四、MyBatis获取参数值的两种方式重点 MyBatis获取参数值的两种方式${}和#{}${}的本质就是字符串拼接#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql若为字符串类型或日期类型的字段进行赋值时需要手动加单引号但是#{}使用占位符赋值的方式拼接sql此时为字符串类型或日期类型的字段进行赋值时可以自动添加单引号 1.单个字面量类型的参数 若mapper接口中的方法参数为单个的字面量类型此时可以使用${}和#{}以任意的名称可以不是username可以是ax等等不需要和接口中的方法的参数名保持一致最好见名识意获取参数的值注意${}需要手动加单引号 !--User getUserByUsername(String username);-- select idgetUserByUsername resultTypeUserselect * from t_user where username #{username} /select!--User getUserByUsername(String username);-- select idgetUserByUsername resultTypeUser select * from t_user where username ${username} /select2.多个字面量类型的参数 若mapper接口中的方法参数为多个时此时MyBatis会自动将这些参数放在一个map集合中 以arg0,arg1…为键以参数为值以param1,param2…为键以参数为值 因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值注意${}需要手动加单引号。使用arg或者param都行要注意的是arg是从arg0开始的param是从param1开始的 !--User checkLogin(String username,String password);-- select idcheckLogin resultTypeUser select * from t_user where username #{arg0} and password #{arg1} /select!--User checkLogin(String username,String password);-- select idcheckLogin resultTypeUserselect * from t_user where username ${param1} and password ${param2} /select!--User checkLogin(String username,String password);-- select idcheckLogin resultTypeUserselect * from t_user where username ${arg0} and password ${param2} /select上诉可以看出这四个参数是可以混用的。 3.map集合类型的参数 若mapper接口中的方法需要的参数为多个时此时可以手动创建map集合将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值注意${}需要手动加单引号 !--User checkLoginByMap(MapString,Object map);-- select idcheckLoginByMap resultTypeUserselect * from t_user where username #{username} and password #{password} /selectTest 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); }4.实体类类型的参数 若mapper接口中的方法参数为实体类对象时此时可以使用${}和#{}通过访问实体类对象中的属性名获取属性值注意${}需要手动加单引号 !--int insertUser(User user);-- insert idinsertUserinsert into t_user values(null,#{username},#{password},#{age},#{sex},#{email}) /insertTest 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); }5.使用Param标识参数 可以通过Param注解标识mapper接口中的方法参数此时会将这些参数放在map集合中 以Param注解的value属性值为键以参数为值以param1,param2…为键以参数为值 只需要通过${}和#{}访问map集合的键就可以获取相对应的值注意${}需要手动加单引号 !--User CheckLoginByParam(Param(username) String username, Param(password) String password);--select idCheckLoginByParam resultTypeUserselect * from t_user where username #{username} and password #{password}/selectTest public void checkLoginByParam() {SqlSession sqlSession SqlSessionUtils.getSqlSession();ParameterMapper mapper sqlSession.getMapper(ParameterMapper.class);mapper.CheckLoginByParam(admin,123456); }五、MyBatis的各种查询功能 如果查询出的数据只有一条可以通过 实体类对象接收List集合接收Map集合接收结果{password123456, sex男, id1, age23, usernameadmin} 如果查询出的数据有多条一定不能用实体类对象接收会抛异常TooManyResultsException可以通过 实体类类型的LIst集合接收Map类型的LIst集合接收在mapper接口的方法上添加MapKey注解 1.查询一个实体类对象 /*** 根据用户id查询用户信息* param id* return*/ User getUserById(Param(id) int id);!--User getUserById(Param(id) int id);-- select idgetUserById resultTypeUserselect * from t_user where id #{id} /select2.查询一个List集合 /*** 查询所有用户信息* return*/ ListUser getUserList();!--ListUser getUserList();-- select idgetUserList resultTypeUserselect * from t_user /select3.查询单个数据 /** * 查询用户的总记录数 * return * 在MyBatis中对于Java中常用的类型都设置了类型别名 * 例如java.lang.Integer--int|integer * 例如int--_int|_integer * 例如Map--map,List--list */ int getCount();!--int getCount();-- select idgetCount resultType_integerselect count(id) from t_user /select4.查询一条数据为map集合 /** * 根据用户id查询用户信息为map集合 * param id * return */ MapString, Object getUserToMap(Param(id) int id);!--MapString, Object getUserToMap(Param(id) int id);-- select idgetUserToMap resultTypemapselect * from t_user where id #{id} /select !--结果{password123456, sex男, id1, age23, usernameadmin}--5.查询多条数据为map集合 方法一 /** * 查询所有用户信息为map集合 * return * 将表中的数据以map集合的方式查询一条数据对应一个map若有多条数据就会产生多个map集合此时可以将这些map放在一个list集合中获取 */ ListMapString, Object getAllUserToMap1();!--MapString, Object getAllUserToMap1();-- select idgetAllUserToMap resultTypemap select * from t_user /select !--结果[{password123456, sex男, id1, age23, usernameadmin},{password123456, sex男, id2, age23, username张三},{password123456, sex男, id3, age23, username张三}] --方法二 /*** 查询所有用户信息为map集合* return* 将表中的数据以map集合的方式查询一条数据对应一个map若有多条数据就会产生多个map集合并且最终要以一个map的方式返回数据此时需要通过MapKey注解设置map集合的键值是每条数据所对应的map集合*/ MapKey(id) MapString, Object getAllUserToMap2();!--MapString, Object getAllUserToMap2();-- select idgetAllUserToMap resultTypemapselect * from t_user /select !--结果{1{password123456, sex男, id1, age23, usernameadmin},2{password123456, sex男, id2, age23, username张三},3{password123456, sex男, id3, age23, username张三}} --6.测试类 package com.dragon.mybatis.test;import com.dragon.mybatis.mapper.SelectMapper; import com.dragon.mybatis.pojo.User; import com.dragon.mybatis.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test;import java.util.List;public class SelectMapperTest {Testpublic void testGetUserById(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SelectMapper mapper sqlSession.getMapper(SelectMapper.class);System.out.println(mapper.getUserById(3));}Testpublic void testGetAllUser(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SelectMapper mapper sqlSession.getMapper(SelectMapper.class);ListUser usersmapper.getAllUser();users.forEach(user - System.out.println(user));}Testpublic void testGetCount(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SelectMapper mapper sqlSession.getMapper(SelectMapper.class);System.out.println(mapper.getCount());}Testpublic void testGetUserToMap(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SelectMapper mapper sqlSession.getMapper(SelectMapper.class);System.out.println(mapper.getUserToMap(3));}Testpublic void testAllUserToMap1(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SelectMapper mapper sqlSession.getMapper(SelectMapper.class);System.out.println(mapper.getAllUserToMap1());}Testpublic void testAllUserToMap2(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SelectMapper mapper sqlSession.getMapper(SelectMapper.class);System.out.println(mapper.getAllUserToMap2());} } 六、特殊SQL的执行 1.模糊查询 /*** 根据用户名进行模糊查询* param username * return java.util.Listcom.atguigu.mybatis.pojo.User* date 2023/8/26 21:56*/ ListUser getUserByLike(Param(username) String username);!--ListUser getUserByLike(Param(username) String username);-- select idgetUserByLike resultTypeUser!--select * from t_user where username like %${username}%-- !--select * from t_user where username like concat(%,#{username},%)-- select * from t_user where username like %#{username}% /select其中select * from t_user where username like %#{username}%是最常用的 2.批量删除 只能使用${}如果使用#{}则解析后的sql语句为delete from t_user where id in (1,2,3)这样是将1,2,3看做是一个整体只有id为1,2,3的数据会被删除。正确的语句应该是delete from t_user where id in (1,2,3)或者delete from t_user where id in (1,2,3) /*** 根据id批量删除* param ids * return int* date 2023/8/26 22:06*/ int deleteMore(Param(ids) String ids);delete iddeleteMoredelete from t_user where id in (${ids}) /delete//测试类 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); }3.动态设置表名 只能使用${}因为表名不能加单引号 /*** 查询指定表中的数据* param tableName * return java.util.Listcom.atguigu.mybatis.pojo.User* date 2023/8/27 14:41*/ ListUser getUserByTable(Param(tableName) String tableName);!--ListUser getUserByTable(Param(tableName) String tableName);-- select idgetUserByTable resultTypeUserselect * from ${tableName} /select5.添加功能获取自增的主键 使用场景 t_clazz(clazz_id,clazz_name)t_student(student_id,student_name,clazz_id) 添加班级信息获取新添加的班级的id为班级分配学生即将某学的班级id修改为新添加的班级的id 在mapper.xml中设置两个属性 useGeneratedKeys设置使用自增的主键 keyProperty因为增删改有统一的返回值是受影响的行数因此只能将获取的自增的主键放在传输的参数user对象的某个属性中 /*** 添加用户信息* param user * date 2023/8/27 15:04*/ void insertUser(User user);!--void insertUser(User user);-- insert idinsertUser useGeneratedKeystrue keyPropertyidinsert into t_user values (null,#{username},#{password},#{age},#{sex},#{email}) /insert6.测试类 package com.dragon.mybatis.test;import com.dragon.mybatis.mapper.SQLMapper; import com.dragon.mybatis.pojo.User; import com.dragon.mybatis.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test;import java.util.List;public class SQLMapperTest {Testpublic void testUserByLike(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SQLMapper mapper sqlSession.getMapper(SQLMapper.class);ListUser list mapper.getUserByLike(a);System.out.println(list);}Testpublic void testDeleteMore(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SQLMapper mapper sqlSession.getMapper(SQLMapper.class);int result mapper.deleteMore(1,2,3);System.out.println(result);}Testpublic void testGetUserByTable(){SqlSession sqlSession SqlSessionUtils.getSqlSession();SQLMapper mapper sqlSession.getMapper(SQLMapper.class);ListUser list mapper.getUserByTable(t_user);System.out.println(list);}Testpublic 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, usernameton, password123, age23, sex男, email123321.com}自增主键存放到了user的id属性中} } 七、自定义映射resultMap 1.resultMap处理字段和属性的映射关系 resultMap设置自定义映射 属性 id表示自定义映射的唯一标识不能重复type查询的数据要映射的实体类的类型 子标签 id设置主键的映射关系result设置普通字段的映射关系子标签属性 property设置映射关系中实体类中的属性名column设置映射关系中表中的字段名 若字段名和实体类中的属性名不一致则可以通过resultMap设置自定义映射即使字段名和属性名一致的属性也要映射也就是全部属性都要列出来 resultMap idempResultMap typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/result /resultMap !--ListEmp getAllEmp();-- select idgetAllEmp resultMapempResultMapselect * from t_emp /select若字段名和实体类中的属性名不一致但是字段名符合数据库的规则使用_实体类中的属性名符合Java的规则使用驼峰。此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系 可以通过为字段起别名的方式保证和实体类中的属性名保持一致!--ListEmp getAllEmp();-- select idgetAllEmp resultTypeEmpselect eid,emp_name empName,age,sex,email from t_emp /select可以在MyBatis的核心配置文件中的setting标签中设置一个全局配置信息mapUnderscoreToCamelCase可以在查询表中数据时自动将_类型的字段名转换为驼峰例如字段名user_name设置了mapUnderscoreToCamelCase此时字段名就会转换为userName。 settingssetting namemapUnderscoreToCamelCase valuetrue//settings2.多对一映射处理 查询员工信息以及员工所对应的部门信息 public class Emp { private Integer eid; private String empName; private Integer age; private String sex; private String email; private Dept dept;//...构造器、get、set方法等 }级联方式处理映射关系 resultMap idempAndDeptResultMapOne typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/resultresult propertydept.did columndid/resultresult propertydept.deptName columndept_name/result /resultMap !--Emp getEmpAndDept(Param(eid)Integer eid);-- select idgetEmpAndDept resultMapempAndDeptResultMapOneselect * from t_emp left join t_dept on t_emp.eid t_dept.did where t_emp.eid #{eid} /select使用association处理映射关系 association处理多对一的映射关系property需要处理多对的映射关系的属性名javaType该属性的类型 resultMap idempAndDeptResultMapTwo typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/resultassociation propertydept javaTypeDeptid propertydid columndid/idresult propertydeptName columndept_name/result/association /resultMap !--Emp getEmpAndDept(Param(eid)Integer eid);-- select idgetEmpAndDept resultMapempAndDeptResultMapTwoselect * from t_emp left join t_dept on t_emp.eid t_dept.did where t_emp.eid #{eid} /select分步查询 1. 查询员工信息 select设置分布查询的sql的唯一标识namespace.SQLId或mapper接口的全类名.方法名column设置分步查询的条件 //EmpMapper里的方法 /*** 通过分步查询员工及所对应的部门信息* 分步查询第一步查询员工信息* param * return com.dragon.mybatis.pojo.Emp* date 2022/2/27 20:17*/ Emp getEmpAndDeptByStepOne(Param(eid) Integer eid);resultMap idempAndDeptByStepResultMap typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/resultassociation propertydeptselectcom.dragon.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwocolumndid/association /resultMap !--Emp getEmpAndDeptByStepOne(Param(eid) Integer eid);-- select idgetEmpAndDeptByStepOne resultMapempAndDeptByStepResultMapselect * from t_emp where eid #{eid} /select2. 查询部门信息 //DeptMapper里的方法 /*** 通过分步查询员工及所对应的部门信息* 分步查询第二步通过did查询员工对应的部门信息* param* return com.dragon.mybatis.pojo.Emp* date 2022/2/27 20:23*/ Dept getEmpAndDeptByStepTwo(Param(did) Integer did);!--此处的resultMap仅是处理字段和属性的映射关系-- resultMap idEmpAndDeptByStepTwoResultMap typeDeptid propertydid columndid/idresult propertydeptName columndept_name/result /resultMap !--Dept getEmpAndDeptByStepTwo(Param(did) Integer did);-- select idgetEmpAndDeptByStepTwo resultMapEmpAndDeptByStepTwoResultMapselect * from t_dept where did #{did} /select3.一对多映射处理 public class Dept {private Integer did;private String deptName;private ListEmp emps;//...构造器、get、set方法等 }collection collection用来处理一对多的映射关系ofType表示该属性对饮的集合中存储的数据的类型 resultMap idDeptAndEmpResultMap typeDeptid propertydid columndid/idresult propertydeptName columndept_name/resultcollection propertyemps ofTypeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/result/collection /resultMap !--Dept getDeptAndEmp(Param(did) Integer did);-- select idgetDeptAndEmp resultMapDeptAndEmpResultMapselect * from t_dept left join t_emp on t_dept.did t_emp.did where t_dept.did #{did} /select分步查询 1. 查询部门信息 //DeptMapper /*** 通过分步查询查询部门及对应的所有员工信息* 分步查询第一步查询部门信息* param did * return com.dragon.mybatis.pojo.Dept* date 2023/8/27 22:04*/ Dept getDeptAndEmpByStepOne(Param(did) Integer did);resultMap idDeptAndEmpByStepOneResultMap typeDeptid propertydid columndid/idresult propertydeptName columndept_name/resultcollection propertyempsselectcom.atguigu.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwocolumndid/collection /resultMap !--Dept getDeptAndEmpByStepOne(Param(did) Integer did);-- select idgetDeptAndEmpByStepOne resultMapDeptAndEmpByStepOneResultMapselect * from t_dept where did #{did} /select2. 根据部门id查询部门中的所有员工 //EmpMapper /*** 通过分步查询查询部门及对应的所有员工信息* 分步查询第二步根据部门id查询部门中的所有员工* param did* return java.util.Listcom.atguigu.mybatis.pojo.Emp* date 2023/8/27 22:10*/ ListEmp getDeptAndEmpByStepTwo(Param(did) Integer did);!--ListEmp getDeptAndEmpByStepTwo(Param(did) Integer did);-- select idgetDeptAndEmpByStepTwo resultTypeEmpselect * from t_emp where did #{did} /select4.延迟加载 分步查询的优点可以实现延迟加载但是必须在核心配置文件中设置全局配置信息 lazyLoadingEnabled延迟加载的全局开关。当开启时所有关联对象都会延迟加载aggressiveLazyLoading当开启时任何方法的调用都会加载该对象的所有属性。 否则每个属性会按需加载 此时就可以实现按需加载获取的数据是什么就只会执行相应的sql。此时可通过association和collection中的fetchType属性设置当前的分步查询是否使用延迟加载fetchType“lazy(延迟加载)|eager(立即加载)” settings!--开启延迟加载--setting namelazyLoadingEnabled valuetrue/ /settingsTest public void getEmpAndDeptByStepOne() {SqlSession sqlSession SqlSessionUtils.getSqlSession();EmpMapper mapper sqlSession.getMapper(EmpMapper.class);Emp emp mapper.getEmpAndDeptByStepOne(1);System.out.println(emp.getEmpName()); }关闭延迟加载两条SQL语句都运行了 开启延迟加载只运行获取emp的SQL语句 Test public void getEmpAndDeptByStepOne() {SqlSession sqlSession SqlSessionUtils.getSqlSession();EmpMapper mapper sqlSession.getMapper(EmpMapper.class);Emp emp mapper.getEmpAndDeptByStepOne(1);System.out.println(emp.getEmpName());System.out.println(----------------);System.out.println(emp.getDept()); }开启后需要用到查询dept的时候才会调用相应的SQL语句 fetchType当开启了全局的延迟加载之后可以通过该属性手动控制延迟加载的效果fetchType“lazy(延迟加载)|eager(立即加载)” resultMap idempAndDeptByStepResultMap typeEmpid propertyeid columneid/idresult propertyempName columnemp_name/resultresult propertyage columnage/resultresult propertysex columnsex/resultresult propertyemail columnemail/resultassociation propertydeptselectcom.atguigu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwocolumndidfetchTypelazy/association /resultMap5.测试类 import com.dragon.mybatis.mapper.DeptMapper; import com.dragon.mybatis.mapper.EmpMapper; import com.dragon.mybatis.pojo.Dept; import com.dragon.mybatis.pojo.Emp; import com.dragon.mybatis.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test;import java.util.List;public class ResultMapTest {Testpublic void testGetAllEmp(){SqlSession sqlSession SqlSessionUtils.getSqlSession();EmpMapper mapper sqlSession.getMapper(EmpMapper.class);ListEmp list mapper.getAllEmp();System.out.println(list);}Testpublic void testGetAndDept(){SqlSession sqlSession SqlSessionUtils.getSqlSession();EmpMapper mapper sqlSession.getMapper(EmpMapper.class);Emp emp mapper.getEmpAndDept(1);System.out.println(emp);}Testpublic void testGetAndDeptByStep(){SqlSession sqlSession SqlSessionUtils.getSqlSession();EmpMapper mapper sqlSession.getMapper(EmpMapper.class);Emp emp mapper.getEmpAndDeptByStepOne(1);System.out.println(emp);}Testpublic void testGetDeptAndEmp(){SqlSession sqlSession SqlSessionUtils.getSqlSession();DeptMapper mapper sqlSession.getMapper(DeptMapper.class);Dept dept mapper.getDeptAndEmp(1);System.out.println(dept);}Testpublic void testGetDeptAndEmpByStep(){SqlSession sqlSession SqlSessionUtils.getSqlSession();DeptMapper mapper sqlSession.getMapper(DeptMapper.class);Dept dept mapper.getDeptAndEmpByStepOne(1);System.out.println(dept);} }八、动态SQL Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能它存在的意义是为了解决拼接SQL语句字符串时的痛点问题 1.if if标签可通过test属性即传递过来的数据的表达式进行判断若表达式的结果为true则标签中的内容会执行反之标签中的内容不会执行在where后面添加一个恒成立条件11 这个恒成立条件并不会影响查询的结果这个11可以用来拼接and语句例如当empName为null时 如果不加上恒成立条件则SQL语句为select * from t_emp where and age ? and sex ? and email ?此时where会与and连用SQL语句会报错如果加上一个恒成立条件则SQL语句为select * from t_emp where 1 1 and age ? and sex ? and email ?此时不报错 !--ListEmp getEmpByCondition1(Emp emp);-- select idgetEmpByCondition1 resultTypeEmpselect * from t_emp where 11if testempName ! null and empName !and emp_name #{empName}/ifif testage ! null and age !and age #{age}/ifif testsex ! null and sex !and sex #{sex}/ifif testemail ! null and email !and email #{email}/if /select2.where where和if一般结合使用 若where标签中的if条件都不满足则where标签没有任何功能即不会添加where关键字若where标签中的if条件满足则where标签会自动添加where关键字并将条件最前方多余的and/or去掉 !--ListEmp getEmpByCondition2(Emp emp);-- select idgetEmpByCondition2 resultTypeEmpselect * from t_empwhereif testempName ! null and empName !emp_name #{empName}/ifif testage ! null and age !and age #{age}/ifif testsex ! null and sex !and sex #{sex}/ifif testemail ! null and email !and email #{email}/if/where /select注意where标签不能去掉条件后多余的and/or!--这种用法是错误的只能去掉条件前面的and/or条件后面的不行-- if testempName ! null and empName ! emp_name #{empName} and /if if testage ! null and age !age #{age} /if3.trim trim用于去掉或添加标签中的内容常用属性 prefix在trim标签中的内容的前面添加某些内容suffix在trim标签中的内容的后面添加某些内容prefixOverrides在trim标签中的内容的前面去掉某些内容suffixOverrides在trim标签中的内容的后面去掉某些内容 若trim中的标签都不满足条件则trim标签没有任何效果也就是只剩下select * from t_emp !--ListEmp getEmpByCondition3(Emp emp);-- select idgetEmpByCondition3 resultTypeEmpselect * from t_emptrim prefixwhere suffixOverridesand|orif testempName ! null and empName !emp_name #{empName} and/ifif testage ! null and age !age #{age} and/ifif testsex ! null and sex !sex #{sex} or/ifif testemail ! null and email !email #{email}/if/trim /select4.choose、when、otherwise choose、when、otherwise相当于if...else if..elsewhen至少要有一个otherwise至多只有一个 select idgetEmpByChoose resultTypeEmpselect * from t_empwherechoosewhen testempName ! null and empName ! emp_name #{empName}/whenwhen testage ! null and age ! age #{age}/whenwhen testsex ! null and sex ! sex #{sex}/whenwhen testemail ! null and email ! email #{email}/whenotherwisedid 1/otherwise/choose/where /selectTest public void getEmpByChoose() {SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);ListEmp emps mapper.getEmpByChoose(new Emp(null, 张三, 23, 男, 123qq.com, null));System.out.println(emps); }相当于if a else if b else if c else d只会执行其中一个 5.foreach 属性 collection设置要循环的数组或集合item表示集合或数组中的每一个数据separator设置循环体之间的分隔符分隔符前后默认有一个空格如,open设置foreach标签中的内容的开始符close设置foreach标签中的内容的结束符 批量删除 !--int deleteMoreByArray(Integer[] eids);-- delete iddeleteMoreByArraydelete from t_emp where eid inforeach collectioneids itemeid separator, open( close)#{eid}/foreach /deleteTest public void deleteMoreByArray() {SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);int result mapper.deleteMoreByArray(new Integer[]{6, 7, 8, 9});System.out.println(result); }批量添加 !--int insertMoreByList(Param(emps) ListEmp emps);-- insert idinsertMoreByListinsert into t_emp valuesforeach collectionemps itememp separator,(null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)/foreach /insertTest public void insertMoreByList() {SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);Emp emp1 new Emp(null,a,1,男,123321.com,null);Emp emp2 new Emp(null,b,1,男,123321.com,null);Emp emp3 new Emp(null,c,1,男,123321.com,null);ListEmp emps Arrays.asList(emp1, emp2, emp3);int result mapper.insertMoreByList(emps);System.out.println(result); }6.SQL片段 sql片段可以记录一段公共sql片段在使用的地方通过include标签进行引入声明sql片段sql标签 sql idempColumnseid,emp_name,age,sex,email/sql引用sql片段include标签 !--ListEmp getEmpByCondition(Emp emp);-- select idgetEmpByCondition resultTypeEmpselect include refidempColumns/include from t_emp /select7.测试类 import com.dragon.mybatis.mapper.DynamicSQLMapper; import com.dragon.mybatis.pojo.Emp; import com.dragon.mybatis.utils.SqlSessionUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test;import java.util.Arrays; import java.util.List;public class DynamicSQLMapperTest {Testpublic void testGetEmpByCondition1(){SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);ListEmp list mapper.getEmpByCondition1(new Emp(null,张三,23,男,123qq.com,null));System.out.println(list);}Testpublic void testGetEmpByCondition2(){SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);ListEmp list mapper.getEmpByCondition2(new Emp(null,,23,男,123qq.com,null));System.out.println(list);}Testpublic void testGetEmpByCondition3(){SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);ListEmp list mapper.getEmpByCondition3(new Emp(null,,null,,,null));System.out.println(list);}Testpublic void getEmpByChoose() {SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);ListEmp emps mapper.getEmpByChoose(new Emp(null, 张三, 23, 男, 123qq.com, null));System.out.println(emps);}Testpublic void deleteMoreByArray() {SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);int result mapper.deleteMoreByArray(new Integer[]{6, 7, 8, 9});System.out.println(result);}Testpublic void insertMoreByList() {SqlSession sqlSession SqlSessionUtils.getSqlSession();DynamicSQLMapper mapper sqlSession.getMapper(DynamicSQLMapper.class);Emp emp1 new Emp(null,a,1,男,123321.com,null);Emp emp2 new Emp(null,b,1,男,123321.com,null);Emp emp3 new Emp(null,c,1,男,123321.com,null);ListEmp emps Arrays.asList(emp1, emp2, emp3);int result mapper.insertMoreByList(emps);System.out.println(result);} }总结 以上就是MyBatis的详细讲解。
http://www.eeditor.cn/news/125759/

相关文章:

  • 阳江网站制作建设医疗器械监督管理条例2021
  • 官方网站建设制作平台金华建设银行网站
  • 建专业外贸网站深圳网站建设.-方维网络
  • 做网站的技术体系先做网站再备案吗
  • 无锡网站制作公司排名亚马逊做网站
  • qq空间破解版seo百度刷排名
  • 济宁个人网站建设价格便宜合肥建设网站
  • 成都三合一网站建设店面设计师哪里找
  • 网站备案之前需要建好网站吗在线制作钓鱼网站源码
  • 网站建设关健词优化网络公司怎么样现在有哪家建筑公司招人
  • 滨海新区商城网站建设域名服务器地址查询
  • 哪个建设网站好广东深圳
  • 邢台网站制作地方兰州做网站优化的公司
  • 鞍山手机网站建设在哪个网站做注册资本变更
  • 网站美工效果图怎么做鞍山哪里做网站
  • 给设计网站做图是商用吗免费空间刷赞
  • 微信网站建设教程c2c的网站有哪些
  • 专业做网站 上海易语言怎么做点击按钮打开网站
  • 商城网站设计公司怎么样asp网站开发模板
  • vs2017移动网站开发如何做外贸网站优化推广
  • 建设报名系统是正规网站吗网络营销策划方案基本思路
  • 网站托管方案服装 多语言 网站源码
  • 网站制作网站做网南宁百度seo推广
  • 江苏城乡建设部网站wordpress管局备案
  • 成都网站seo分析中国建设银行网站官网
  • 网站建设电商考试做一个天猫店铺要多少钱
  • 深圳互联网公司网站做网站要sql 数据库名字账号密码
  • 文章网建站制作企业网站的版式
  • html5手机网站发布营销型 网站开发
  • 湖北省建设厅招骋网站免费网站app代码