宁波育才建设教育集团网站,智能家居网站建设可行性分析报告,如何制作有关西安的网站,网站开发毕业设计题目MyBatis 框架 MyBatis 简介搭建 MyBatis 开发环境核心配置文件详解mapper 映射文件#xff08;实现增删改查#xff09;MyBatis获取参数值的两种方式MyBatis的各种查询功能特殊SQL的执行自定义映射resultMapresultMap 字段和属性的映射多对一映射处理一对多映射处理 动态SQLM… MyBatis 框架 MyBatis 简介搭建 MyBatis 开发环境核心配置文件详解mapper 映射文件实现增删改查MyBatis获取参数值的两种方式MyBatis的各种查询功能特殊SQL的执行自定义映射resultMapresultMap 字段和属性的映射多对一映射处理一对多映射处理 动态SQLMyBatis的缓存MyBatis的逆向工程分页插件 MyBatis 简介
MyBatis 是一个基于Java 的持久层框架。
MyBatis 支持定制化SQL存储过程以及高级映射是一个非常优秀的持久层框架。MyBatis 对JDBC的设置参数和获取结果集的操作进行封装。MyBatis 可以使用xml或注解用于配置和原始映射将接口和Java的POJO映射成数据库中的记录。MyBatis 是一个半自动的ORM框架SQL语句要自己写
和其它持久化层技术对比
JDBC。SQL 夹杂在Java代码中耦合度高维护困难实际开发中SQL有变化频繁修改的情况多见代码冗长开发效率低。Hibernate 和 JPA。操作简单开发效率高程序中的长难复杂 SQL 需要绕过框架。内部自动生产的SQL不容易做特殊优化。基于全映射的全自动框架大量字段的POJO进行部分映射时比较困难。反射操作太多导致数据库性能下降。MyBatis。轻量级性能出色SQL和Java代码分开功能边界清晰。Java代码专注业务SQL语句专注数据。SQL 语句定制化高。
搭建 MyBatis 开发环境
在项目中使用 MyBatis 框架需要在pom中引入依赖。
dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversionx.x.x/version
/dependency需要配置MyBatis 的核心配置文件。通过配置文件来获取 SqlSessionFactory 对象SqlSessionFactory 用来创建SQL 的会话通过SQL 会话进一步操作数据库。 SqlSession代表Java程序和数据库之间的会话。 SqlSessionFactory是生产SqlSession的工厂。
mybatis 核心配置文件通常命名为 mybatis-config.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN
https://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappersmapper resourceorg/mybatis/example/BlogMapper.xml//mappers
/configuration通过配置文件来获取 sqlSessionFactory。
String resource org/mybatis/example/mybatis-config.xml;
InputStream inputStream Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);创建mapper接口也就是daomapper接口不需要提供实现类只需要创建 mapper接口对应的配置文件或者在接口上使用注解就可以实现对数据库的操作。
public interface UserMapper {/*** 添加用户信息*/int insertUser();
}创建 mapper 接口对应的映射文件。 ORMObject Relationship Mapping对象关系映射。 对象Java的实体类对象。 关系关系型数据库。 映射二者之间的对应关系。 映射文件命名规则
表所对应的实体类的类名Mapper.xml表 t_user映射的实体类为 User所对应的映射文件为 UserMapper.xml。一个映射文件对应一个实体类对应一张表的操作 MyBatis 映射文件用于编写 SQL访问以及操作表中的数据。MyBatis 中可以面向接口操作数据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.dtdmapper namespacecom.atguigu.mybatis.mapper.UserMapper!--int insertUser();--insert id insertUserinsert into t_user values(null,张三,123,23,女)/insert
/mapper通过上面的配置就基本搭建了 Mybatis 的开发环境。 在程序中通过核心配置文件创建出 sqlSessionFactory通过sqlSessionFactory获取 sqlSession通过sqlSession获取一个mapper接口的代理对象。代理对象是一个接口的实例化对象可以调用mapper接口中的实现方法mapper接口的方法和对应的配置文件通过namespace和id属性绑定就可以实现对数据库的操作。
public void testMyBatis() throws IOException {//加载核心配置文件InputStream is Resources.getResourceAsStream(mybatis-config.xml);//获取SqlSessionFactoryBuilderSqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();//获取sqlSessionFactorySqlSessionFactory sqlSessionFactory sqlSessionFactoryBuilder.build(is);//获取SqlSessionSqlSession sqlSession sqlSessionFactory.openSession(true);//获取mapper接口对象UserMapper mapper sqlSession.getMapper(UserMapper.class);//测试功能int result mapper.insertUser();//提交事务//sqlSession.commit();System.out.println(result:result);
}核心配置文件详解
核心配置文件中的标签必须按照固定的顺序
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,
reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?properties 标签引入properties文件此时就可以${属性名}的方式访问属性值
properties resourcejdbc.properties/propertiessettings 标签可以设置一些属性可以参考官方文档进行设置。
settings!--将表中字段的下划线自动转换为驼峰--setting namemapUnderscoreToCamelCase valuetrue/!--开启延迟加载--setting namelazyLoadingEnabled valuetrue/
/settingstypeAliases 设置POJO类的别名。 typeAlias设置某个具体的类型的别名。 type需要设置别名的类型的全类名。 alias设置此类型的别名若不设置此属性该类型拥有默认的别名即类名且不区分大小写若设置此属性此时该类型的别名只能使用alias所设置的值。
typeAliases!--设置单个类的别名 --typeAlias typecom.atguigu.mybatis.bean.User/typeAliastypeAlias typecom.atguigu.mybatis.bean.User aliasabc/typeAlias!--以包为单位设置改包下所有的类型都拥有默认的别名即类名且不区分大小写--package namecom.atguigu.mybatis.bean/
/typeAliasesenvironments 设置多个连接数据库的环境default 设置默认使用的环境的 id。 environment 设置具体的连接数据库的环境信息需要设置事务管理方式数据源信息。
environments defaultmysql_testenvironment 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
/environmentsmappers 设置映入的映射文件。
mappers!-- 引入单个文件 --mapper resourceUserMapper.xml/!--以包为单位将包下所有的映射文件引入核心配置文件注意此方式必须保证mapper接口和mapper映射文件必须在相同的包下包结构和目录结构一致--package namecom.atguigu.mybatis.mapper/
/mappersmapper 映射文件实现增删改查
一个mapper映射文件对应一个接口mapper文件中编写sql的标签的对应一个接口的方法。 对数据库的操作有增删改查mapper文件中的编写sql的标签有查询 select标签修改update标签删除delete标签添加 insert标签。 添加
!--int insertUser();--
insert idinsertUserinsert into t_user values(null,admin,123456,23,男)
/insert删除
!--int deleteUser();--
delete iddeleteUserdelete from t_user where id 7
/delete修改
!--int updateUser();--
update idupdateUserupdate t_user set usernameybc,password123 where id 6
/update查询单个
!--User getUserById();--
select idgetUserById resultTypecom.atguigu.mybatis.bean.Userselect * from t_user where id 2
/select查询集合
!--ListUser getUserList();--
select idgetUserList resultTypecom.atguigu.mybatis.bean.Userselect * from t_user
/select其中增删改的操作会返回更新的行数查询操作会返回对应的数据。对于查询需要将返回的数据与对于的POJO类进行映射。 查询的标签 select 必须设置属性 resultType 或 resultMap用于设置实体类和数据库表的映射关系。 resultType自动映射用于属性名和表中字段名一致的情况。 resultMap自定义映射用于一对多或多对一或字段名和属性名不一致的情况。 当查询的数据为多条时不能使用实体类作为返回值只能使用集合。
MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式${} 和 #{} ${} 的本质就是字符串拼接#{} 的本质就是占位符赋值。 ${} 使用字符串拼接的方式拼接sql若为字符串类型或日期类型的字段进行赋值时需要手动加单引号 #{}使用占位符赋值的方式拼接sql此时为字符串类型或日期类型的字段进行赋值时可以自动添加单引号
在映射文件的sql标签中获取接口中传递的参数。 可以通过Param注解标识mapper接口中的方法参数会将这些参数放在map集合中以Param注解的 value属性值为键以参数为值。 只需要通过 # {} 和 $ {} 访问map集合的键就可以获取相对应的值注意${}需要手动加单引号。 如果参数为实体类类型通过 对象名.属性名 可以获取属性值。
MyBatis的各种查询功能
查询一个实体类对象通过id来查询一条数据。在接口中使用 Param 注解设置属性值。在映射文件中 通过 #{} 的方式获取参数。 resultType 设置 查询结果集的封装类型。其中 封装的类型属性要和表中查询的属性对应可开启驼峰映射数据库字段中的下划线转换为驼峰方式。
!--User getUserById(Param(id) int id);--
select idgetUserById resultTypeUserselect * from t_user where id #{id}
/select查询一个list集合查询的数据为多条则接口的返回值要设置为集合类型。
!--ListUser getUserList();--
select idgetUserList resultTypeUserselect * from t_user
/select查询单个数据
!--
在MyBatis中对于Java中常用的类型都设置了类型别名
例如java.lang.Integer 别名 int|integer
例如int 别名 _int|_integer
例如Map 别名 map,List 别名 list
其他可参考官方文档。
--
!--int getCount();--
select idgetCount resultTypeintselect count(id) from t_user
/select查询一条数据为 map 集合会自动将字段和值放入map集合中。
!--MapString, Object getUserToMap(Param(id) int id);--
select idgetUserToMap resultTypemapselect * from t_user where id #{id}
/select
!--结果{password123456, sex男, id1, age23, usernameadmin}--查询多条数据为map集合 将表中的数据以map集合的方式查询一条数据对应一个map若有多条数据就会产生多个map集合此时可以将这些map放在一个list集合中获取。
!--MapString, Object getAllUserToMap();--
select idgetAllUserToMap resultTypemapselect * from t_user
/select特殊SQL的执行
${} 的本质就是字符串拼接#{} 的本质就是占位符赋值。对于有些 sql 只能使用字符串拼接。 模糊查询如果使#{} 会先进行占位符替换就会被替换为 ‘%?%’ 而占位符出现在字符串中就不能进行值替换。
!--ListUser testMohu(Param(mohu) String mohu);--
select idtestMohu resultTypeUserselect * from t_user where username like %${mohu}%!--select * from t_user where username like concat(%,#{mohu},%)--
/select批量删除如果使用 #{} 就会整个替换并加上了单引号就达不到想要的结果。
!--int deleteMore(Param(ids) String ids);--
delete iddeleteMoredelete from t_user where id in (${ids})
/delete动态设置表名#{} 占位符替换后会加上单引号就会出错。
!--ListUser getAllUser(Param(tableName) String tableName);--
select idgetAllUser resultTypeUserselect * from ${tableName}
/select添加功能获取自增的主键 useGeneratedKeys设置使用自增的主键 keyProperty指定将主键放入参数的某个属性中。 下面中自增的主键就会放入 user 的 id 属性中。
!--int insertUser(User user);--
insert idinsertUser useGeneratedKeystrue keyPropertyidinsert into t_user values(null,#{username},#{password},#{age},#{sex})
/insert自定义映射resultMap
若字段名和实体类的属性不一致可以通过resultMap 设置自定义映射。
resultMap 字段和属性的映射
resultMap设置自定义映射id 属性表示自定义映射的唯一标识type 属性查询的数据要映射的实体类的类型。 子标签 id设置主键的映射关系。 result设置普通字段的映射关系。 association设置多对一的映射关系。 collection设置一对多的映射关系。 属性 property设置映射关系中实体类中的属性名。 column设置映射关系中表中的字段名。
resultMap iduserMap typeUserid propertyid columnid/idresult propertyuserName columnuser_name/resultresult propertypassword columnpassword/resultresult propertyage columnage/resultresult propertysex columnsex/result
/resultMap
!--ListUser testMohu(Param(mohu) String mohu);--
select idtestMohu resultMapuserMapselect id,user_name,password,age,sex from t_user where user_name like concat(%,#{mohu},%)
/select若字段名和实体类中的属性名不一致但是字段名符合数据库的规则使用_实体类中的属性名符合Java的规则使用驼峰可以在配置文件中设置一个全局配置信息 mapUnderscoreToCamelCase自动完成映射。 如字段名user_name 会自动映射为 userName。
多对一映射处理
在员工信息中存储了部门的信息。 实体类结构如下
class Emp{// 基本属性String id;...// 部门类Dept dep;
}可以使用 association 处理映射关系。 association 中 property 属性为实体类中的属性名javaType 为映射的对象类型。子标签中的id和result 同 resultMap下的作用一致。
resultMap idempDeptMap typeEmpid columneid propertyeid/idresult columnename propertyename/resultresult columnage propertyage/resultresult columnsex propertysex/resultassociation propertydept javaTypeDeptid columndid propertydid/idresult columndname propertydname/result/association
/resultMap
!--Emp getEmpAndDeptByEid(Param(eid) int eid);--
select idgetEmpAndDeptByEid resultMapempDeptMapselect emp.*,dept.* from t_emp emp left join t_dept dept on emp.did dept.did where emp.eid #{eid}
/select使用分步查询完成多对一的映射。 分步查询使用多个 sql 共同来完成一个功能。 根据部门id查出部门信息。
!--Dept getEmpDeptByStep(Param(did) int did);--
select idgetEmpDeptByStep resultTypeDeptselect * from t_dept where did #{did}
/select使用员工id查询员工信息和对应的部门信息。先查出员工的所有信息然后调用 getEmpDeptByStep 接口将部门id 作为参数查出部门信息将部门信息封装到 dept 属性中。
resultMap idempDeptStepMap typeEmpid columneid propertyeid/idresult columnename propertyename/resultresult columnage propertyage/resultresult columnsex propertysex/result!--select设置分步查询查询某个属性的值的sql的标识namespace.sqlIdcolumn将sql以及查询结果中的某个字段设置为分步查询的条件--association propertydept selectcom.atguigu.MyBatis.mapper.DeptMapper.getEmpDeptByStep columndid/association
/resultMap
!--Emp getEmpByStep(Param(eid) int eid);--
select idgetEmpByStep resultMapempDeptStepMapselect * from t_emp where eid #{eid}
/select一对多映射处理
一个部门包含多个员工在部门实体类中有一个集合来存储所有的员工信息。 使用 collection 完成一对多的映射。collection 中的 property 属性 用来指明实体类中的属性名。ofType 属性用来指明处理的集合属性中存储的数据的类型。子标签中的idresult 与 resultMap中的标签作用一致。
resultMap iddeptEmpMap typeDeptid propertydid columndid/idresult propertydname columndname/resultcollection propertyemps ofTypeEmpid propertyeid columneid/idresult propertyename columnename/resultresult propertyage columnage/resultresult propertysex columnsex/result/collection
/resultMap
!--Dept getDeptEmpByDid(Param(did) int did);--
select idgetDeptEmpByDid resultMapdeptEmpMapselect dept.*,emp.* from t_dept dept left join t_emp emp on dept.did emp.did where dept.did #{did}
/select分步查询 根据部门 id 查询员工信息。
!--ListEmp getEmpListByDid(Param(did) int did);--
select idgetEmpListByDid resultTypeEmpselect * from t_emp where did #{did}
/select查询出部门信息使用部门id调用 getEmpListByDid 接口查询出所有员工信息。 collection中 fetchType用来设置是否延迟加载。select 属性查询的全标识column 指明查询的参数。
resultMap iddeptEmpStep typeDeptid propertydid columndid/idresult propertydname columndname/resultcollection propertyemps fetchTypeeager selectcom.atguigu.MyBatis.mapper.EmpMapper.getEmpListByDid columndid/collection
/resultMap
!--Dept getDeptByStep(Param(did) int did);--
select idgetDeptByStep resultMapdeptEmpStepselect * from t_dept where did #{did}
/select分步查询的优点可以实现延迟加载。延迟加载指当使用的时候才进行查询相关数据。 使用延迟加载必须在核心配置文件中设置全局配置信息 lazyLoadingEnabled延迟加载的全局开关。当开启时所有关联对象都会延迟加载 aggressiveLazyLoading当开启时任何方法的调用都会加载该对象的所有属性。 否则每个属性会按需加载。 association和 collection中的fetchType属性设置当前的分步查询是否使用延迟加载fetchType lazy(延迟加载) | eager(立即加载)。 在核心配置文件的 settings 中进行配置。
settings!--开启延迟加载--setting namelazyLoadingEnabled valuetrue/
/settings动态SQL
Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。
if 标签可通过test属性的表达式进行判断若表达式的结果为true则标签中的内容会执行反之标签中的内容不会执行。
!--ListEmp getEmpListByMoreTJ(Emp emp);--
select idgetEmpListByMoreTJ resultTypeEmpselect * from t_emp where 11if testename ! and ename ! nulland ename #{ename}/ifif testage ! and age ! nulland age #{age}/ifif testsex ! and sex ! nulland sex #{sex}/if
/selectwhere和if一般结合使用
若where标签中的if条件都不满足则where标签没有任何功能即不会添加where关键字若where标签中的if条件满足则where标签会自动添加where关键字并将条件最前方多余的 and去掉where标签不能去掉条件最后多余的and
select idgetEmpListByMoreTJ2 resultTypeEmpselect * from t_empwhereif testename ! and ename ! nullename #{ename}/ifif testage ! and age ! nulland age #{age}/ifif testsex ! and sex ! nulland sex #{sex}/if/where
/selecttrim用于去掉或添加标签中的内容 常用属性
prefix在trim标签中的内容的前面添加某些内容prefixOverrides在trim标签中的内容的前面去掉某些内容suffix在trim标签中的内容的后面添加某些内容suffixOverrides在trim标签中的内容的后面去掉某些内容
select idgetEmpListByMoreTJ resultTypeEmpselect * from t_emptrim prefixwhere suffixOverridesandif testename ! and ename ! nullename #{ename} and/ifif testage ! and age ! nullage #{age} and/ifif testsex ! and sex ! nullsex #{sex}/if/trim
/selectchoose、when、otherwise相当于if…else if…else 可以没有otherwise标签。当满足一个when标签时就结束。若所有when标签都不满足有otherwise标签就执行otherwise标签。
!--ListEmp getEmpListByChoose(Emp emp);--
select idgetEmpListByChoose resultTypeEmpselect include refidempColumns/include from t_empwherechoosewhen testename ! and ename ! nullename #{ename}/whenwhen testage ! and age ! nullage #{age}/whenwhen testsex ! and sex ! nullsex #{sex}/whenwhen testemail ! and email ! nullemail #{email}/when/choose/where
/selectforeach 循环遍历拼接sql。 属性
collection设置要循环的数组或集合item表示集合或数组中的每一个数据separator设置循环体之间的分隔符open设置foreach标签中的内容的开始符close设置foreach标签中的内容的结束符、
!--int insertMoreEmp(ListEmp emps);--
insert idinsertMoreEmpinsert into t_emp valuesforeach collectionemps itememp separator,(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)/foreach
/insert
!--int deleteMoreByArray(int[] eids);--
delete iddeleteMoreByArraydelete from t_emp where eid inforeach collectioneids itemeid separator, open( close)#{eid}/foreach
/deleteSQL片段定义一段公共的sql片段在使用的地方通过include标签进行引入。
sql idempColumnseid,ename,age,sex,did
/sql
select include refidempColumns/include from t_empMyBatis的缓存
MyBatis的一级缓存 一级缓存是SqlSession级别的通过同一个SqlSession查询的数据会被缓存下次查询相同的数据就会从缓存中直接获取不会从数据库重新访问。 使一级缓存失效的四种情况
不同的SqlSession对应不同的一级缓存同一个SqlSession但是查询条件不同同一个SqlSession两次查询期间执行了任何一次增删改操作同一个SqlSession两次查询期间手动清空了缓存
MyBatis的二级缓存 二级缓存是SqlSessionFactory级别通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存此后若再次执行相同的查询语句结果就会从缓存中获取。
二级缓存开启的条件
- 在核心配置文件中设置全局配置属性cacheEnabledtrue默认为true不需要设置。
- 在映射文件中设置标签cache /
cache /
- 二级缓存必须在SqlSession关闭或提交之后有效
- 查询的数据所转换的实体类类型必须实现序列化的接口使二级缓存失效的情况 两次查询之间执行了任意的增删改会使一级和二级缓存同时失效。
二级缓存的相关配置 在mapper配置文件中添加的cache标签可以设置一些属性
eviction属性缓存回收策略 LRULeast Recently Used – 最近最少使用的移除最长时间不被使用的对象。 FIFOFirst in First out – 先进先出按对象进入缓存的顺序来移除它们。 SOFT – 软引用移除基于垃圾回收器状态和软引用规则的对象。 WEAK – 弱引用更积极地移除基于垃圾收集器状态和弱引用规则的对象。 默认的是 LRU。flushInterval属性刷新间隔单位毫秒默认情况是不设置也就是没有刷新间隔缓存仅仅调用语句时刷新。size属性引用数目正整数代表缓存最多可以存储多少个对象太大容易导致内存溢出。readOnly属性只读true/false true只读缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。 false读写缓存会返回缓存对象的拷贝通过序列化。这会慢一些但是安全默认是 false。
MyBatis缓存查询的顺序
先查询二级缓存因为二级缓存中可能会有其他程序已经查出来的数据可以拿来直接使用。如果二级缓存没有命中再查询一级缓存如果一级缓存也没有命中则查询数据库SqlSession关闭之后一级缓存中的数据会写入二级缓存
MyBatis的逆向工程
正向工程先创建Java实体类由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程先创建数据库表由框架负责根据数据库表反向生成如下资源Java实体类Mapper接口Mapper映射文件。
创建逆向工程的步骤
添加依赖和插件
!-- 依赖MyBatis核心包 --
dependenciesdependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.7/version/dependency
/dependencies
!-- 控制Maven在构建过程中相关配置 --
build!-- 构建过程中用到的插件 --plugins!-- 具体插件逆向工程的操作是以构建过程中插件形式出现的 --plugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.0/version!-- 插件的依赖 --dependencies!-- 逆向工程的核心依赖 --dependencygroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-core/artifactIdversion1.3.2/version/dependency!-- 数据库连接池 --dependencygroupIdcom.mchange/groupIdartifactIdc3p0/artifactIdversion0.9.2/version/dependency!-- MySQL驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.8/version/dependency/dependencies/plugin/plugins
/build创建MyBatis的核心配置文件创建逆向工程的配置文件文件名必须是generatorConfig.xml
?xml version1.0 encodingUTF-8?
!DOCTYPE generatorConfiguration
PUBLIC -//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN
http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd
generatorConfiguration!--targetRuntime: 执行生成的逆向工程的版本MyBatis3Simple: 生成基本的CRUD清新简洁版MyBatis3: 生成带条件的CRUD奢华尊享版--context idDB2Tables targetRuntimeMyBatis3Simple!-- 数据库的连接信息 --jdbcConnection driverClasscom.mysql.jdbc.DriverconnectionURLjdbc:mysql://localhost:3306/mybatisuserIdrootpassword123456/jdbcConnection!-- javaBean的生成策略--javaModelGenerator targetPackagecom.atguigu.mybatis.beantargetProject.\src\main\javaproperty nameenableSubPackages valuetrue /property nametrimStrings valuetrue //javaModelGenerator!-- SQL映射文件的生成策略 --sqlMapGenerator targetPackagecom.atguigu.mybatis.mappertargetProject.\src\main\resourcesproperty nameenableSubPackages valuetrue //sqlMapGenerator!-- Mapper接口的生成策略 --javaClientGenerator typeXMLMAPPERtargetPackagecom.atguigu.mybatis.mapper targetProject.\src\main\javaproperty nameenableSubPackages valuetrue //javaClientGenerator!-- 逆向分析的表 --!-- tableName 设置为*号可以对应所有表此时不写domainObjectName --!-- domainObjectName 属性指定生成出来的实体类的类名 --table tableNamet_emp domainObjectNameEmp/table tableNamet_dept domainObjectNameDept//context
/generatorConfiguration执行MBG插件的generate目标就会根据配置文件生成实体类mapper接口和映射文件。 生成结果 QBC查询 生成的xxxExample类中可以设置各种各样的条件查询。
Test
public void testMBG() throws IOException {InputStream is Resources.getResourceAsStream(mybatis-config.xml);SqlSession sqlSession new SqlSessionFactoryBuilder().build(is).openSession(true);EmpMapper mapper sqlSession.getMapper(EmpMapper.class);EmpExample empExample new EmpExample();//创建条件对象通过andXXX方法为SQL添加查询添加每个条件之间是and关系empExample.createCriteria().andEnameLike(a).andAgeGreaterThan(20).andDidIsNotNull();//将之前添加的条件通过or拼接其他条件empExample.or().andSexEqualTo(男);ListEmp list mapper.selectByExample(empExample);for (Emp emp : list) {System.out.println(emp);}
}分页插件
分页插件使用步骤
添加依赖
dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion5.2.0/version
/dependency配置分页插件在MyBatis的核心配置文件中配置插件。
plugins!--设置分页插件--plugin interceptorcom.github.pagehelper.PageInterceptor/plugin
/plugins使用分页插件。
在查询功能之前使用 PageHelper.startPage(int pageNum, int pageSize) 开启分页功能pageNum当前页的页码pageSize每页显示的条数。在查询获取list集合之后使用PageInfo pageInfo new PageInfo(List list, int navigatePages)获取分页相关数据。list分页之后的数据navigatePages导航分页的页码数。
分页相关数据
PageInfo{pageNum8, pageSize4, size2, startRow29, endRow30, total30, pages8,listPage{counttrue, pageNum8, pageSize4, startRow28, endRow32, total30,pages8, reasonablefalse, pageSizeZerofalse},prePage7, nextPage0, isFirstPagefalse, isLastPagetrue, hasPreviousPagetrue,hasNextPagefalse, navigatePages5, navigateFirstPage4, navigateLastPage8,navigatepageNums[4, 5, 6, 7, 8]
}
常用数据
pageNum当前页的页码
pageSize每页显示的条数
size当前页显示的真实条数
total总记录数
pages总页数
prePage上一页的页码
nextPage下一页的页码
isFirstPage/isLastPage是否为第一页/最后一页
hasPreviousPage/hasNextPage是否存在上一页/下一页
navigatePages导航分页的页码数
navigatepageNums导航分页的页码[1,2,3,4,5]示例代码
Test
public void testPageHelper(){try {InputStream is Resources.getResourceAsStream(mybatis-config.xml);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(is);SqlSession sqlSession sqlSessionFactory.openSession(true);EmpMapper mapper sqlSession.getMapper(EmpMapper.class);// PageObject page PageHelper.startPage(2, 4);// 查询之前设置分页PageHelper.startPage(6, 4);// list 为设置分页后当前页的数据ListEmp list mapper.selectByExample(null)// 根据查询结果获取分页相关数据PageInfoEmp page new PageInfo(list, 5);// list.forEach(emp - System.out.println(emp));// pageInfo 中包含所有分页相关的数据可以返回前端进行展示。 System.out.println(page);} catch (IOException e) {e.printStackTrace();}
}