mybatis教程之增删改查_动力节点Java学院整理 程序员文章站 2024-02-27 18:56:27 select 一个select 元素非常简单。例如: select 一个select 元素非常简单。例如: <!-- 查询学生,根据id --> <select id="getstudent" parametertype="string" resultmap="studentresultmap"> 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} </select> 这条语句就叫做‘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 驱动器决定 insert 一个简单的insert语句: <!-- 插入学生 --> <insert id="insertstudent" parametertype="studententity"> insert into student_tbl (student_id, student_name, student_sex, student_birthday, class_id) values (#{studentid}, #{studentname}, #{studentsex}, #{studentbirthday}, #{classentityclassid}) </insert> insert可以使用数据库支持的自动生成主键策略,设置usegeneratedkeys=”true”,然后把keyproperty 设成对应的列,就搞定了。比如说上面的studententity 使用auto-generated 为id 列生成主键. 还可以使用selectkey元素。下面例子,使用mysql数据库nextval('student')为自定义函数,用来生成一个key。 <!-- 插入学生 自动主键--> <insert id="insertstudentautokey" parametertype="studententity"> <selectkey keyproperty="studentid" resulttype="string" order="before"> select nextval('student') </selectkey> insert into student_tbl (student_id, student_name, student_sex, student_birthday, class_id) values (#{studentid}, #{studentname}, #{studentsex}, #{studentbirthday}, #{classentityclassid}) </insert> 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 update、delete 一个简单的update: <!-- 更新学生信息 --> <update id="updatestudent" parametertype="studententity"> 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}; </update> 一个简单的delete: <!-- 删除学生 --> <delete id="deletestudent" parametertype="studententity"> delete from student_tbl where student_id = #{studentid} </delete> 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 sql sql元素用来定义一个可以复用的sql 语句段,供其它语句调用。比如: <!-- 复用sql语句 查询student表所有字段 --> <sql id="selectstudentall"> select st.student_id, st.student_name, st.student_sex, st.student_birthday, st.class_id from student_tbl st </sql> 这样,在select的语句中就可以直接引用使用了,将上面select语句改成: <!-- 查询学生,根据id --> <select id="getstudent" parametertype="string" resultmap="studentresultmap"> <include refid="selectstudentall"/> where st.student_id = #{studentid} </select> parameters 上面很多地方已经用到了参数,比如查询、修改、删除的条件,插入,修改的数据等,mybatis可以使用的基本数据类型和java的复杂数据类型。 基本数据类型,string,int,date等。 但是使用基本数据类型,只能提供一个参数,所以需要使用java实体类,或map类型做参数类型。通过#{}可以直接得到其属性。 基本类型参数 根据入学时间,检索学生列表: <!-- 查询学生list,根据入学时间 --> <select id="getstudentlistbydate" parametertype="date" resultmap="studentresultmap"> select * from student_tbl st left join class_tbl ct on st.class_id = ct.class_id where ct.class_year = #{classyear}; </select> list<studententity> studentlist = studentmapper.getstudentlistbyclassyear(stringutil.parse("2007-9-1")); for (studententity entitytemp : studentlist) { system.out.println(entitytemp.tostring()); } java实体类型参数 根据姓名和性别,检索学生列表。使用实体类做参数: <!-- 查询学生list,like姓名、=性别,参数entity类型 --> <select id="getstudentlistwhereentity" parametertype="studententity" resultmap="studentresultmap"> select * from student_tbl st where st.student_name like concat(concat('%', #{studentname}),'%') and st.student_sex = #{studentsex} </select> studententity entity = new studententity(); entity.setstudentname("李"); entity.setstudentsex("男"); list<studententity> studentlist = studentmapper.getstudentlistwhereentity(entity); for (studententity entitytemp : studentlist) { system.out.println(entitytemp.tostring()); } map参数 根据姓名和性别,检索学生列表。使用map做参数: <!-- 查询学生list,=性别,参数map类型 --> <select id="getstudentlistwheremap" parametertype="map" resultmap="studentresultmap"> select * from student_tbl st where st.student_sex = #{sex} and st.student_sex = #{sex} </select> map<string, string> map = new hashmap<string, string>(); map.put("sex", "女"); map.put("name", "李"); list<studententity> studentlist = studentmapper.getstudentlistwheremap(map); for (studententity entitytemp : studentlist) { system.out.println(entitytemp.tostring()); } 多参数的实现 如果想传入多个参数,则需要在接口的参数上添加@param注解。给出一个实例: 接口写法: 复制代码 代码如下: public list<studententity> getstudentlistwhereparam(@param(value = "name") string name, @param(value = "sex") string sex, @param(value = "birthday") date birthdar, @param(value = "classentity") classentity classentity); sql写法: <!-- 查询学生list,like姓名、=性别、=生日、=班级,多参数方式 --> <select id="getstudentlistwhereparam" resultmap="studentresultmap"> select * from student_tbl st <where> <if test="name!=null and name!='' "> st.student_name like concat(concat('%', #{name}),'%') </if> <if test="sex!= null and sex!= '' "> and st.student_sex = #{sex} </if> <if test="birthday!=null"> and st.student_birthday = #{birthday} </if> <if test="classentity!=null and classentityclassid !=null and classentityclassid!='' "> and st.class_id = #{classentity.classid} </if> </where> </select> 进行查询: list<studententity> studentlist = studentmapper.getstudentlistwhereparam("", "",stringutil.parse("1985-05-28"), classmapper.getclassbyid("20000002")); for (studententity entitytemp : studentlist) { system.out.println(entitytemp.tostring()); } 字符串代入法 默认的情况下,使用#{}语法会促使mybatis 生成preparedstatement 属性并且使用preparedstatement 的参数(=?)来安全的设置值。尽量这些是快捷安全,也是经常使用的。但有时候你可能想直接未更改的字符串代入到sql 语句中。比如说,对于order by,你可能会这样使用:order by ${columnname}但mybatis 不会修改和规避掉这个字符串。 注意:这样地接收和应用一个用户输入到未更改的语句中,是非常不安全的。这会让用户能植入破坏代码,所以,要么要求字段不要允许客户输入,要么你直接来检测他的合法性 。 cache缓存 mybatis 包含一个强在的、可配置、可定制的缓存机制。mybatis 3 的缓存实现有了许多改进,既强劲也更容易配置。默认的情况,缓存是没有开启,除了会话缓存以外,它可以提高性能,且能解决全局依赖。开启二级缓存,你只需要在sql 映射文件中加入简单的一行:<cache/> 这句简单的语句的作用如下: 1. 所有在映射文件里的select 语句都将被缓存。 2. 所有在映射文件里insert,update 和delete 语句会清空缓存。 3. 缓存使用“最近很少使用”算法来回收 4. 缓存不会被设定的时间所清空。 5. 每个缓存可以存储1024 个列表或对象的引用(不管查询出来的结果是什么)。 6. 缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用 7. 者或线程潜在修改。 例如,创建一个fifo 缓存让60 秒就清空一次,存储512 个对象结果或列表引用,并且返回的结果是只读。因为在不用的线程里的两个调用者修改它们可能会导致引用冲突。 <cache eviction="fifo" flushinterval="60000" size="512" readonly="true"> </cache> 还可以在不同的命名空间里共享同一个缓存配置或者实例。在这种情况下,你就可以使用cache-ref 来引用另外一个缓存。 <cache-ref namespace="com.liming.manager.data.studentmapper"/> cache 语句属性配置细节: 属性 说明 取值 默认值 eviction 缓存策略: lru - 最近最少使用法:移出最近较长周期内都没有被使用的对象。 fifi- 先进先出:移出队列里较早的对象 soft - 软引用:基于软引用规则,使用垃圾回收机制来移出对象 weak - 弱引用:基于弱引用规则,使用垃圾回收机制来强制性地移出对象 lru fifi soft weak lru flushinterval 代表一个合理的毫秒总计时间。默认是不设置,因此使用无间隔清空即只能调用语句来清空。 正整数 不设置 size 缓存的对象的大小 正整数 1024 readonly 只读缓存将对所有调用者返回同一个实例。因此都不能被修改,这可以极大的提高性能。可写的缓存将通过序列 化来返回一个缓存对象的拷贝。这会比较慢,但是比较安全。所以默认值是false。 true|false false 上一篇: Android 实现微信,微博,微信朋友圈,QQ分享的功能 下一篇: .net读取Rss转换为DataTable 推荐阅读 mybatis教程之增删改查_动力节点Java学院整理 mybatis教程之动态sql语句_动力节点Java学院整理 mybatis实现增删改查_动力节点Java学院整理 mybatis教程之resultmap_动力节点Java学院整理 mybatis教程之动态sql语句_动力节点Java学院整理 mybatis教程之增删改查_动力节点Java学院整理 mybatis实现增删改查_动力节点Java学院整理 mybatis教程之resultmap_动力节点Java学院整理 mongodb增删改查详解_动力节点Java学院整理 mongodb增删改查详解_动力节点Java学院整理