Java通过MyBatis框架对MySQL数据进行增删查改的基本方法
1.查询
除了单条记录的查询,这里我们来尝试查询一组记录。
IUserMapper接口添加下面方法:
List<User>getUsers(Stringname);
在User.xml中添加:
<resultMaptype="User"id="userList"><!--type为返回列表元素的类全名或别名--> <idcolumn="id"property="id"/> <resultcolumn="name"property="name"/> <resultcolumn="age"property="age"/> <resultcolumn="address"property="address"/> </resultMap> <selectid="getUsers"parameterType="string"resultMap="userList"><!--resultMap为上面定义的User列表--> select*from`user`wherenamelike#{name} </select>
测试方法:
@Test publicvoidqueryListTest(){ SqlSessionsession=sqlSessionFactory.openSession(); try{ IUserMappermapper=session.getMapper(IUserMapper.class); List<User>users=mapper.getUsers("%a%");//%在sql里代表任意个字符。 for(Useruser:users){ log.info("{}:{}",user.getName(),user.getAddress()); } }finally{ session.close(); } }
如果联表查询,返回的是复合对象,需要用association关键字来处理。
如User发表Article,每个用户可以发表多个Article,他们之间是一对多的关系。
(1)创建Article表,并插入测试数据:
--Dropthetableifexists DROPTABLEIFEXISTS`Article`; --Createatablenamed'Article' CREATETABLE`Article`( `id`intNOTNULLAUTO_INCREMENT, `user_id`intNOTNULL, `title`varchar(100)NOTNULL, `content`textNOTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8; --Addseveraltestrecords INSERTINTO`article` VALUES ('1','1','title1','content1'), ('2','1','title2','content2'), ('3','1','title3','content3'), ('4','1','title4','content4');
(2)com.john.hbatis.model.Article类:
publicclassArticle{ privateintid; privateUseruser; privateStringtitle; privateStringcontent; //Gettersandsettersareomitted }
(3)在IUserMapper中添加:
List<Article>getArticlesByUserId(intid);
(4)在User.xml中添加:
<resultMaptype="com.john.hbatis.model.Article"id="articleList"> <idcolumn="a_id"property="id"/> <resultcolumn="title"property="title"/> <resultcolumn="content"property="content"/> <associationproperty="user"javaType="User"><!--user属性映射到User类--> <idcolumn="id"property="id"/> <resultcolumn="name"property="name"/> <resultcolumn="address"property="address"/> </association> </resultMap> <selectid="getArticlesByUserId"parameterType="int"resultMap="articleList"> selectu.id,u.name,u.age,u.address,a.ida_id,a.title,a.content fromarticlea innerjoinuseru ona.user_id=u.idandu.id=#{id} </select>
(5)测试方法:
@Test publicvoidgetArticlesByUserIdTest(){ SqlSessionsession=sqlSessionFactory.openSession(); try{ IUserMappermapper=session.getMapper(IUserMapper.class); List<Article>articles=mapper.getArticlesByUserId(1); for(Articlearticle:articles){ log.info("{}-{},author:{}",article.getTitle(),article.getContent(),article.getUser().getName()); } }finally{ session.close(); } }
附:
除了在association标签内定义字段和属性的映射外,还可以重用User的resultMap:
<associationproperty="user"javaType="User"resultMap="userList"/>
2.新增
IUserMapper接口添加下面方法:
intaddUser(Useruser);
User.xml添加:
<insertid="addUser"parameterType="User"useGeneratedKeys="true"keyProperty="id"><!--useGeneratedKeys指定myBatis使用数据库自动生成的主键,并填充到keyProperty指定的属性上。如果未指定,返回对象拿不到生成的值--> insertintouser(name,age,address)values(#{name},#{age},#{address}) </insert>
测试方法:
@Test publicvoidaddUserTest(){ Useruser=newUser("Lucy",102,"HappyDistrict"); SqlSessionsession=sqlSessionFactory.openSession(); try{ IUserMappermapper=session.getMapper(IUserMapper.class); intaffectedCount=mapper.addUser(user); session.commit();//默认为不自动提交。调用session.getConnection().getAutoCommit()查看 log.info("{}newrecordwasinsertedsuccessfullywhoseid:{}",affectedCount,user.getId()); }finally{ session.close(); } }
3.更新
接口添加方法:
intupdateUser(Useruser);
User.xml添加:
<updateid="updateUser"parameterType="User"> update`user`setname=#{name},age=#{age},address=#{address} whereid=#{id} </update>
测试方法:
@Test publicvoidupdateUserTest(){ SqlSessionsession=sqlSessionFactory.openSession(); try{ IUserMappermapper=session.getMapper(IUserMapper.class); Useruser=mapper.getUserById(8); user.setAddress("SatisfiedDistrict"); intaffectedCount=mapper.updateUser(user);//除了要修改的属性外,user的其它属性也要赋值,否则这些属性会被数据库更新为初始值(null或0等),可以先查询一次,但这样会增加和数据库不必要的交互。后面的条件判断能避免此问题。 log.info("Affectedcount:{}",affectedCount); session.commit(); }finally{ session.close(); } }
4.删除
接口添加方法:
intdeleteUser(intid);
User.xml添加:
<deleteid="deleteUser"parameterType="int"> deletefrom`user`whereid=#{id} </delete>
测试方法:
@Test publicvoiddeleteUserTest(){ SqlSessionsession=sqlSessionFactory.openSession(); try{ IUserMappermapper=session.getMapper(IUserMapper.class); intaffectedCount=mapper.deleteUser(8); log.info("Affectedcount:{}",affectedCount); session.commit(); }finally{ session.close(); } }