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();
}
}