




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MyBatis 详解详解 与配置与配置 MyBatis Spring MySql MyBatis 是一个可以自定义 SQL 存储过程和高级映射的持久层框架 MyBatis 摒除了大部分的 JDBC 代码 手工设置参数和结果集重获 MyBatis 只使用简单 的 XML 和注解来配置和映射基本数据类型 Map 接口和 POJO 到数据库记录 相对 Hibernate 和 Apache OJB 等 一站式 ORM 解决方案而言 Mybatis 是一 种 半自动化 的 ORM 实现 需要使用的 Jar 包 mybatis 3 0 2 jar mybatis 核心包 mybatis spring 1 0 0 jar 与 Spring 结合包 MyBatis 简介 MyBatis 是一个可以自定义 SQL 存储过程和高级映射的持久层框架 MyBatis 摒除了大部分的 JDBC 代码 手工设置参数和结果集重获 MyBatis 只 使用简单的 XML 和注解来配置和映射基本数据类型 Map 接口和 POJO 到数据 库记录 相对 Hibernate 和 Apache OJB 等 一站式 ORM 解决方案而言 Mybatis 是一种 半自动化 的 ORM 实现 需要使用的 Jar 包 mybatis 3 0 2 jar mybatis 核心包 mybatis spring 1 0 0 jar 与 Spring 结合包 下载地址 http ibatis apache org tools ibator 1 2MyBatis Spring MySql 简单配置 1 2 1 搭建 Spring 环境 1 建立 maven 的 web 项目 2 加入 Spring 框架 配置文件 3 在 pom xml 中加入所需要的 jar 包 spring 框架的 mybatis mybatis spring junit 等 4 更改 web xml 和 spring 的配置文件 5 添加一个 jsp 页面和对应的 Controller 6 测试 可参照 Eclipse 的 Maven 构建 SpringMVC 项目 1 2 2 建立 MySql 数据库 建立一个学生选课管理数据库 表 学生表 班级表 教师表 课程表 学生选课表 逻辑关系 每个学生有一个班级 每个班级对应一个班主任教师 每个教师只 能当一个班的班主任 使用下面的 sql 进行建数据库 先建立学生表 插入数据 2 条以上 更多 sql 请下载项目源文件 在 resource sql 中 Sql 代码 CREATE DATABASE STUDENT MANAGER USE STUDENT MANAGER CREATE TABLE STUDENT TBL STUDENT ID VARCHAR 255 PRIMARY KEY STUDENT NAME VARCHAR 10 NOT NULL STUDENT SEX VARCHAR 10 STUDENT BIRTHDAY DATE CLASS ID VARCHAR 255 INSERT INTO STUDENT TBL STUDENT ID STUDENT NAME STUDENT SEX STUDENT BIRTHDAY CLASS ID VALUES 123456 某某某 女 1980 08 01 121546 创建连接 MySql 使用的配置文件 mysql properties Mysql properties 代码 jdbc driverClassName com mysql jdbc Driver jdbc url jdbc mysql localhost 3306 student manager user root private ClassEntity classEntity private Date studentBirthday private String studentID private String studentName private String studentSex public ClassEntity getClassEntity return classEntity public Date getStudentBirthday return studentBirthday public String getStudentID return studentID public String getStudentName return studentName public String getStudentSex return studentSex public void setClassEntity ClassEntity classEntity this classEntity classEntity public void setStudentBirthday Date studentBirthday this studentBirthday studentBirthday public void setStudentID String studentID this studentID studentID public void setStudentName String studentName this studentName studentName public void setStudentSex String studentSex this studentSex studentSex 1 2 3 2 创建数据访问接口 Student 类对应的 dao 接口 StudentMapper Java 代码 public interface StudentMapper public StudentEntity getStudent String studentID public StudentEntity getStudentAndClass String studentID public List getStudentAll public void insertStudent StudentEntity entity public void deleteStudent StudentEntity entity public void updateStudent StudentEntity entity 1 2 3 3 创建 SQL 映射语句文件 Student 类的 sql 语句文件 StudentMapper xml resultMap 标签 表字段与属性的映射 Select 标签 查询 sql Xml 代码 1 2 3 4 创建 MyBatis 的 mapper 配置文件 在 src main resource 中创建 MyBatis 配置文件 mybatis config xml typeAliases 标签 给类起一个别名 com manager data model StudentEntity 类 可以使用 StudentEntity 代替 Mappers 标签 加载 MyBatis 中实体类的 SQL 映射语句文件 Xml 代码 1 2 3 5 修改 Spring 的配置文件 主要是添加 SqlSession 的制作工厂类的 bean SqlSessionFactoryBean 在 mybatis spring 包中 需要指定配置文件位置和 dataSource 和数据访问接口对应的实现 bean 通过 MapperFactoryBean 创建出来 需要执 行接口类全称和 SqlSession 工厂 bean 的引用 Xml 代码 1 2 4 测试 StudentMapper 使用 SpringMVC 测试 创建一个 TestController 配置 tomcat 访问 index do 页面进行测试 Java 代码 Controller public class TestController Autowired private StudentMapper studentMapper RequestMapping value index do public void indexPage StudentEntity entity studentMapper getStudent 10000013 System out println name entity getStudentName 使用 Junit 测试 Java 代码 使用 Junit 测试 Java 代码 RunWith value SpringJUnit4ClassRunner class ContextConfiguration value test servlet xml public class StudentMapperTest Autowired private ClassMapper classMapper Autowired private StudentMapper studentMapper Transactional public void getStudentTest StudentEntity entity studentMapper getStudent 10000013 System out println entity getStudentID entity getStudentName List studentList studentMapper getStudentAll for StudentEntity entityTemp studentList System out println entityTemp getStudentName 更详细的功能源代码 页面最下面 二 SQL 语句映射文件 1 resultMap SQL 映射 XML 文件是所有 sql 语句放置的地方 需要定义一个 workspace 一 般定义为对应的接口类的路径 写好 SQL 语句映射文件后 需要在 MyBAtis 配 置文件 mappers 标签中引用 例如 Xml 代码 SQL 映射 XML 文件一些初级的元素 1 cache 配置给定模式的缓存 2 cache ref 从别的模式中引用一个缓存 3 resultMap 这是最复杂而却强大的一个元素了 它描述如何从结果集中 加载对象 4 sql 一个可以被其他语句复用的 SQL 块 5 insert 映射 INSERT 语句 6 update 映射 UPDATE 语句 7 delete 映射 DELEETE 语句 8 select 映射 SELECT 语句 2 1 resultMap resultMap 是 MyBatis 中最重要最强大的元素了 你可以让你比使用 JDBC 调用结果集省掉 90 的代码 也可以让你做许多 JDBC 不支持的事 现实 上 要写一个等同类似于交互的映射这样的复杂语句 可能要上千行的代码 ResultMaps 的目的 就是这样简单的语句而不需要多余的结果映射 更多复杂 的语句 除了只要一些绝对必须的语句描述关系以外 再也不需要其它的 resultMap 属性 type 为 java 实体类 id 为此 resultMap 的标识 resultMap 可以设置的映射 1 constructor 用来将结果反射给一个实例化好的类的构造器 a idArg ID 参数 将结果集标记为 ID 以方便全局调用 b arg 反射到构造器的通常结果 2 id ID 结果 将结果集标记为 ID 以方便全局调用 3 result 反射到 JavaBean 属性的普通结果 4 association 复杂类型的结合 多个结果合成的类型 a nested result mappings 几 resultMap 自身嵌套关联 也可以引用到 一个其它上 5 collection 复杂类型集合 a collection of complex types 6 nested result mappings resultMap 的集合 也可以引用到一个其它上 7 discriminator 使用一个结果值以决定使用哪个 resultMap a case 基本一些值的结果映射的 case 情形 i nested result mappings 一个 case 情形本身就是一个结果映射 因此 也可以包括一些相同的元素 也可以引用一个外部 resultMap 2 1 1 id result id result 是最简单的映射 id 为主键映射 result 其他基本数据库表字段 到实体类属性的映射 最简单的例子 Xml 代码 id result 语句属性配置细节 属性 描述 property 需要映射到 JavaBean 的属性名称 column 数据表的列名或者标签别名 javaType 一个完整的类名 或者是一个类型别名 如果你匹配的是一个 JavaBean 那 MyBatis 通常会自行检测到 然后 如果你是要映射到一个 HashMap 那你需 要指定 javaType 要达到的目的 jdbcType 数据表支持的类型列表 这个属性只在 insert update 或 delete 的时候针对 允许空的列有用 JDBC 需要这项 但 MyBatis 不需要 如果你是直接针对 JDBC 编码 且有允许空的列 而你要指定这项 typeHandler 使用这个属性可以覆写类型处理器 这项值可以是一个完整的类名 也可以是 一个类型别名 支持的 JDBC 类型 为了将来的引用 MyBatis 支持下列 JDBC 类型 通过 JdbcType 枚举 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL VARCHAR BINARY BLOB NVARCHAR SMALLINT DOUBLE LONGVARCHAR VARBINARY C LOB NCHAR INTEGER NUMERIC DATE LONGVARBINARY BOOLEAN NCLOB BI GINT DECIMAL TIME NULL CURSOR 2 1 2 constructor 我们使用 id result 时候 需要定义 java 实体类的属性映射到数据 库表的字段上 这个时候是使用 JavaBean 实现的 当然我们也可以使用实体类 的构造方法来实现值的映射 这个时候是通过构造方法参数的书写的顺序来进 行赋值的 使用 construcotr 功能有限 例如使用 collection 级联查询 上面使用 id result 实现的功能就可以改为 Xml 代码 当然 我们需要定义 StudentEntity 实体类的构造方法 Java 代码 public StudentEntity String studentID String studentName String studentSex Date studentBirthday this studentID studentID this studentName studentName this studentSex studentSex this studentBirthday studentBirthday 2 1 3 association 联合 联合元素用来处理 一对一 的关系 需要指定映射的 Java 实体类的属性 属 性的 javaType 通常 MyBatis 自己会识别 对应的数据库表的列名称 如果 想覆写的话返回结果的值 需要指定 typeHandler 不同情况需要告诉 MyBatis 如何加载一个联合 MyBatis 可以用两种方式加载 1 select 执行一个其它映射的 SQL 语句返回一个 Java 实体类型 较灵活 2 resultsMap 使用一个嵌套的结果映射来处理通过 join 查询结果集 映射 成 Java 实体类型 例如 一个班级对应一个班主任 首先定义好班级中的班主任属性 Java 代码 private TeacherEntity teacherEntity 2 1 3 1 使用 select 实现联合 例 班级实体类中有班主任的属性 通过联合在得到一个班级实体时 同时映 射出班主任实体 这样可以直接复用在 TeacherMapper xml 文件中定义好的查询 teacher 根据其 ID 的 select 语句 而且不需要修改写好的 SQL 语句 只需要直接修改 resultMap 即可 ClassMapper xml 文件部分内容 Xml 代码 SELECT FROM CLASS TBL CT WHERE CT CLASS ID classID TeacherMapper xml 文件部分内容 Xml 代码 SELECT FROM TEACHER TBL TT WHERE TT TEACHER ID teacherID 2 1 3 2 使用 resultMap 实现联合 与上面同样的功能 查询班级 同时查询器班主任 需在 association 中添加 resultMap 在 teacher 的 xml 文件中定义好的 新写 sql 查询班级表 left join 教师表 不需要 teacher 的 select 修改 ClassMapper xml 文件部分内容 Xml 代码 SELECT FROM CLASS TBL CT LEFT JOIN TEACHER TBL TT ON CT TEACHER ID TT TEACHER ID WHERE CT CLASS ID classID 其中的 teacherResultMap 请见上面 TeacherMapper xml 文件部分内容中 2 1 4 collection 聚集 聚集元素用来处理 一对多 的关系 需要指定映射的 Java 实体类的属性 属 性的 javaType 一般为 ArrayList 列表中对象的类型 ofType Java 实体类 对应的数据库表的列名称 不同情况需要告诉 MyBatis 如何加载一个聚集 MyBatis 可以用两种方式加载 1 select 执行一个其它映射的 SQL 语句返回一个 Java 实体类型 较灵活 2 resultsMap 使用一个嵌套的结果映射来处理通过 join 查询结果集 映射 成 Java 实体类型 例如 一个班级有多个学生 首先定义班级中的学生列表属性 Java 代码 private List studentList 2 1 4 1 使用 select 实现聚集 用法和联合很类似 区别在于 这是一对多 所以一般映射过来的都是列表 所以这里需要定义 javaType 为 ArrayList 还需要定义列表中对象的类型 ofType 以及必须设置的 select 的语句名称 需要注意的是 这里的查询 student 的 select 语句条件必须是外键 classID ClassMapper xml 文件部分内容 Xml 代码 SELECT FROM CLASS TBL CT WHERE CT CLASS ID classID StudentMapper xml 文件部分内容 Xml 代码 WHERE ST CLASS ID classID 2 1 4 2 使用 resultMap 实现聚集 使用 resultMap 就需要重写一个 sql left join 学生表 Xml 代码 SELECT FROM CLASS TBL CT LEFT JOIN STUDENT TBL ST ON CT CLASS ID ST CLASS ID LEFT JOIN TEACHER TBL TT ON CT TEACHER ID TT TEACHER ID WHERE CT CLASS ID classID 其中的 teacherResultMap 请见上面 TeacherMapper xml 文件部分内容中 studentResultMap 请见上面 StudentMapper xml 文件部分内容中 二 SQL 语句映射文件 2 增删改查 参数 缓存 2 2 select 一个 select 元素非常简单 例如 Xml 代码 SELECT ST STUDENT ID ST STUDENT NAME ST STUDENT SEX ST STUDENT BIRTHDAY ST CLASS ID FROM STUDENT TBL ST WHERE ST STUDENT ID studentID 这条语句就叫做 getStudent 有一个 String 参数 并返回一个 StudentEntity 类型的对象 注意参数的标识是 studentID select 语句属性配置细节 属性 描述 取值 默认 id 在这个模式下唯一的标识符 可被其它语句引用 parameterType 传给此语句的参数的完整类名或别名 resultType 语句返回值类型的整类名或别名 注意 如果是集合 那么这里填 写的是集合的项的整类名或别名 而不是集合本身的类名 resultType 与 resultMap 不能并用 resultMap 引用的外部 resultMap 名 结果集映射是 MyBatis 中最强大的特性 许多复杂的映射都可以轻松解决 resultType 与 resultMap 不能并用 flushCache 如果设为 true 则会在每次语句调用的时候就会清空缓存 select 语句默认设为 false true false false useCache 如果设为 true 则语句的结果集将被缓存 select 语句默认设为 false true false false timeout 设置驱动器在抛出异常前等待回应的最长时间 默认为不设值 由驱 动器自己决定 true false false timeout 设置驱动器在抛出异常前等待回应的最长时间 默认为不设值 由驱 动器自己决定 正整数 未设置 fetchSize 设置一个值后 驱动器会在结果集数目达到此数值后 激发返回 默认为不设值 由驱动器自己决定 正整数 驱动器决定 statementType statement preparedstatement callablestatement 预准备语句 可调用语句 STATEMENT PREPARED CALLABLE PREPARED resultSetType forward only scroll sensitive scroll insensitive 只转发 滚动敏感 不区分大小写的滚动 FORWARD ONLY SCROLL SENSITIVE SCROLL INSENSITIVE 驱动器决定 2 3 insert 一个简单的 insert 语句 Xml 代码 INSERT INTO STUDENT TBL STUDENT ID STUDENT NAME STUDENT SEX STUDENT BIRTHDAY CLASS ID VALUES studentID studentName studentSex studentBirthday classEntity classID insert 可以使用数据库支持的自动生成主键策略 设置 useGeneratedKeys true 然后把 keyProperty 设成对应的列 就搞定了 比如说上面的 StudentEntity 使用 auto generated 为 id 列生成主键 还可以使用 selectKey 元素 下面例子 使用 mysql 数据库 nextval student 为自定义函数 用来生成一个 key Xml 代码 select nextval student INSERT INTO STUDENT TBL STUDENT ID STUDENT NAME STUDENT SEX STUDENT BIRTHDAY CLASS ID VALUES studentID studentName studentSex studentBirthday classEntity classID insert 语句属性配置细节 属性 描述 取值 默认 id 在这个模式下唯一的标识符 可被其它语句引用 parameterType 传给此语句的参数的完整类名或别名 flushCache 如果设为 true 则会在每次语句调用的时候就会清空缓存 select 语句默认设为 false true false false useCache 如果设为 true 则语句的结果集将被缓存 select 语句默认设为 false true false false timeout 设置驱动器在抛出异常前等待回应的最长时间 默认为不设值 由驱 动器自己决定 true false false timeout 设置驱动器在抛出异常前等待回应的最长时间 默认为不设值 由驱 动器自己决定 正整数 未设置 fetchSize 设置一个值后 驱动器会在结果集数目达到此数值后 激发返回 默认为不设值 由驱动器自己决定 正整数 驱动器决定 statementType statement preparedstatement callablestatement 预准备语句 可调用语句 STATEMENT PREPARED CALLABLE PREPARED useGeneratedKeys 告诉 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来获取数据库自己生成的 主键 MySQL SQLSERVER 等 关系型数据库会有自动生成的字段 默认 false true false false keyProperty 标识一个将要被 MyBatis 设置进 getGeneratedKeys 的 key 所返回的值 或者 为 insert 语句使用一个 selectKey 子元素 selectKey 语句属性配置细节 属性 描述 取值 keyProperty selectKey 语句生成结果需要设置的属性 resultType 生成结果类型 MyBatis 允许使用基本的数据类型 包括 String int 类型 order 可以设成 BEFORE 或者 AFTER 如果设为 BEFORE 那它会先选择主键 然后设置 keyProperty 再执行 insert 语句 如果设为 AFTER 它就先运行 insert 语句再运行 selectKey 语句 通常是 insert 语句中内部调用数据库 像 Oracle 内嵌的序列机制 BEFORE AFTER statementType 像上面的那样 MyBatis 支持 STATEMENT PREPARED 和 CALLABLE 的语句形式 对应 Statement PreparedStatement 和 CallableStatement 响应 STATEMENT PREPARED CALLABLE 2 4 update delete 一个简单的 update Xml 代码 UPDATE STUDENT TBL SET STUDENT TBL STUDENT NAME studentName STUDENT TBL STUDENT SEX studentSex STUDENT TBL STUDENT BIRTHDAY studentBirthday STUDENT TBL CLASS ID classEntity classID WHERE STUDENT TBL STUDENT ID studentID 一个简单的 delete Xml 代码 DELETE FROM STUDENT TBL WHERE STUDENT ID studentID update delete 语句属性配置细节 属性 描述 取值 默认 id 在这个模式下唯一的标识符 可被其它语句引用 parameterType 传给此语句的参数的完整类名或别名 flushCache 如果设为 true 则会在每次语句调用的时候就会清空缓存 select 语句默认设为 false true false false useCache 如果设为 true 则语句的结果集将被缓存 select 语句默认设为 false true false false timeout 设置驱动器在抛出异常前等待回应的最长时间 默认为不设值 由驱 动器自己决定 true false false timeout 设置驱动器在抛出异常前等待回应的最长时间 默认为不设值 由驱 动器自己决定 正整数 未设置 fetchSize 设置一个值后 驱动器会在结果集数目达到此数值后 激发返回 默认为不设值 由驱动器自己决定 正整数 驱动器决定 statementType statement preparedstatement callablestatement 预准备语句 可调用语句 STATEMENT PREPARED CALLABLE PREPARED 2 5 sql Sql 元素用来定义一个可以复用的 SQL 语句段 供其它语句调用 比如 Xml 代码 SELECT ST STUDENT ID ST STUDENT NAME ST STUDENT SEX ST STUDENT BIRTHDAY ST CLASS ID FROM STUDENT TBL ST 这样 在 select 的语句中就可以直接引用使用了 将上面 select 语句改成 Xml 代码 WHERE ST STUDENT ID studentID 2 6parameters 上面很多地方已经用到了参数 比如查询 修改 删除的条件 插入 修改的数据等 MyBatis 可以使用的基本数据类型和 Java 的复杂数据类型 基本数据类型 String int date 等 但是使用基本数据类型 只能提供一个参数 所以需要使用 Java 实体 类 或 Map 类型做参数类型 通过 可以直接得到其属性 2 6 1 基本类型参数 根据入学时间 检索学生列表 Xml 代码 SELECT FROM STUDENT TBL ST LEFT JOIN CLASS TBL CT ON ST CLASS ID CT CLASS ID WHERE CT CLASS YEAR classYear Java 代码 List studentList studentMapper getStudentListByClassYear StringUtil parse 2007 9 1 for StudentEntity entityTemp studentList System out println entityTemp toString 2 6 2Java 实体类型参数 根据姓名和性别 检索学生列表 使用实体类做参数 Xml 代码 SELECT from STUDENT TBL ST WHERE ST STUDENT NAME LIKE CONCAT CONCAT studentName AND ST STUDENT SEX studentSex Java 代码 StudentEntity entity new StudentEntity entity setStudentName 李 entity setStudentSex 男 List studentList studentMapper getStudentListWhereEntity entity for StudentEntity entityTemp studentList System out println entityTemp toString 2 6 3Map 参数 根据姓名和性别 检索学生列表 使用 Map 做参数 Xml 代码 SELECT from STUDENT TBL ST WHERE ST STUDENT SEX sex AND ST STUDENT SEX sex Java 代码 Map map new HashMap map put sex 女 map put name 李 List studentList studentMapper getStudentListWhereMap map for StudentEntity entityTemp studentList System out println entityTemp toString 2 6 4 多参数的实现 如果想传入多个参数 则需要在接口的参数上添加 Param 注解 给出一个实例 接口写法 Java 代码 public List getStudentListWhereParam Param value name String name Param value sex String sex Param value birthday Date birthdar Param value classEntity ClassEntity classEntity SQL 写法 Xml 代码 SELECT from STUDENT TBL ST ST STUDENT NAME LIKE CONCAT CONCAT name AND ST STUDENT SEX sex AND ST STUDENT BIRTHDAY birthday AND ST CLASS ID classEntity classID 进行查询 Java 代码 List studentList studentMapper getStudentListWhereParam StringUtil parse 1985 05 28 classMapper getClassByID 20000002 for StudentEntity entityTemp studentList System out println entityTemp toString 2 6 5 字符串代入法 默认的情况下 使用 语法会促使 MyBatis 生成 PreparedStatement 属性并且使用 PreparedStatement 的参数 来安全的设置值 尽量这些 是快捷安全 也是经常使用的 但有时候你可能想直接未更改的字符串代入到 SQL 语句中 比如说 对于 ORDER BY 你可能会这样使用 ORDER BY columnName 但 MyBatis 不会修改和规避掉这个字符串 注意 这样地接收和应用一个用户输入到未更改的语句中 是非常不 安全的 这会让用户能植入破坏代码 所以 要么要求字段不要允许客户输入 要么你直接来检测他的合法性 2 7 cache 缓存 MyBatis 包含一个强在的 可配置 可定制的缓存机制 MyBatis 3 的缓存实现有了许多改进 既强劲也更容易配置 默认的情况 缓存是没有开 启 除了会话缓存以外 它可以提高性能 且能解决全局依赖 开启二级缓存 你只需要在 SQL 映射文件中加入简单的一行 这句简单的语句的作用如下 1 所有在映射文件里的 select 语句都将被缓存 2 所有在映射文件里 insert update 和 delete 语句会清空缓存 3 缓存使用 最近很少使用 算法来回收 4 缓存不会被设定的时间所清空 5 每个缓存可以存储 1024 个列表或对象的引用 不管查询出来的结果是什么 6 缓存将作为 读 写 缓存 意味着获取的对象不是共享的且对调用者是安 全的 不会有其它的调用 7 者或线程潜在修改 例如 创建一个 FIFO 缓存让 60 秒就清空一次 存储 512 个对象结果或列表 引用 并且返回的结果是只读 因为在不用的线程里的两个调用者修改它们可 能会导致引用冲突 Xml 代码 还可以在不同的命名空间里共享同一个缓存配置或者实例 在这种情况下 你就可以使用 cache ref 来引用另外一个缓存 Xml 代码 Cache 语句属性配置细节 属性 说明 取值 默认值 eviction 缓存策略 LRU 最近最少使用法 移出最近较长周期内都没有被使用的对象 FIFI 先进先出 移出队列里较早的对象 SOFT 软引用 基于软引用规则 使用垃圾回收机制来移出对象 WEAK 弱引用 基于弱引用规则 使用垃圾回收机制来强制性地移出对象 LRU FIFI SOFT WEAK LRU flushInterval 代表一个合理的毫秒总计时间 默认是不设置 因此使用无间 隔清空即只能调用语句来清空 正整数 不设置 size 缓存的对象的大小 正整数 1024 readOnly 只读缓存将对所有调用者返回同一个实例 因此都不能被修改 这可以极大的 提高性能 可写的缓存将通过序列 化来返回一个缓存对象的拷贝 这会比较慢 但是比较安全 所以默认值是 false true false false 转载 三 动态 SQL 语句 有些时候 sql 语句 where 条件中 需要一些安全判断 例如按性别 检索 如果传入的参数是空的 此时查询出的结果很可能是空的 也许我们需 要参数为空 时 是查出全部的信息 这是我们可以使用动态 sql 增加一个判 断 当参数不符合要求的时候 我们可以不去判断此查询条件 下文均采用 mysql 语法和函数 例如字符串链接函数 CONCAT 源代码 页面 最下面 3 1 if 标签 一个很普通的查询 Xml 代码 SELECT from STUDENT TBL ST WHERE ST STUDENT NAME LIKE CONCAT CONCAT studentName 但是此时如果 studentName 是 null 或空字符串 此语句很可能报错或查询结果 为空 此时我们使用 if 动态 sql 语句先进行判断 如果值为 null 或等于空字 符串 我们就进行此条件的判断 修改为 Xml 代码 SELECT from STUDENT TBL ST WHERE ST STUDENT NAME LIKE CONCAT CONCAT studentName 此时 当 studentName 的值为 null 或 的时候 我们并不进行 where 条件的 判断 所以当 studentName 值为 null 或 值 不附带这个条件 所以查询结 果是全部 由于参数是 Java 的实体类 所以我们可以把所有条件都附加上 使用时比较灵 活 new 一个这样的实体类 我们需要限制那个条件 只需要附上相应的值就 会 where 这个条件 相反不去赋值就可以不在 where 中判断 代码中的 where 标签 请参考 3 2 1 Xml 代码 SELECT from STUDENT TBL ST ST STUDENT NAME LIKE CONCAT CONCAT studentName AND ST STUDENT SEX studentSex AND ST STUDENT BIRTHDAY studentBirthday AND ST CLASS ID classEntity classID 查询 姓名中有 李 男 生日在 1985 05 28 班级在 20000002 的 学生 Java 代码 StudentEntity entity new StudentEntity entity setStudentName 李 entity setStudentSex 男 entity setStudentBirthday StringUtil parse 1985 05 28 entity setClassEntity classMapper getClassByID 20000002 List studentList studentMapper getStudentListWhereEntity entity for StudentEntity entityTemp studentList System out println entityTemp toString 3 2 where set trim 标签 3 2 1 where 当 if 标签较多时 这样的组合可能会导致错误 例如 like 姓名 等于指定 性别等 Xml 代码 SELECT from STUDENT TBL ST WHERE ST STUDENT NAME LIKE CONCAT CONCAT studentName AND ST STUDENT SEX studentSex 如果上面例子 参数 studentName 为 null 或 则或导致此 sql 组合成 WHERE AND 之类的关键字多余的错误 SQL 这时我们可以使用 where 动态语句来解决 这个 where 标签会知道如果它包 含的标签中有返回值的话 它就插入一个 where 此外 如果标签返回的内 容是以 AND 或 OR 开头的 则它会剔除掉 上面例子修改为 Xml 代码 SELECT from STUDENT TBL ST ST STUDENT NAME LIKE CONCAT CONCAT studentName AND ST STUDENT SEX studentSex 3 2 2 set 当在 update 语句中使用 if 标签时 如果前面的 if 没有执行 则或导致逗号多 余错误 使用 set 标签可以将动态的配置 SET 关键字 和剔除追加到条件末尾 的任何不相关的逗号 没有使用 if 标签时 如果有一个参数为 null 都会导致错误 如下示例 Xml 代码 UPDATE STUDENT TBL SET STUDENT TBL STUDENT NAME studentName STUDENT TBL STUDENT SEX studentSex STUDENT TBL STUDENT BIRTHDAY studentBirthday STUDENT TBL CLASS ID classEntity classID WHERE STUDENT TBL STUDENT ID studentID 使用 set if 标签修改后 如果某项为 null 则不进行更新 而是保持数据库原 值 如下示例 Xml 代码 UPDATE STUDENT TBL STUDENT TBL STUDENT NAME studentName STUDENT TBL STUDENT SEX studentS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教部编版四年级语文下册《习作:我的动物朋友》示范公开课教学课件
- 区域环境专家年终总结
- 上海市奉贤区南桥镇十学校2026届九上化学期中学业水平测试试题含解析
- 黑龙江省哈尔滨双城区六校联考2026届英语九年级第一学期期末调研模拟试题含解析
- 云南省昆明市四校联考2026届九年级化学第一学期期中统考模拟试题含解析
- 2026届广东省深圳市龙岗区石芽岭学校九年级英语第一学期期末预测试题含解析
- 河北省保定市莲池区冀英学校2026届九上化学期中综合测试模拟试题含解析
- 2026届黑龙江省齐齐哈尔市昂溪区化学九上期中预测试题含解析
- 农村蔬菜基地合作协议7篇
- 禹阳离婚协议中子女抚养费及教育费用分担协议
- DBJ33T 1320-2024 建设工程质量检测技术管理标准
- 驾照科一试题库-900题
- SH∕T 3097-2017 石油化工静电接地设计规范
- CE安全标准规范(电气类)
- 第3课《追求人生理想》第2框《努力把人生理想变为现实》-【中职专用】《哲学与人生》同步课堂课件
- 花园小学少先队知识竞赛题
- (2024版)大学本科新增专业《生物育种技术》解读
- JJG 643-2024标准表法流量标准装置
- 加令岭水库防洪抢险应急预案
- 培训养老护理员的
- 《电机与拖动基础》课件
评论
0/150
提交评论