- 创建数据表 创建实体类 创建DAO接口,定义操作方法
- dao包中创建StudentDAO接口
public interface SPDao {
int insertShangPing(ShangPing SP);//新增
int deleteShangPing(int id);//删除
boolean updateShangPing(ShangPing SP);//更新
List queryShangPing(String name);//模糊查询
List queryAll();//查询所有
ShangPing queryById(int id);//通过id查
int queryAllInt();//查询所有信息
List selectShangPingByPage(@Param("start") int start,@Param("num") int num);//分页
}
- 创建DAO接口的映射文件
- 在resources目录下新建StudentDaoMapper.xml 在mapper.xml映射文件中定义 StudentDAO接口的方法的SQL
- 将映射文件添加到MyBatis主配置文件
- 测试MyBatis操作数据库
- 创建MyBatis工具类
public class MybatisUtil {
private static SqlSessionFactory factory;
private static final ThreadLocal LOCAL = new ThreadLocal<>();
static {
try {
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//创建工厂的工厂
InputStream inputStream = Resources.getResourceAsStream("mybatis-conf.xml");
//通过流读取配置文件
factory = builder.build(inputStream);
//创建工厂
}catch (IOException e){
e.printStackTrace();
}
}
public static SqlSessionFactory getFactory(){
return factory;
}
public static SqlSession getSession(){ //不给参数默认是false ;手动提交
return getSession(false);
}
public static SqlSession getSession(boolean isAutocommit) {//true :就是自动提交事务
SqlSession session = LOCAL.get();//返回当前线程 默认是null
if (session == null){//创建
session = factory.openSession(isAutocommit);
LOCAL.set(session);//储存当前线程的值
}
return session;//返回当前线程的值
}
public static T getMapper(Class c){ //通过反射返回
SqlSession sqlSession = getSession(true);//设置默认提交
return sqlSession.getMapper(c);
}
}
事务管理
当数据库更新操作执行完成之后自动提交
通过SqlSessionFactory调用openSession获取SqlSession对象时,可以通过参数设置SqlSession自动提交或手动提交:
如果 SqlSession sqlSession = factory.openSession(true),通过此SqlSession对象获取的dao进行数据库操作,都会自动提交;
如果 SqlSession sqlSession = factory.openSession(false),通过此SqlSession对象获取的dao进行数据库操作需要手动提交;
- 单元测试:Test 。在pom.xml导入Junit包
测试Mybatis的jdbc操作
junit junit4.13.1 test
public interface SPDao {
int insertShangPing(ShangPing SP);//新增
int deleteShangPing(int id);//删除
boolean updateShangPing(ShangPing SP);//更新
List queryShangPing(String name);//模糊查询
List queryAll();//查询所有
ShangPing queryById(int id);//通过id查
int queryAllInt();//查询所有信息
List selectShangPingByPage(@Param("start") int start,@Param("num") int num);//分页
}
2.在Mapper写查询语句
查询集合要指定对应数据
3.生成Test代码
@Test
public void queryShangPing() {
List shangPing = spDao.queryShangPing("测");
boolean flag = false;
System.out.println("-------------");
for (ShangPing sp:shangPing
) {
System.out.println(sp);
}
if (shangPing!=null){
flag=true;
assertEquals(true,flag);//assertEquals设置预期状态是true 与实际状态flag对比;
//不同会有报错信息
}
}
4.Test成功就可以写Services代码了
5.模糊查询的Servicestatic SPDao spDao = MybatisUtil.getMapper(SPDao.class);//在当前线程service;获取SPDao的一份实例;每个线程各一份;怎么做到的??在mybatis工具类中指定了当前访问的线程
private static final ThreadLocalLOCAL = new ThreadLocal<>();
5.在servlet获取service方法//模糊查询 public ListqueryShangPing(String name) { List shangPing = spDao.queryShangPing(name); return shangPing; }
6. 由servlet做和前端的交互效果ListshangPings = service.queryShangPing(inputname);
。。。。
- 添加操作的主键回填
| 当我们向数据表添加一条数据时,主键如果使用的自动增长,在很多业务中需要获取生成的主键值,我们可以使用主键回填的方式将插入到数据库中生成的ID返回到参数对象的属性中 |
例如



