package com.wzh.dao;
import com.wzh.entity.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserDao {
public List findAll();
public User findOne(int id);
public int insert(User user);
public int delete(int id);
public int update(User user);
public User findByNameAndPwd(@Param("username") String username,@Param("password") String password);
}
(2)创建映射文件
insert into t_user values(null,#{username},#{password},#{relname})
delete from t_user where id=#{id}
update t_user set username=#{username},password=#{password},relname=#{relname} where id=#{id}
注意: namespace必须和dao接口一样,而且标签的id必须和你接口的方法名一样。
(3)测试
import com.wzh.dao.UserDao;
import com.wzh.entity.User;
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 org.junit.Test;
import java.io.Reader;
import java.util.List;
public class Test01 {
@Test
public void testFindAll() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class); //获取相应接口的代理对象
List list = userDao.findAll();
System.out.println(list);
session.commit();
session.close();
}
@Test
public void testFindOne() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);//获取相应接口的代理对象
User user = userDao.findOne(1);
System.out.println(user);
session.commit();
session.close();
}
@Test
public void testInsert() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = new User("wzh", "123456", "王振华");
System.out.println(user);
int row = userDao.insert(user);
System.out.println(user);
session.commit();
session.close();
}
@Test
public void testDelete() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
int row = userDao.delete(84);
System.out.println(row);
session.commit();
session.close();
}
@Test
public void testUpdate() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
int row = userDao.update(new User(76,"wzh", "123456", "王振华"));
System.out.println(row);
session.commit();
session.close();
}
@Test
public void testFindByNameAndPwd() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.findByNameAndPwd("wzh", "123456");
System.out.println(user);
session.commit();
session.close();
}
}
常见的bug
(1)namespace和接口名不对应。 xml文件没有注册到mybatis配置文件中
(2)映射文件中的标签id和接口中方法名不对应
1.2.安装mybatis插件
作用: 检查dao和映射文件是否匹配
二者有一即可
2.传递多个参数
我们在dao接口中某些方法可能需要传递多个参数,譬如: 登录(username,password)
我们需要在参数处使用@Param()为参数起名。
3.添加时如何返回递增的主键值。
需要返回添加数据库后的id值。
@Test
public void testInsert() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = new User("wzh", "123456", "王振华");
System.out.println(user); //id=null
int row = userDao.insert(user);
System.out.println(user); //id有值
session.commit();
session.close();
}
4.解决字段名与实体类属性名不相同的冲突
问题: 查询时返回一个null,或者某个列没有值
可以有两种解决办法:
第一种: 为查询的列起别名,而别名和属性名一致。
select stu_id stuId,stu_name stuName,stu_sex stuSex,stu_age stuAge,stu_salary stuSalary from student
第二种: 使用resultMap完成列和属性之间的映射关系。
select * from student
resultMap的id必须和select里的resultMap一致
如果列名和属性名有些一致的,可以在resultMap中不写映射关系,不需要全部都写,不一致的写就行
5. 动态sql
5.1什么是动态sql
根据参数的值,判断sql的条件。
name!=null address!=null select * from 表名 where name=#{name} and address=#{address} name==null select * from 表名 where address=#{address}
5.2.为什么要使用动态sql
5.3.mybatis中动态sql标签有哪些
5.3.1.if标签--单条件判断
//如果stuAge不为null则按照stuAge查询 如果为null则查询所有
public interface StudentDao {
public List findAll();
public List findByCondition(@Param("stuName") String stuName,@Param("stuAge") Integer stuAge,@Param("stuSalary") Double stuSalary);
}
StudentMapper.xml:
select * from student where 1=1
and stu_name=#{stuName}
and stu_age=#{stuAge}
and stu_salary=#{stuSalary}
测试:
@Test
public void testFindCondition() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
StudentDao studentDao = session.getMapper(StudentDao.class);
List list = studentDao.findByCondition( null,null, null);
System.out.println(list);
session.commit();
session.close();
}