文章目录
- 查询
- 更新
- 删除
- 插入
- 封装实体类作为参数
- 接下来介绍使用mybatis进行数据库的增删改查操作。我们使用的是基于xml的方式。
- 主要改动为IUserDao接口(定义函数名、参数以及返回值类型)和IUserDao.xml文件(定义SQL语句)。
- 并在MybatisTest中进行测试
查询
IUserDao接口:
//查找所有用户List<User> findAll();//根据id查找用户User findUser(int id);//模糊查询List<User> findByName(String s);
IUserDao.xml:
<!--查找所有用户--><select id="findAll" resultType="com.cjx.domain.User">select * from user</select><!--根据id查询用户,parameterType表示参数类型,#{
0}中的0只是一个占位符--><select id="findUser" parameterType="int" resultType="com.cjx.domain.User">select * from user WHERE id=#{
0}</select><!--模糊查询--><select id="findByName" parameterType="String"resultType="com.cjx.domain.User">select * from user where username like #{
username}</select>
MybatisTest:
public class MybatisTest {
InputStream in;SqlSession sqlSession;IUserDao iUserDao;@Before//使用注解方式,表示该方法在测试方法(@Test)之前执行public void init() throws Exception{
//1、解析xmlin= Resources.getResourceAsStream("SqlMapConfig.xml");//2、构建SqlSessionFactory工厂SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);//3、利用工厂创建SqlSession对象sqlSession=sqlSessionFactory.openSession();//4、使用sqlSession创建代理对象iUserDao= sqlSession.getMapper(IUserDao.class);}@After//该方法在测试方法之后执行public void destory()throws Exception {
sqlSession.commit();//提交事务,否则增删改不会成功in.close();sqlSession.close();}//查找所有用户public void findAll(){
List<User> list=iUserDao.findAll();for(User user:list)System.out.println(user);}@Test//根据id查找用户public void findUserById(){
User user=iUserDao.findUserById(1);System.out.println(user);}
}@Test//模糊查询public void findByName(){
List<User>list=iUserDao.findByName("%a");for(User user:list)System.out.println(user);}
测试结果:
findAll():
findUserById():
findByName():
更新
IUserDao接口:
//根据id更新name,用map保存id和namevoid updateName(Map<String ,String> map);
IUserDao.xml:
<!--根据id更新用户name,#{
name}代表key为name的value值,同理于#{
id}--><update id="updateName" parameterType="map" >UPDATE user set username=#{
name}WHERE id=#{
id};</update>
测试类:
@Test//更新用户public void updateUsernameById(){
Map<String,String> map=new HashMap<String, String>();map.put("name","aa");map.put("id","1");iUserDao.updateName(map);}
执行结果:
删除
IUserDao接口:
//删除用户void deleteUser(int id);
IUserDao.xml:
<!--删除用户--><delete id="deleteUser" parameterType="int">delete from user where id=#{
id};</delete>
测试类:
@Test//删除用户public void deleteUser(){
iUserDao.deleteUser( 2);}
执行结果:
插入
IUserDao接口:
//保存新用户void saveUser(User user);
IUserDao.xml:
<!--保存用户,User类自动生成get和set方法,#{
xxx}中可以直接用属性名--><insert id="saveUser" parameterType="com.cjx.domain.User"><!--返回插入数据的id,order="AFTER",表示插入数据后执行--><selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">select last_insert_id()</selectKey>INSERT into user (username,birthday,sex,address)VALUES (#{
username},#{
birthday},#{
sex},#{
address})</insert>
测试类:
@Test//保存新用户public void saveUser(){
User user=new User(10,"b",null,"g","bbbb");iUserDao.saveUser(user);}
执行结果:
封装实体类作为参数
IUserDao接口:
//将实体类包装起来,并将其属性作为查询条件List<User> findUserByVo(QueryVo vo);
QueryVo 类,封装User类:
package com.cjx.domain;public class QueryVo {
private User user;public User getUser() {
return user;}public void setUser(User user) {
this.user = user;}
}
IUserDao.xml
<!--使用类对象作为parameterType参数进行模糊查询,#{
user.username}其中user是QueryVo的成员变量,而username是User的成员变量--><select id="findUserByVo" parameterType="com.cjx.domain.QueryVo" resultType="com.cjx.domain.User">select * from user where username like #{
user.username}</select>
测试类:
@Test//QueryVo作为参数进行查询public void findUserByVo(){
QueryVo vo=new QueryVo();User user=new User();user.setUsername("%a");vo.setUser(user);List<User>users=iUserDao.findUserByVo(vo);for(User u:users)System.out.println(u);}
执行结果: