项目目录结构:
假设,我们的实体类,或者数据库中的表,字段或者参数过多(而有些字段又非必须的),我们应当考虑使用Map。
- 传递map中的key,直接在sql中取出key即可(没有顺序要求);
- 这种写法不规范,但可以更轻松的解决参数过多的问题。
DeptMapper.xml
insert into dept(deptno,dname,loc) values (#{dno},#{dname},#{dl});
DeptMapper.java
public interface DeptMapper {
int addDept(Map map);
}
SqlMapConfig.xml
测试类:DeptTest.java
@Test
public void addTest() {
// 第一步获得sqlSession对象
SqlSession sqlSession = MybatisUtils.getSession();
// 执行SQL
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Map map = new HashMap();
map.put("dno", 60);
map.put("dname", "国庆完了部");
map.put("dl", "大连");
mapper.addDept(map);
// 提交事务
sqlSession.commit();
// 关闭sqlSession
sqlSession.close();
}
二.模糊查询
- java代码执行的时候,传递通配符
DeptMapper.xml
select * from dept where dname like #{value}
DeptMapper.java
public interface DeptMapper {
List getDeptLike(String value);
}
SqlMapConfig.xml
测试类:DeptTest.java
@Test
public void likeTest() {
// 第一步获得sqlSession对象
SqlSession sqlSession = MybatisUtils.getSession();
// 执行SQL
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
List list = mapper.getDeptLike("%部%");
for (Dept dept : list) {
System.out.println(dept);
}
// 关闭sqlSession
sqlSession.close();
}
- 在sql中传递通配符,使用concat函数
DeptMapper.xml
DeptMapper.java
public interface DeptMapper {
List getDeptLike(String value);
}
SqlMapConfig.xml
测试类:DeptTest.java
@Test
public void likeTest() {
// 第一步获得sqlSession对象
SqlSession sqlSession = MybatisUtils.getSession();
// 执行SQL
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
List list = mapper.getDeptLike("部");
for (Dept dept : list) {
System.out.println(dept);
}
// 关闭sqlSession
sqlSession.close();
}
三.limit分页
DeptMapper.xml
DeptMapper.java
public interface DeptMapper {
List getDeptByLimit(Map map);
}
SqlMapConfig.xml
测试类:DeptTest.java
@Test
public void getDeptByLimit() {
SqlSession sqlSession = MybatisUtils.getSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Map map = new HashMap();
map.put("startIndex", 0);
map.put("pageSize", 6);
List deptByLimit = mapper.getDeptByLimit(map);
sqlSession.close();
}
四.设置自动提交事务
SqlSession session = sessionFactory.openSession(true);//自动提交五.注解
直接在接口上实现sql语句的一种开发方式。
本质:反射机制
底层:动态代理
EmpMapper.java 接口
- 方法只有一个参数时,参数直接写即可
- 方法存在多个参数,所有的参数前面必须加上@param(“empno”)注解
- 基本类型的参数或者String类型,需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略,但是建议加上
public interface EmpMapper {
@Select("select * from emp where empno = #{empno}")
Emp getEmpByEmpno(@Param("empno") int empno);
@Insert("insert into emp(empno,ename,job) values (#{empno},#{ename},#{job})")
int addEmp(Emp emp);
@Update("update emp set ename = #{ename} ,job = #{job} where empno = #{empno}")
int updateEmp(Emp emp);
@Delete("delete from emp where empno = #{empno}")
int deleteEmp(@Param("empno")int empno);
}
SqlMapConfig.xml
需要在核心配置文件中绑定接口
EmpTest.java 测试类
public class EmpTest {
@Test
public void testSelect() {
SqlSession sqlSession = MybatisUtils.getSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = mapper.getEmpByEmpno(7788);
System.out.println(emp.getEname());
sqlSession.close();
}
@Test
public void testInsert() {
SqlSession sqlSession = MybatisUtils.getSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setEmpno(7890);
emp.setEname("7890");
emp.setJob("7890job");
mapper.addEmp(emp);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testUpdate() {
SqlSession sqlSession = MybatisUtils.getSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
Emp emp = new Emp();
emp.setEmpno(7890);
emp.setEname("new7890");
emp.setJob("newjob");
mapper.updateEmp(emp);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDelete() {
SqlSession sqlSession = MybatisUtils.getSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
mapper.deleteEmp(7890);
sqlSession.commit();
sqlSession.close();
}
}



