建各企业网站多少钱,wordpress播放器安装不了,wordpress 修改发帖时间,建设一个域名抢注的网站一、MyBatis分页插件1.1 分页插件的介绍分页是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止。分页的的好处#xff1a;1.…一、MyBatis分页插件1.1 分页插件的介绍分页是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止。分页的的好处1.提高性能一次查20个比一次查20000个性能肯定更好另外如果数据量很大一次性将内容都查询出来查询出来的结果是放在内存里面的会增加cpu的开销造成内存的浪费效率极低。2.展现层面的考虑如果一次展现太多的数据不管是排版还是美观上都不好。1.2 分页插件的引入和配置(1).在pom.xml中引入插件依赖(2).在mybatis核心配置文件中进行配置1.3 定义UserMapper接口方法1.4 配置UserMapper.xml映射文件1.5 测试分页插件作用二、MyBatis的注解开发2.1 注解开发的背景介绍注解提供了一种简单的方式来实现简单映射语句而不会引入大量的开销。能够读懂别人写的代码特别是框架相关的代码。本来可能需要很多配置文件需要很多逻辑才能实现的内容就可以使用一个或者多个注解来替代这样就使得编程更加简洁代码更加清晰。2.2 常用注解介绍这几年来注解开发越来越流行Mybatis 也可以使用注解开发方式这样我们就可以减少编写 Mapper 映射文件了。本次我们先围绕一些基本的 CRUD 来学习再学习复杂映射关系及延迟加载。Insert: 实现新增Update: 实现更新Delete: 实现删除Select: 实现查询Result: 实现结果集封装Results: 这个注解用于定义结果集映射它包含了一个或多个 Result 注解每个 Result 注解指定了一个数据库字段到 Java 对象属性的映射ResultMap: 实现引用 Results 定义的封装One: 实现一对一结果集封装Many: 实现一对多结果集封装CacheNamespace: 在类名上加入注解实现注解二级缓存的使用三、项目环境搭建3.1 构建maven工程导入依赖3.2 加入配置文件加入mybatis核心配置文件log4j.properties配置文件、db.properties配置文件、MybatisUtil.java工具类加入到项目中四、使用 Mybatis 注解实现基本 CRUD4.1 编写实体类package com.sy.pojo; import java.io.Serializable; import java.util.List; public class User implements Serializable { private int id; //编号id private String username; //用户名 private String password; //密码 private int age; //年龄 private String sex; //性别 private String email; //邮箱 private ListOrder orderList; public ListOrder getOrderList() { return orderList; } public void setOrderList(ListOrder orderList) { this.orderList orderList; } public User() { } public User(String username, String password, int age, String sex, String email) { this.username username; this.password password; this.age age; this.sex sex; this.email email; } public User(int id, String username, String password, int age, String sex, String email) { this.id id; this.username username; this.password password; this.age age; this.sex sex; this.email email; } public int getId() { return id; } public void setId(int id) { this.id id; } public String getUsername() { return username; } public void setUsername(String username) { this.username username; } public String getPassword() { return password; } public void setPassword(String password) { this.password password; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex sex; } public String getEmail() { return email; } public void setEmail(String email) { this.email email; } Override public String toString() { return User{ id id , username username \ , password password \ , age age , sex sex \ , email email \ , orderList orderList }; } }package com.sy.pojo; public class Order { // 订单id private Integer id; // 用户id,该属性名和数据库的字段名不一致 private Integer userId; // 订单号 private String number; // 订单创建时间 private String createTime; // 备注 private String note; private User user; public User getUser() { return user; } public void setUser(User user) { this.user user; } public Order() { } public Order(Integer userId, String number, String createTime, String note) { this.userId userId; this.number number; this.createTime createTime; this.note note; } public Order(Integer id, Integer userId, String number, String createTime, String note) { this.id id; this.userId userId; this.number number; this.createTime createTime; this.note note; } public Integer getId() { return id; } public void setId(Integer id) { this.id id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number number; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime createTime; } public String getNote() { return note; } public void setNote(String note) { this.note note; } Override public String toString() { return Order{ id id , userId userId , number number \ , createTime createTime \ , note note \ , user user }; } }4.2 编写 SqlMapConfig 配置文件?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration !-- SqlMapConfig.xml 中配置的内容和顺序如下 1. properties属性 2. settings全局配置参数 3. typeAliases类型别名 4. plugins插件 5. environments环境集合属性对象 environment环境子属性对象 transactionManager事务管理 dataSource数据源 6. mappers映射器 -- !--引入数据源 db.properties文件 用resource属性加载外部配置文件 -- properties resourcedb.properties/properties !--配置使用的日志-- settings !-- 配置使用的日志 valueSTDOUT_LOGGINGmybatis自带的日志输出 valuelog4j: 当然也可以设置为log4j -- setting namelogImpl valuelog4j/ !--依赖包的问题:空指针异常-- !-- 全局开启延迟加载 -- setting namelazyLoadingEnabled valuetrue/ !-- 当启用时有会话时会执行延迟加载 -- setting nameaggressiveLazyLoading valuefalse/ !-- 开启二级缓存的支持 -- setting namecacheEnabled valuetrue/ /settings !--设置别名 typeAliases类型别名-- typeAliases !--别名定义针对单个别名定义 type:类型的路径; alias:别名-- !--可以为多个实体类配置别名 别名的大小写没有影响-- !--typeAlias typecom.sy.pojo.User aliasuser/-- !-- 批量别名的定义: (常用) package:指定包名mybatis会自动扫描包中的pojo类 自动定义别名别名就是类名(首字母大写或小写都可以) -- !--扫描包 的方式-- package namecom.sy.pojo/ /typeAliases !--分页插件-- plugins plugin interceptorcom.github.pagehelper.PageInterceptor/plugin /plugins !-- environments设置多个连接数据库的环境 属性 default设置默认使用的环境的id(development代表开发环境下) -- environments defaultdevelopment !-- environment设置具体的连接数据库的环境信息 属性 id设置环境的唯一标识可通过environments标签中的 default设置某一个环境的id表示默认使用的环境 -- environment iddevelopment !-- transactionManager设置事务管理方式 属性 type设置事务管理方式typeJDBC|MANAGED typeJDBC说明当前mybatis事务管理使用的是connection的机制connection.commit().connection.rollback()等 typeMANAGEDmybatis不管理事务了交给其他外部第三方框架管理比如和Spring整合之后交给Spring管理 -- transactionManager typeJDBC/ !-- dataSource设置数据源 属性 type设置数据源的类型typePOOLED|UNPOOLED|JNDI typePOOLED使用POOLED连接池,这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来避免了创建新的连接实例时所必需的初始化和认证时间。 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 environment idtest transactionManager typeJDBC/ dataSource typePOOLED property namedriver valuecom.mysql.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/mybatis?useUnicodetrueamp;characterEncodingutf-8amp;serverTimezoneUTCamp;useSSLfalse/ property nameusername valueroot/ property namepassword valueroot/ /dataSource /environment !--在xml文件中用amp; 在properties文件中用-- /environments !--加载映射文件-- mappers !--包扫描 要求:mapper接口名称和mapper映射文件名称相同-- package namecom.sy.mapper/ /mappers /configuration4.3 使用注解方式开发持久层接口package com.sy.mapper; import com.sy.pojo.Order; import com.sy.pojo.User; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.FetchType; import java.util.List; //开启二级缓存的支持 CacheNamespace public interface OrderMapper { /** * 查询所有订单 */ Results(id orderResult,value { Result(id true,column id,property id), Result(column user_id,property userId), Result(column number,property number), Result(column create_time,property createTime), Result(column note,property note), }) Select(select * from orders) ListOrder queryOrderList(); /** * 根据用户id查询订单 */ ResultMap(value orderResult) Select(select * from orders where user_id #{uid}) ListOrder queryOrderByUid(Integer uid); /** * 添加订单信息 SelectKey注解: 则用于定义一个查询这个查询通常是用来获取最后插入的记录的ID * 属性: * statement属性: 用于指定查询最后生成的主键值的SQL语句 * keyProperty属性: 用于指定将获取到的主键值赋值给哪个属性 * keyColumn属性: 表示将查询结果赋值给数据表中的哪一列 * before属性: 用于指定在插入数据之前还是之后执行这个查询 * resultType属性: 用于指定查询返回的结果类型 * LAST_INSERT_ID()是MySQL特有的函数用于获取最后一次插入生成的自增ID */ Insert(insert into orders ( user_id, number, create_time, note) values (#{userId},#{number},#{createTime},#{note})) SelectKey(statement SELECT LAST_INSERT_ID(), before false, keyColumn id, keyProperty id, resultType Integer.class) Integer addOrder(Order order); /** * 修改订单信息 * */ Update(update orders set number #{number},note #{note} where id #{id}) Integer updateOrderById(Order order); /** * 删除订单信息 */ Delete(delete from orders where id #{id}) Integer deleteOrderById(Integer id); //需求查询每个订单对应的用户信息(嵌套查询) Results(value { //订单信息 Result(id true,column id,property id), Result(column user_id,property userId), Result(column number,property number), Result(column create_time,property createTime), Result(column note,property note), //用户信息 Result(property user,javaType User.class,column user_id, oneOne(select com.sy.mapper.UserMapper.queryById,fetchType FetchType.LAZY) ) }) Select(select * from orders) ListOrder queryOrderUser(); }4.4 编写测试方法package com.sy.test; import com.sy.mapper.OrderMapper; import com.sy.pojo.Order; import com.sy.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class OrderMapperTest { //查询所有订单 Test public void queryOrderListTest(){ SqlSession sqlSession MyBatisUtils.getSqlSession(); OrderMapper mapper sqlSession.getMapper(OrderMapper.class); ListOrder orders mapper.queryOrderList(); for (Order order : orders) { System.out.println(order); } MyBatisUtils.close(sqlSession); } //根据用户id查询订单 Test public void queryOrderByUidTest(){ SqlSession sqlSession MyBatisUtils.getSqlSession(); OrderMapper mapper sqlSession.getMapper(OrderMapper.class); ListOrder orders mapper.queryOrderByUid(1); for (Order order : orders) { System.out.println(order); } MyBatisUtils.close(sqlSession); } //添加订单信息 Test public void addOrderTest(){ SqlSession sqlSession MyBatisUtils.getSqlSession(); OrderMapper mapper sqlSession.getMapper(OrderMapper.class); Order order new Order(3, 1000014, 2015-02-12 16:13:25, 新增订单); int i mapper.addOrder(order); if (i 0){ System.out.println(更新了: i 条数据); } System.out.println(order); MyBatisUtils.close(sqlSession); } // 修改订单信息 Test public void updateOrderByIdTest(){ SqlSession sqlSession MyBatisUtils.getSqlSession(); OrderMapper mapper sqlSession.getMapper(OrderMapper.class); Order order new Order(); order.setId(6); order.setNumber(1000015); order.setNote(修改订单); int i mapper.updateOrderById(order); if (i 0){ System.out.println(修改成功); } MyBatisUtils.close(sqlSession); } //删除订单信息 Test public void deleteOrderByIdTest(){ SqlSession sqlSession MyBatisUtils.getSqlSession(); OrderMapper mapper sqlSession.getMapper(OrderMapper.class); Integer i mapper.deleteOrderById(4); if (i 0){ System.out.println(删除成功); } MyBatisUtils.close(sqlSession); } //需求查询每个订单对应的用户信息(嵌套查询) Test public void queryOrderUserTest(){ SqlSession sqlSession MyBatisUtils.getSqlSession(); OrderMapper mapper sqlSession.getMapper(OrderMapper.class); ListOrder orders mapper.queryOrderUser(); for (Order order : orders) { System.out.println(order); } MyBatisUtils.close(sqlSession); } }五、使用注解实现复杂关系映射开发5.1 复杂关系映射的注解介绍1. Results 注解:代替的是标签resultMap该注解中可以使用单个Result 注解也可以使用Result 集合Results{ResultResult}或ResultsResult2. Resutl 注解:代替了 id 标签和result 标签Result 中 属性介绍id 是否是主键字段column 数据库的列名property 需要装配的属性名one 需要使用的One 注解ResultoneOnemany 需要使用的Many 注解Resultmanymany3. One 注解一对一代替了assocation 标签是多表查询的关键在注解中用来指定子查询返回单一对象。One 注解属性介绍select 指定用的 来多表查询的 sqlmapperfetchType 会覆盖全局的配置参数 lazyLoadingEnabled。使用格式Result(column ,property,oneOne(select))4. Many 注解一对多代替了Collection 标签, 是是多表查询的关键在注解中用来指定子查询返回对象集合。注意聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性属性的 javaType一般为 ArrayList但是注解中可以不定义使用格式Result(property,column,manyMany(select))5.2 使用注解实现一对一复杂关系映射及延迟加载需求查询每个订单对应的用户信息5.2.1 实体类5.2.2 添加UserMapper的持久层接口并使用注解配置5.2.3 添加OrderMapper持久层接口并使用注解配置5.2.4 添加一对一测试方法5.3 使用注解实现一对多复杂关系映射5.3.1 实体类5.3.2 添加OrderMapper持久层接口并使用注解配置5.3.3 添加UserMapper持久层接口并使用注解配置5.3.4 添加一对多测试方法