Mybatis应用于Maven开发流程
-
创建数据表
-
创建实体类
-
-
创建DAO接口,定义操作方法
-
dao
包中创建StudentDAO接口
-
public interface SPDao { int insertShangPing(ShangPing SP);//新增 int deleteShangPing(int id);//删除 boolean updateShangPing(ShangPing SP);//更新 List<ShangPing> queryShangPing(String name);//模糊查询 List<ShangPing> queryAll();//查询所有 ShangPing queryById(int id);//通过id查 int queryAllInt();//查询所有信息 List<ShangPing> selectShangPingByPage(@Param("start") int start,@Param("num") int num);//分页 }
-
创建DAO接口的映射文件
-
在resources目录下新建StudentDaoMapper.xml
-
在mapper.xml映射文件中定义 StudentDAO接口的方法的SQL
-
<!--查询所有--> <select id="queryAll" resultType="Utility.ShangPing"> select * from shangcheng </select>
-
将映射文件添加到MyBatis主配置文件
<mappers> <mapper resource="mappers/SPMapper.xml"></mapper> </mappers>
-
测试MyBatis操作数据库
-
创建MyBatis工具类
-
public class MybatisUtil { private static SqlSessionFactory factory; private static final ThreadLocal<SqlSession> 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 extends Object>T getMapper(Class<T> 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包
-
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency>
-
-
测试Mybatis的jdbc操作
1.在dao接口中写 测试方法
public interface SPDao { int insertShangPing(ShangPing SP);//新增 int deleteShangPing(int id);//删除 boolean updateShangPing(ShangPing SP);//更新 List<ShangPing> queryShangPing(String name);//模糊查询 List<ShangPing> queryAll();//查询所有 ShangPing queryById(int id);//通过id查 int queryAllInt();//查询所有信息 List<ShangPing> selectShangPingByPage(@Param("start") int start,@Param("num") int num);//分页 }
2.在Mapper写查询语句
<!--模糊查询--> <select id="queryShangPing" parameterType="String" resultMap="spMap"> select * from shangcheng where name like concat('%',#{name,jdbcType=VARCHAR},'%') </select>
查询集合要指定对应数据
<resultMap id="spMap" type="Utility.ShangPing"> <id column="id" property="id"></id> <result column="name" property="name"></result> <result column="price" property="price"></result> <result column="type" property="type"></result> <result column="datas" property="datas"></result> </resultMap>
3.生成Test代码
@Test public void queryShangPing() { List<ShangPing> 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代码了
static SPDao spDao = MybatisUtil.getMapper(SPDao.class);//在当前线程service;获取SPDao的一份实例;每个线程各一份;怎么做到的??在mybatis工具类中指定了当前访问的线程
private static final ThreadLocal<SqlSession> LOCAL = new ThreadLocal<>();
5.模糊查询的Service
//模糊查询 public List<ShangPing> queryShangPing(String name) { List<ShangPing> shangPing = spDao.queryShangPing(name); return shangPing; }
5.在servlet获取service方法
List<ShangPing> shangPings = service.queryShangPing(inputname);
6. 由servlet做和前端的交互效果
。。。。
-
添加操作的主键回填
当我们向数据表添加一条数据时,主键如果使用的自动增长,在很多业务中需要获取生成的主键值,我们可以使用主键回填的方式将插入到数据库中生成的ID返回到参数对象的属性中 |
例如
<!-- useGeneratedKeys 设置添加操作是否需要回填生成的主键-->
<!-- keyProperty 设置生成的主键回填到参数对象的哪个属性 -->
<insert id="insertBook" useGeneratedKeys="true" keyProperty="bookId">