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

网站的配色方案有效果的网站排名

网站的配色方案,有效果的网站排名,贵州建设厅考试网站二建成绩,网站的反链要怎么做目录标题 1、Mybatis简介1.1、什么是MyBatis1.2、持久化1.3、持久层1.4、为什么需要MybatisMyBatis的优点 2.1、代码演示搭建实验数据库导入MyBatis相关 jar 包 03、CRUD操作3.1、namespace3.2、select3.3、insert3.4、update3.5、delete 04、MyBatis配置解析4、配置解析4.3、m… 目录标题 1、Mybatis简介1.1、什么是MyBatis1.2、持久化1.3、持久层1.4、为什么需要MybatisMyBatis的优点 2.1、代码演示搭建实验数据库导入MyBatis相关 jar 包 03、CRUD操作3.1、namespace3.2、select3.3、insert3.4、update3.5、delete 04、MyBatis配置解析4、配置解析4.3、mappers元素4.4、Properties优化4.5、typeAliases优化4.6、其他配置浏览 05、ResultMap5.1、查询为null问题5.2、解决方案5.3、ResultMap 06、MyBatis分页的实现6.1、日志工厂6.2、Log4j6.3、limit实现分页6.4、RowBounds分页6.5、PageHelper07、使用注解开发7.1、面向接口编程7.3、注解增删改 1、Mybatis简介 1.1、什么是MyBatis MyBatis 是一款优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。 MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code并且改名为MyBatis 。 2013年11月迁移到Github . Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html GitHub : https://github.com/mybatis/mybatis-3 1.2、持久化 持久化是将程序数据在持久状态和瞬时状态间转换的机制。 即把数据如内存中的对象保存到可永久保存的存储设备中如磁盘。持久化的主要应用是将内存中的对象存储在数据库中或者存储在磁盘文件中、XML数据文件中等等。 JDBC就是一种持久化机制。文件IO也是一种持久化机制。 在生活中 : 将鲜肉冷藏吃的时候再解冻的方法也是。将水果做成罐头的方法也是。 为什么需要持久化服务呢那是由于内存本身的缺陷引起的 内存断电后数据会丢失但有一些对象是无论如何都不能丢失的比如银行账号等遗憾的是人们还无法保证内存永不掉电。 内存过于昂贵与硬盘、光盘等外存相比内存的价格要高2~3个数量级而且维持成本也高至少需要一直供电吧。所以即使对象不需要永久保存也会因为内存的容量限制不能一直呆在内存中需要持久化来缓存到外存。 1.3、持久层 什么是持久层 完成持久化工作的代码块 . —— dao层 【DAO (Data Access Object) 数据访问对象】 大多数情况下特别是企业级应用数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化而持久化的实现过程则大多通过各种关系数据库来完成。 不过这里有一个字需要特别强调也就是所谓的“层”。对于应用系统而言数据持久功能大多是必不可少的组成部分。也就是说我们的系统中已经天然的具备了“持久层”概念也许是但也许实际情况并非如此。之所以要独立出一个“持久层”的概念,而不是“持久模块”“持久单元”也就意味着我们的系统架构中应该有一个相对独立的逻辑层面专著于数据持久化逻辑的实现. 与系统其他部分相对而言这个层面应该具有一个较为清晰和严格的逻辑边界。 【说白了就是用来操作数据库存在的】 1.4、为什么需要Mybatis Mybatis就是帮助程序猿将数据存入数据库中 , 和从数据库中取数据 . 传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等… , 通过框架可以减少重复代码,提高开发效率 . MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) —对象关系映射 所有的事情不用Mybatis依旧可以做到只是用了它所有实现会更加简单技术没有高低之分只有使用这个技术的人有高低之别 MyBatis的优点 简单易学本身就很小且简单。没有任何第三方依赖最简单安装只要两个jar文件配置几个sql映射文件就可以了易于学习易于使用通过文档和源代码可以比较完全的掌握它的设计思路和实现。 灵活mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。 解除sql与程序代码的耦合通过提供DAO层将业务逻辑和数据访问逻辑分离使系统的设计更清晰更易维护更易单元测试。sql和代码的分离提高了可维护性。 提供xml标签支持编写动态sql。 ……. 最重要的一点使用的人多公司需要 Mybatis02、MyBatis第一个程序 狂神说 分类学习笔记 创建时间2021/04/01 16:07 字体 皮肤最后修改于 2021/04/01 18:07 思路流程搭建环境—导入Mybatis—-编写代码—-测试 2.1、代码演示 搭建实验数据库 CREATE DATABASE mybatis; USE mybatis; DROP TABLE IF EXISTS user; CREATE TABLE user (id int(20) NOT NULL,name varchar(30) DEFAULT NULL,pwd varchar(30) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; insert into user(id,name,pwd) values (1,狂神,123456),(2,张三,abcdef),(3,李四,987654);导入MyBatis相关 jar 包 GitHub上找 dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.2/version /dependency dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version /dependency编写MyBatis核心配置文件 查看帮助文档 ?xml version1.0 encodingUTF-8 ? !DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis?useSSLtrueamp;useUnicodetrueamp;characterEncodingutf8/property nameusername valueroot/property namepassword value123456//dataSource/environment/environmentsmappersmapper resourcecom/kuang/dao/userMapper.xml//mappers /configuration编写MyBatis工具类 查看帮助文档 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 java.io.IOException; import java.io.InputStream; public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}//获取SqlSession连接public static SqlSession getSession(){return sqlSessionFactory.openSession();} }创建实体类 public class User {private int id; //idprivate String name; //姓名private String pwd; //密码//构造,有参,无参//set/get//toString() }编写Mapper接口类 import com.kuang.pojo.User; import java.util.List; public interface UserMapper {ListUser selectUser(); }编写Mapper.xml配置文件 namespace 十分重要不能写错 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.kuang.dao.UserMapperselect idselectUser resultTypecom.kuang.pojo.Userselect * from user/select /mapper编写测试类 Junit 包测试 public class MyTest {Testpublic void selectUser() {SqlSession session MybatisUtils.getSession();//方法一://ListUser users session.selectList(com.kuang.mapper.UserMapper.selectUser);//方法二:UserMapper mapper session.getMapper(UserMapper.class);ListUser users mapper.selectUser();for (User user: users){System.out.println(user);}session.close();} }运行测试 2.2、问题说明 可能出现问题说明Maven静态资源过滤问题 resourcesresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resourceresourcedirectorysrc/main/resources/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringfalse/filtering/resource /resources03、CRUD操作 3.1、namespace 将上面案例中的UserMapper接口改名为 UserDao 将UserMapper.xml中的namespace改为为UserDao的路径 . 再次测试 结论 配置文件中namespace中的名称为对应Mapper接口或者Dao接口的完整包名,必须一致 3.2、select select标签是mybatis中最常用的标签之一 select语句有很多属性可以详细配置每一条SQL语句 id 命名空间中唯一的标识符 接口中的方法名与映射文件中的SQL语句ID 一一对应 parameterType 传入SQL语句的参数类型 。【万能的Map可以多尝试使用】 resultType SQL语句返回值类型。【完整的类名或者别名】 需求根据id查询用户 在UserMapper中添加对应方法 public interface UserMapper {//查询全部用户ListUser selectUser();//根据id查询用户User selectUserById(int id); } 在UserMapper.xml中添加Select语句select idselectUserById resultTypecom.kuang.pojo.Userselect * from user where id #{id} /select测试类中测试 Test public void tsetSelectUserById() {SqlSession session MybatisUtils.getSession(); //获取SqlSession连接UserMapper mapper session.getMapper(UserMapper.class);User user mapper.selectUserById(1);System.out.println(user);session.close(); }课堂练习根据 密码 和 名字 查询用户 思路一直接在方法中传递参数 在接口方法的参数前加 Param属性 Sql语句编写的时候直接取Param中设置的值即可不需要单独设置参数类型 //通过密码和名字查询用户 User selectUserByNP(Param(username) String username,Param(pwd) String pwd); /*select idselectUserByNP resultTypecom.kuang.pojo.Userselect * from user where name #{username} and pwd #{pwd}/select */思路二使用万能的Map 在接口方法中参数直接传递Map User selectUserByNP2(MapString,Object map);编写sql语句的时候需要传递参数类型参数类型为map select idselectUserByNP2 parameterTypemap resultTypecom.kuang.pojo.Userselect * from user where name #{username} and pwd #{pwd} /select在使用方法的时候Map的 key 为 sql中取的值即可没有顺序要求 MapString, Object map new HashMapString, Object(); map.put(username,小明); map.put(pwd,123456); User user mapper.selectUserByNP2(map);总结 ​ 如果参数过多我们可以考虑直接使用Map实现如果参数比较少直接传递参数即可 3.3、insert 我们一般使用insert标签进行插入操作它的配置和select标签差不多 需求给数据库增加一个用户 在UserMapper接口中添加对应的方法 //添加一个用户 int addUser(User user);在UserMapper.xml中添加insert语句 insert idaddUser parameterTypecom.kuang.pojo.Userinsert into user (id,name,pwd) values (#{id},#{name},#{pwd}) /insert测试 Test public void testAddUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);User user new User(5,王五,zxcvbn);int i mapper.addUser(user);System.out.println(i);session.commit(); //提交事务,重点!不写的话不会提交到数据库session.close(); }注意点增、删、改操作需要提交事务 3.4、update 我们一般使用update标签进行更新操作它的配置和select标签差不多 需求修改用户的信息 同理编写接口方法 //修改一个用户 int updateUser(User user);编写对应的配置文件SQL update idupdateUser parameterTypecom.kuang.pojo.Userupdate user set name#{name},pwd#{pwd} where id #{id} /update 测试Test public void testUpdateUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);User user mapper.selectUserById(1);user.setPwd(asdfgh);int i mapper.updateUser(user);System.out.println(i);session.commit(); //提交事务,重点!不写的话不会提交到数据库session.close(); }3.5、delete 我们一般使用delete标签进行删除操作它的配置和select标签差不多 需求根据id删除一个用户 同理编写接口方法 //根据id删除用户 int deleteUser(int id); 编写对应的配置文件SQL delete iddeleteUser parameterTypeintdelete from user where id #{id} /delete测试 Test public void testDeleteUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);int i mapper.deleteUser(5);System.out.println(i);session.commit(); //提交事务,重点!不写的话不会提交到数据库session.close(); }小结 所有的增删改操作都需要提交事务 接口所有的普通参数尽量都写上Param参数尤其是多个参数时必须写上 有时候根据业务的需求可以考虑使用map传递参数 为了规范操作在SQL的配置文件中我们尽量将Parameter参数和resultType都写上 3.6、思考题 模糊查询like语句该怎么写? 第1种在Java代码中添加sql通配符。 string wildcardname “%smi%”; listname names mapper.selectlike(wildcardname); select id”selectlike”select * from foo where bar like #{value} /select第2种在sql语句中拼接通配符会引起sql注入 string wildcardname “smi”; listname names mapper.selectlike(wildcardname); select id”selectlike”select * from foo where bar like %#{value}% /select04、MyBatis配置解析 4、配置解析 4.1、核心配置文件 mybatis-config.xml 系统核心配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 能配置的内容如下 configuration配置 properties属性 settings设置 typeAliases类型别名 typeHandlers类型处理器 objectFactory对象工厂 plugins插件 environments环境配置 environment环境变量 transactionManager事务管理器 dataSource数据源 databaseIdProvider数据库厂商标识 mappers映射器 我们可以阅读 mybatis-config.xml 上面的dtd的头文件【演示】 4.2、environments元素 environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBCproperty name... value...//transactionManagerdataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment /environments配置MyBatis的多套运行环境将SQL映射到多个不同的数据库上必须指定其中一个为默认运行环境通过default指定 子元素节点environment 具体的一套环境通过设置id进行区别id保证唯一 子元素节点transactionManager - [ 事务管理器 ] !-- 语法 -- transactionManager type[ JDBC | MANAGED ]/详情点击查看官方文档 这两种事务管理器类型都不需要设置任何属性。 子元素节点数据源dataSource dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。 数据源是必须配置的。 有三种内建的数据源类型 type“[UNPOOLED|POOLED|JNDI]” unpooled 这个数据源的实现只是每次被请求时打开和关闭连接。 pooled 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。 jndi这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用容器可以集中或在外部配置数据源然后放置一个 JNDI 上下文的引用。 数据源也有很多第三方的实现比如dbcpc3p0druid等等…. 4.3、mappers元素 4.3.1、mappers 映射器 : 定义映射SQL语句文件 既然 MyBatis 的行为其他元素已经配置完了我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用 或完全限定资源定位符包括 file:/// 的 URL或类名和包名等。映射器是MyBatis中最核心的组件之一在MyBatis 3之前只支持xml映射器即所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始还支持接口映射器这种映射器方式允许以Java代码的方式注解定义SQL语句非常简洁。 4.3.2、引入资源方式 !-- 使用相对于类路径的资源引用 -- mappersmapper resourceorg/mybatis/builder/PostMapper.xml/ /mappers !-- 使用完全限定资源定位符URL -- mappersmapper urlfile:///var/mappers/AuthorMapper.xml/ /mappers !-- 使用映射器接口实现类的完全限定类名 需要配置文件名称和接口名称一致并且位于同一目录下 -- mappersmapper classorg.mybatis.builder.AuthorMapper/ /mappers !-- 将包内的映射器接口实现全部注册为映射器 但是需要配置文件名称和接口名称一致并且位于同一目录下 -- mapperspackage nameorg.mybatis.builder/ /mappers4.3.3、Mapper文件 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.kuang.mapper.UserMapper /mappernamespace中文意思命名空间作用如下 namespace和子元素的id联合保证唯一 , 区别不同的mapper 绑定DAO接口 namespace的命名必须跟某个接口同名 接口中的方法与映射文件中sql语句id应该一一对应 namespace命名规则 : 包名类名 MyBatis 的真正强大在于它的映射语句这是它的魔力所在。由于它的异常强大映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建以尽可能地为你减少麻烦。 4.4、Properties优化 数据库这些属性都是可外部配置且可动态替换的既可以在典型的 Java 属性文件中配置亦可通过 properties 元素的子元素来传递。具体的官方文档 我们来优化我们的配置文件 第一步 ; 在资源目录下新建一个db.properties drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis?useSSLtrueuseUnicodetruecharacterEncodingutf8 usernameroot password123456第二步 : 将文件导入properties 配置文件 configuration!--导入properties文件--properties resourcedb.properties/environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappersmapper resourcemapper/UserMapper.xml//mappers /configuration配置文件优先级问题 新特性使用占位符 4.5、typeAliases优化 类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关存在的意义仅在于用来减少类完全限定名的冗余。 !--配置别名,注意顺序-- typeAliasestypeAlias typecom.kuang.pojo.User aliasUser/ /typeAliases当这样配置时User可以用在任何使用com.kuang.pojo.User的地方。 也可以指定一个包名MyBatis 会在包名下面搜索需要的 Java Bean比如: typeAliasespackage namecom.kuang.pojo/ /typeAliases每一个在包 com.kuang.pojo 中的 Java Bean在没有注解的情况下会使用 Bean 的首字母小写的非限定类名来作为它的别名。 若有注解则别名为其注解值。见下面的例子 Alias(user) public class User {... }4.6、其他配置浏览 4.6.1、设置 设置settings相关 查看帮助文档 懒加载 日志实现 缓存开启关闭 一个配置完整的 settings 元素的示例如下 settingssetting namecacheEnabled valuetrue/setting namelazyLoadingEnabled valuetrue/setting namemultipleResultSetsEnabled valuetrue/setting nameuseColumnLabel valuetrue/setting nameuseGeneratedKeys valuefalse/setting nameautoMappingBehavior valuePARTIAL/setting nameautoMappingUnknownColumnBehavior valueWARNING/setting namedefaultExecutorType valueSIMPLE/setting namedefaultStatementTimeout value25/setting namedefaultFetchSize value100/setting namesafeRowBoundsEnabled valuefalse/setting namemapUnderscoreToCamelCase valuefalse/setting namelocalCacheScope valueSESSION/setting namejdbcTypeForNull valueOTHER/setting namelazyLoadTriggerMethods valueequals,clone,hashCode,toString/ /settings4.6.2、类型处理器 官方文档 无论是 MyBatis 在预处理语句PreparedStatement中设置一个参数时还是从结果集中取出一个值时 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。 你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。【了解即可】 4.6.3、对象工厂 官方文档 MyBatis 每次创建结果对象的新实例时它都会使用一个对象工厂ObjectFactory实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类要么通过默认构造方法要么在参数映射存在的时候通过有参构造方法来实例化。 如果想覆盖对象工厂的默认行为则可以通过创建自己的对象工厂来实现。【了解即可】 4.7 生命周期和作用域 作用域Scope和生命周期 理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的因为错误的使用会导致非常严重的并发问题。 我们可以先画一个流程图分析一下Mybatis的执行过程 作用域理解 SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory创建成功后SqlSessionFactoryBuilder 就失去了作用所以它只能存在于创建 SqlSessionFactory 的方法中而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域也就是局部方法变量。 SqlSessionFactory 可以被认为是一个数据库连接池它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中所以一旦创建了 SqlSessionFactory就要长期保存它直至不再使用 MyBatis 应用所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。 由于 SqlSessionFactory 是一个对数据库的连接池所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory那么就存在多个数据库连接池这样不利于对数据库资源的控制也会导致数据库连接资源被消耗光出现系统宕机等情况所以尽量避免发生这样的情况。 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。 如果说 SqlSessionFactory 相当于数据库连接池那么 SqlSession 就相当于一个数据库连接Connection 对象你可以在一个事务里面执行多条 SQL然后通过它的 commit、rollback 等方法提交或者回滚事务。所以它应该存活在一个业务请求中处理完整个请求后应该关闭这条连接让它归还给 SqlSessionFactory否则数据库资源就很快被耗费精光系统就会瘫痪所以用 try…catch…finally… 语句来保证其正确关闭。 所以 SqlSession 的最佳的作用域是请求或方法作用域。 05、ResultMap 5、ResultMap 要解决的问题属性名和字段名不一致 环境新建一个项目将之前的项目拷贝过来 5.1、查询为null问题 查看之前的数据库的字段名 Java中的实体类设计 public class User {private int id; //idprivate String name; //姓名private String password; //密码和数据库不一样//构造//set/get//toString() }接口 //根据id查询用户 User selectUserById(int id);mapper映射文件 select idselectUserById resultTypeuserselect * from user where id #{id} /select测试 Test public void testSelectUserById() {SqlSession session MybatisUtils.getSession(); //获取SqlSession连接UserMapper mapper session.getMapper(UserMapper.class);User user mapper.selectUserById(1);System.out.println(user);session.close(); }结果: User{id1, name’狂神’, password’null’}查询出来发现 password 为空 . 说明出现了问题 分析 select * from user where id #{id} 可以看做 select id,name,pwd from user where id #{id} mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() , 所以password返回null ; 【自动映射】 5.2、解决方案 方案一为列名指定别名 , 别名和java实体类的属性名一致 . select idselectUserById resultTypeUserselect id , name , pwd as password from user where id #{id} /select方案二使用结果集映射-ResultMap 【推荐】 resultMap idUserMap typeUser!-- id为主键 --id columnid propertyid/!-- column是数据库表的列名 , property是对应实体类的属性名 --result columnname propertyname/result columnpwd propertypassword/ /resultMap select idselectUserById resultMapUserMapselect id , name , pwd from user where id #{id} /select5.3、ResultMap 5.3.1、自动映射 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来。 实际上在为一些比如连接的复杂语句编写映射代码的时候一份 resultMap 能够代替实现同等功能的长达数千行的代码。 ResultMap 的设计思想是对于简单的语句根本不需要配置显式的结果映射而对于复杂一点的语句只需要描述它们的关系就行了。 你已经见过简单映射语句的示例了但并没有显式指定 resultMap。比如 select idselectUserById resultTypemapselect id , name , pwd from user where id #{id} /select上述语句只是简单地将所有的列映射到 HashMap 的键上这由 resultType 属性指定。虽然在大部分情况下都够用但是 HashMap 不是一个很好的模型。你的程序更可能会使用 JavaBean 或 POJOPlain Old Java Objects普通老式 Java 对象作为模型。 ResultMap 最优秀的地方在于虽然你已经对它相当了解了但是根本就不需要显式地用到他们。 5.3.2、手动映射 返回值类型为resultMap select idselectUserById resultMapUserMapselect id , name , pwd from user where id #{id} /select编写resultMap实现手动映射 resultMap idUserMap typeUser!-- id为主键 --id columnid propertyid/!-- column是数据库表的列名 , property是对应实体类的属性名 --result columnname propertyname/result columnpwd propertypassword/ /resultMap如果世界总是这么简单就好了。但是肯定不是的数据库中存在一对多多对一的情况我们之后会使用到一些高级的结果集映射associationcollection这些我们将在之后讲解今天你们需要把这些知识都消化掉才是最重要的理解结果集映射的这个概念 5、ResultMap 5.1、查询为null问题 5.2、解决方案 06、MyBatis分页的实现 6、分页的实现 6.1、日志工厂 思考我们在测试SQL的时候要是能够在控制台输出 SQL 的话是不是就能够有更快的排错效率 如果一个 数据库相关的操作出现了问题我们可以根据输出的SQL语句快速排查问题。 对于以往的开发过程我们会经常使用到debug模式来调节跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口配置文件的源代码执行过程。因此我们必须选择日志工具来作为我们开发调节程序的工具。 Mybatis内置的日志工厂提供日志功能具体的日志实现有以下几种工具 SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的按上文列举的顺序查找。 如果一个都未找到日志功能就会被禁用。 标准日志实现 指定 MyBatis 应该使用哪个日志记录实现。如果此设置不存在则会自动发现日志记录实现。 settingssetting namelogImpl valueSTDOUT_LOGGING/ /settings测试可以看到控制台有大量的输出我们可以通过这些输出来判断程序到底哪里出了Bug 6.2、Log4j 简介 Log4j是Apache的一个开源项目 通过使用Log4j我们可以控制日志信息输送的目的地控制台文本GUI组件…. 我们也可以控制每一条日志的输出格式 通过定义每一条日志信息的级别我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是这些可以通过一个配置文件来灵活地进行配置而不需要修改应用的代码。 使用步骤 导入log4j的包 dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version /dependency配置文件编写 #将等级为DEBUG的日志信息输出到console和file这两个目的地console和file的定义在下面的代码 log4j.rootLoggerDEBUG,console,file #控制台输出的相关设置 log4j.appender.console org.apache.log4j.ConsoleAppender log4j.appender.console.Target System.out log4j.appender.console.ThresholdDEBUG log4j.appender.console.layout org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern[%c]-%m%n #文件输出的相关设置 log4j.appender.file org.apache.log4j.RollingFileAppender log4j.appender.file.File./log/kuang.log log4j.appender.file.MaxFileSize10mb log4j.appender.file.ThresholdDEBUG log4j.appender.file.layoutorg.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatisDEBUG log4j.logger.java.sqlDEBUG log4j.logger.java.sql.StatementDEBUG log4j.logger.java.sql.ResultSetDEBUG log4j.logger.java.sql.PreparedStatementDEBUG setting设置日志实现settingssetting namelogImpl valueLOG4J/ /settings 在程序中使用Log4j进行输出//注意导包org.apache.log4j.Logger static Logger logger Logger.getLogger(MyTest.class); Test public void selectUser() {logger.info(info进入selectUser方法);logger.debug(debug进入selectUser方法);logger.error(error: 进入selectUser方法);SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);ListUser users mapper.selectUser();for (User user: users){System.out.println(user);}session.close(); }测试看控制台输出 使用Log4j 输出日志 可以看到还生成了一个日志的文件 【需要修改file的日志级别】 6.3、limit实现分页 思考为什么需要分页 在学习mybatis等持久层框架的时候会经常对数据进行增删改查操作使用最多的是对数据库进行查询操作如果查询大量数据的时候我们往往使用分页进行查询也就是每次处理小部分数据这样对数据库压力就在可控范围内。 使用Limit实现分页 #语法 SELECT * FROM table LIMIT stratIndexpageSize SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 #为了检索从某一个偏移量到记录集的结束所有的记录行可以指定第二个参数为 -1 SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. #如果只给定一个参数它表示返回最大的记录行数目 SELECT * FROM table LIMIT 5; //检索前 5 个记录行 #换句话说LIMIT n 等价于 LIMIT 0,n。步骤 修改Mapper文件 select idselectUser parameterTypemap resultTypeuserselect * from user limit #{startIndex},#{pageSize} /selectMapper接口参数为map //选择全部用户实现分页 ListUser selectUser(MapString,Integer map); 在测试类中传入参数测试推断起始位置 当前页面 - 1 * 页面大小 //分页查询 , 两个参数startIndex , pageSize Test public void testSelectUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);int currentPage 1; //第几页int pageSize 2; //每页显示几个MapString,Integer map new HashMapString,Integer();map.put(startIndex,(currentPage-1)*pageSize);map.put(pageSize,pageSize);ListUser users mapper.selectUser(map);for (User user: users){System.out.println(user);}session.close(); }6.4、RowBounds分页 我们除了使用Limit在SQL层面实现分页也可以使用RowBounds在Java代码层面实现分页当然此种方式作为了解即可。我们来看下如何实现的 步骤 mapper接口 //选择全部用户RowBounds实现分页 ListUser getUserByRowBounds(); mapper文件select idgetUserByRowBounds resultTypeuserselect * from user /select测试类 在这里我们需要使用RowBounds类 Test public void testUserByRowBounds() {SqlSession session MybatisUtils.getSession();int currentPage 2; //第几页int pageSize 2; //每页显示几个RowBounds rowBounds new RowBounds((currentPage-1)*pageSize,pageSize);//通过session.**方法进行传递rowBounds[此种方式现在已经不推荐使用了]ListUser users session.selectList(com.kuang.mapper.UserMapper.getUserByRowBounds, null, rowBounds);for (User user: users){System.out.println(user);}session.close(); }6.5、PageHelper 了解即可可以自己尝试使用 官方文档https://pagehelper.github.io/ 07、使用注解开发 狂神说 分类学习笔记 创建时间2021/04/01 16:52 字体 皮肤最后修改于 2021/04/01 18:09 7、使用注解开发 7.1、面向接口编程 大家之前都学过面向对象编程也学习过接口但在真正的开发中很多时候我们会选择面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好 在一个面向对象的系统中系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信大到各模块之间的交互在系统设计之初都是要着重考虑的这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。 关于接口的理解 接口从更深层次的理解应是定义规范约束与实现名实分离的原则的分离。 接口的本身反映了系统设计人员对系统的抽象理解。 接口应有两类 第一类是对一个个体的抽象它可对应为一个抽象体(abstract class) 第二类是对一个个体某一方面的抽象即形成一个抽象面interface 一个体有可能有多个抽象面。抽象体与抽象面是有区别的。 三个面向区别 面向对象是指我们考虑问题时以对象为单位考虑它的属性及方法 . 面向过程是指我们考虑问题时以一个具体的流程事务过程为单位考虑它的实现 . 接口设计与非接口设计是针对复用技术而言的与面向对象过程不是一个问题.更多的体现就是对系统整体的架构 7.2、利用注解开发 mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建 sql 类型主要分成 : select () update () Insert () delete () 【注意】利用注解开发就不需要mapper.xml映射文件了 . 我们在我们的接口中添加注解 //查询全部用户 Select(select id,name,pwd password from user) public ListUser getAllUser(); 在mybatis的核心配置文件中注入!--使用class绑定接口-- mappersmapper classcom.kuang.mapper.UserMapper/ /mappers我们去进行测试 Test public void testGetAllUser() {SqlSession session MybatisUtils.getSession();//本质上利用了jvm的动态代理机制UserMapper mapper session.getMapper(UserMapper.class); ● ListUser users mapper.getAllUser();for (User user : users){System.out.println(user);}session.close(); }利用Debug查看本质 本质上利用了jvm的动态代理机制 Mybatis详细的执行流程 7.3、注解增删改 改造MybatisUtils工具类的getSession( ) 方法重载实现。【鸡汤多看源码实现】 //获取SqlSession连接public static SqlSession getSession(){return getSession(true); //事务自动提交}public static SqlSession getSession(boolean flag){return sqlSessionFactory.openSession(flag);}【注意】确保实体类和数据库字段对应 查询 编写接口方法注解 //根据id查询用户 Select(select * from user where id #{id}) User selectUserById(Param(id) int id); 测试Test public void testSelectUserById() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);User user mapper.selectUserById(1);System.out.println(user);session.close(); }新增 编写接口方法注解 //添加一个用户 Insert(insert into user (id,name,pwd) values (#{id},#{name},#{pwd})) int addUser(User user); 测试Test public void testAddUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);User user new User(6, 秦疆, 123456);mapper.addUser(user);session.close(); }修改 编写接口方法注解 //修改一个用户 Update(update user set name#{name},pwd#{pwd} where id #{id}) int updateUser(User user); 测试Test public void testUpdateUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);User user new User(6, 秦疆, zxcvbn);mapper.updateUser(user);session.close(); }删除 编写接口方法注解 //根据id删除用 Delete(delete from user where id #{id}) int deleteUser(Param(id)int id);测试 Test public void testDeleteUser() {SqlSession session MybatisUtils.getSession();UserMapper mapper session.getMapper(UserMapper.class);mapper.deleteUser(6);session.close(); }【注意点增删改一定记得对事务的处理】 7.4、关于Param Param注解用于给方法参数起一个名字。以下是总结的使用原则 在方法只接受一个参数的情况下可以不使用Param。 在方法接受多个参数的情况下建议一定要使用Param注解给参数命名。 如果参数是 JavaBean 则不能使用Param。 不使用Param注解时参数只能有一个并且是Javabean。 7.5、#与$的区别 {} 的作用主要是替换预编译语句(PrepareStatement)中的占位符? 【推荐使用】 INSERT INTO user (name) VALUES (#{name}); INSERT INTO user (name) VALUES (?); ${} 的作用是直接进行字符串替换 INSERT INTO user (name) VALUES (‘${name}’); INSERT INTO user (name) VALUES (‘kuangshen’);
http://www.tj-hxxt.cn/news/230018.html

相关文章:

  • 平台推广策略都有哪些如何优化网站结构
  • 济南网站seo技术在哪买网站空间
  • 沈阳市做网站电话自定义功能的网站
  • 网站开发的后端自学装修设计软件
  • 湖北省建设厅网站查询扬中最新招聘信息
  • 摄影网站怎么备案17网站一起做网店普宁池尾
  • 动力网站代码手机壳在线设计网站
  • 自适应h5网站模板景区网站建设 现状
  • 模板王网站官网2023年7月最新新闻摘抄
  • 怎么优化网站性能电商网站开发怎么样
  • 网站建设职责微信答题小程序制作
  • 如何搭建网站平台多多进宝cms网站建设
  • 广东省城乡住房建设厅网站首页qq是哪个公司的
  • 金融网站设计方向搜狗指数官网
  • 电商网站建设需求分析书湛江建站公司
  • 微网站在哪个平台上搭建好 知乎网站开发 上海
  • 网站备案号 脱离服务商崇明建设机械网站
  • 快手评论点赞网站建设专业分站如何推广一个网站
  • 自学网站平面设计大作设计网站官网入口
  • 用asp.net做的网站贴吧网址查询信息查询
  • 传播网站建设wordpress完整教程下载
  • 杭州北京网站建设公司哪家好石家庄做网站需要多少钱
  • 网站建设路由器怎么设置加工平台英语
  • 网站建设项目验收报告书广西桂林商贸旅游技工学校
  • 建筑公司网站源码开源网站建设 杭州
  • 网站建设的流程 步骤wordpress腾讯云插件下载
  • 什么网站可以做相册做家政的在哪些网站推广
  • 招代理网站建设公司免费下载app应用软件
  • 诚信网站认证必需做吗搜索引擎优化完整过程
  • 网站建设项目考察范文泰州seo网络推广