- 浏览: 17636 次
- 性别:
文章分类
最新评论
(一)本文简介
本文主要记录一下mybatis的常用操作:增、删、改、查(列表查询、关联查询),基本的实现思路都是分两步进行
1.mapper文件中利用标签定义操作语句,如果是查询语句并且返回结果是多条数据的同时也要定义结果集的映射关系,所有操作相关的标签都是定义在<mapper>与</mapper>之间的下文将不再重复
2.在接口中定义与之匹配的方法,注意接口的方法和参数,一定要与 mapper文件中的标签ID、parameterType保持一至
3.定义测试方法(即具体实现代码),所有的测试方法都是基于上一章中测试类TestPerson添加的方法。
(二)新增操作
1.在mapper文件中定义插入语句,如
<!-- inset:标签是用于执行插入数据语句inset into id:标签的唯一标识,在接口方式调用时与接口中的方法名称一至 parameterType:参数类型,在接口方式调用时与接口中的参数类型一至 useGeneratedKeys:MyBatis是否获取由数据库自动生成的主键,true表示获取数据库生成的主键值 keyProperty:主键名称,返回的主键值设置到实体哪个属性中,这个方便插入数据后知道生成的主键ID,与上面属性配套使用 --> <insert id="addPerson" parameterType="com.lql.study.model.Person" useGeneratedKeys="true" keyProperty="pid"> insert into person(name,sex,age,remark) values(#{name},#{sex},#{age},#{remark}) </insert>
2.接口定义插入的方法
public void addPerson(Person p);
3.测试方法
public int addPerson() { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); Person p=new Person(); p.setName("测试三"); p.setAge(12); p.setSex("女"); p.setRemark("测试"); op.addPerson(p); session.commit();//注意一定要提交否则不会插入到数据库内 System.out.println("新增的用户ID:"+p.getPid()); session.close(); return p.getPid(); }
(三)修改操作
1.在mapper文件中定义修改语句,如
<!-- update:标签是用于执行数据库更新语句update id:标签的唯一标识,在接口方式调用时与接口中的方法名称一至 parameterType:参数类型,在接口方式调用时与接口中的参数类型一至 --> <update id="updatePerson" parameterType="com.lql.study.model.Person" > update person set name=#{name},age=#{age},sex=#{sex},remark=#{remark} where pid=#{pid} </update>
2.接口中定义修改方法
public void updatePerson(Person p);
3.测试方法
public void updatePerson(int pid) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); Person p=selectById(pid); p.setAge(66); p.setRemark("修改了年龄"); op.updatePerson(p); session.commit();//注意一定要提交否则在数据库中不起作用 session.close(); }
(三)删除操作
1.在mapper文件中定义删除语句,如
<!-- delete:标签是用于执行数据库删除语句delete from id:标签的唯一标识,在接口方式调用时与接口中的方法名称一至 parameterType:参数类型,在接口方式调用时与接口中的参数类型一至 --> <delete id="deletePerson" parameterType="int"> delete from person where pid=#{pid} </delete>
2.在接口中定义删除方法
public void deletePerson(int pid);
3.测试方法
public void deletePerson(int pid) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); op.deletePerson(pid); session.commit();//注意一定要提交否则在数据库中不起作用 session.close(); }
(四)列表查询
1.在mapper文件中定义查询语句和结果集映射,如
<!-- 为了返回list 类型而定义的returnMap --> <resultMap type="com.lql.study.model.Person" id="resultListPerson"> <id column="pid" property="pid" /> <result column="name" property="name" /> <result column="sex" property="sex" /> <result column="age" property="age" /> <result column="remark" property="remark" /> <result column="createtime" property="createtime" /> </resultMap> <!-- 返回list 的select 语句,注意 resultMap 的值是指向前面定义好的 #{0} 、#{1} 代表参数索应号与接口方法中的参数序列一至 --> <select id="selectPerson" resultMap="resultListPerson"> select * from person where sex=#{0} and age>=#{1} </select>
2.接口中定义查询方法
public List<Person> selectPerson(String sex,int age);
3.测试方法
public void queryPersonBySex(String sex,int age) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); List<Person> persons=op.selectPerson(sex,age); if(persons.size()>0) { for(int i=0;i<persons.size();i++) { System.out.println(persons.get(i).getName()+","+persons.get(i).getSex()+" ,"+persons.get(i).getAge()); } } session.close(); }
(五)关联查询,一对多查询
数据库中存在一张score表用于存储每人每个科目的成绩,结构如下
其体类定义如下
package com.lql.study.model; /** * Score entity. @author MyEclipse Persistence Tools */ public class Score implements java.io.Serializable { // Fields private Integer sid; private Person person; private Double score; private String subject; // Constructors /** default constructor */ public Score() { } /** full constructor */ public Score(Person person, Double score, String subject) { this.person = person; this.score = score; this.subject = subject; } // Property accessors public Integer getSid() { return this.sid; } public void setSid(Integer sid) { this.sid = sid; } public Person getPerson() { return this.person; } public void setPerson(Person person) { this.person = person; } public Double getScore() { return this.score; } public void setScore(Double score) { this.score = score; } public String getSubject() { return this.subject; } public void setSubject(String subject) { this.subject = subject; } }
1.定义查询语句与结果集映射
方法一
<!-- person 联合score进行查询 方法之一的配置 (多对一的方式) 查询结果是一个List<Score>的集合 --> <resultMap id="resultPersonScore" type="com.lql.study.model.Score"> <!-- 定义每一个score的属性值与查询结果集对应字段的映射关系 --> <id property="sid" column="sid" /> <result property="score" column="score" /> <result property="subject" column="subject" /> <!-- association 定义score中person实体的映射关系 --> <association property="person" javaType="com.lql.study.model.Person" > <id property="pid" column="pid" /> <result column="name" property="name" /> <result column="sex" property="sex" /> <result column="age" property="age" /> <result column="remark" property="remark" /> <result column="createtime" property="createtime" /> </association> </resultMap> <!-- 查询语句--> <select id="queryPersonScore" parameterType="string" resultMap="resultPersonScore"> select p.pid,p.name,p.sex,p.age,p.remark,p.createtime,s.sid,s.score,s.subject from person p,score s where p.pid=s.pid and p.name=#{name} </select>
方法2,对于resultMap还有另外一种用法,就是使用前面定义的person列表结果resultMap减少重复的代码,例如
<resultMap id="resultPersonScore-2" type="com.lql.study.model.Score"> <!-- 定义每一个score的属性值与查询结果集对应字段的映射关系 --> <id property="sid" column="sid" /> <result property="score" column="score" /> <result property="subject" column="subject" /> <!--association 定义score中person实体的映射关系 --> <association property="person" javaType="com.lql.study.model.Person" resultMap="resultListPerson" > </association> </resultMap>
2.接口定义查询方法使之与mapper文件对应
public List<Score> queryPersonScore(String name);
3.测试方法,即具体实现
public void queryScoreByName(String name) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); List<Score> scores=op.queryPersonScore(name); if(scores.size()>0) { for(int i=0;i<scores.size();i++) { System.out.println(scores.get(i).getPerson().getName()+","+scores.get(i).getSubject()+" ,"+scores.get(i).getScore()); } } session.close(); }
完整的测试类代码如下
package com.lql.study.action; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.List; 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 com.lql.study.model.Person; import com.lql.study.model.Score; public class TestPerson { //mybatis的配置文件 private String resource = "mybatis-config.xml"; private SqlSessionFactory sessionFactory; public TestPerson() throws IOException { //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件) Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 this.sessionFactory = new SqlSessionFactoryBuilder().build(reader); } public Person selectById(int pid) { //创建能执行映射文件中sql的sqlSession SqlSession session = sessionFactory.openSession(); /*** 映射sql的标识字符串, * * com.lql.study.model.personMapper是personMapper.xml文件中mapper标签的namespace属性的值, * getPerson是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL * */ /** String statement = "com.lql.study.model.personMapper.getPerson";//映射sql的标识字符串由映射文件里的namespace+select id组成 执行查询返回一个唯一person对象的sql //selectOnet顾名思义是查询单个对象,46是输入参数,查询person中pid=46的记录 Person person1 = session.selectOne(statement,46); System.out.println(person1.getName()); **/ //以下是接口方法方式 IPersonOption op=session.getMapper(IPersonOption.class); Person person2=op.getPerson(pid); System.out.println(person2.getName()); session.close(); return person2; } public void queryPersonBySex(String sex,int age) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); List<Person> persons=op.selectPerson(sex,age); if(persons.size()>0) { for(int i=0;i<persons.size();i++) { System.out.println(persons.get(i).getName()+","+persons.get(i).getSex()+" ,"+persons.get(i).getAge()); } } session.close(); } public int addPerson() { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); Person p=new Person(); p.setName("测试三"); p.setAge(12); p.setSex("女"); p.setRemark("测试"); op.addPerson(p); session.commit();//注意一定要提交否则不会插入到数据库内 System.out.println("新增的用户ID:"+p.getPid()); session.close(); return p.getPid(); } public void updatePerson(int pid) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); Person p=selectById(pid); p.setAge(66); p.setRemark("修改了年龄"); op.updatePerson(p); session.commit();//注意一定要提交否则在数据库中不起作用 session.close(); } public void deletePerson(int pid) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); op.deletePerson(pid); session.commit();//注意一定要提交否则在数据库中不起作用 session.close(); } public void queryScoreByName(String name) { SqlSession session = sessionFactory.openSession(); IPersonOption op=session.getMapper(IPersonOption.class); List<Score> scores=op.queryPersonScore(name); if(scores.size()>0) { for(int i=0;i<scores.size();i++) { System.out.println(scores.get(i).getPerson().getName()+","+scores.get(i).getSubject()+" ,"+scores.get(i).getScore()); } } session.close(); } public static void main(String[] args) { try { TestPerson test= new TestPerson(); test.queryPersonBySex("男",3); int pid=test.addPerson(); test.updatePerson(pid); test.deletePerson(pid); test.queryScoreByName("柳时镇"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
发表评论
-
对比两个表不同记录
2017-05-11 14:02 469minus运算的主要功能是: 在进行两个表格或者两个查询结果的 ... -
oracle导入数据过程
2016-06-13 10:45 533(1)用sqlplus登陆 sqlplus中:用户名 as ... -
mybatis-分页插件-PageHelper使用笔记
2016-06-04 21:44 2766一准备工作 下载 jar包,以目前最新版本4.15为例,jav ... -
mybatis 学习笔记(三)动态SQL
2016-06-04 19:12 374MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我 ... -
mybatis学习笔记(一)初识mybatis
2016-05-30 20:30 582MyBatis 是一个可以自定义SQL、存储过程和高级映射 ... -
查询sql 行变列
2016-04-17 20:08 383查询语句,行变列的经典用法 教师号 星期号 是否有课 1 ... -
windows下配置mysql集群
2016-04-01 23:13 604配置 MySQL 群集必需使用其群集版本,注意和 MySQL ... -
mysql集群学习
2016-03-31 21:19 482MySQL 群集是一种技术,该技术允许在无共享的系统中部署“内 ...
相关推荐
总之,"MyBatis学习笔记1"是一份关于MyBatis框架基础和进阶使用的教程,通过学习,读者可以掌握MyBatis的基本使用方法,理解其核心机制,并能进行源码级别的探索,提升数据库操作的效率和灵活性。配合"mybatis_test...
这篇“mybatis 学习笔记”将带你深入理解 MyBatis 的核心概念和主要功能。 1. **MyBatis 概述**: MyBatis 是一个轻量级的 Java ORM(对象关系映射)框架,它的核心是 SQL 映射文件和 SqlSessionFactory。ORM 技术...
mybatis学习笔记 mybatis学习笔记 mybatis学习笔记 mybatis学习笔记 mybatis学习笔记 mybatis学习笔记
Mybatis学习笔记(狂神).md
在"MyBatis学习笔记.zip"这个压缩包中,包含了四天的学习内容,分别以"MyBatis_day1"、"MyBatis_day2"、"MyBatis_day3"和"MyBatis_day4"命名,这些笔记可能详细阐述了MyBatis的核心概念和使用方法。让我们逐一解析...
MyBatis-Plus 学习笔记 MyBatis-Plus 是一个基于 MyBatis 的增强工具,旨在简化开发、提高效率。它提供了许多实用的特性和功能,例如无侵入、损耗小、强大的 CRUD 操作、支持 Lambda 形式调用、支持多种数据库、...
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的...
本学习笔记是作者在大学期间深入学习Mybatis后的整理,旨在帮助初学者快速入门并掌握其核心概念与功能。 笔记共分为11个章节,涵盖Mybatis的基础到高级应用,以下是主要知识点的详细讲解: 1. **Mybatis简介**:...
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。...通过深入学习MyBatis,你可以更好地理解和掌控数据库操作,提升开发效率。
在本学习资源中,你将找到一份详尽的Mybatis学习笔记和源码,这将极大地助力你的学习过程,尤其是对自学者而言。这份笔记被认为是非常有价值且深入的,作者在其中倾注了大量的精力,确保了内容的全面性和实用性。 ...
个人mybatis学习笔记,是个人学习后记录所得,记录内容仅供参考,如如果有什么不对的地方,欢迎指正。
马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...
Mybatis学习笔记整理,全面详实,通俗易懂.md