JavaEE--Mybatis学习笔记(三)--单表的CURD
1.插入后获取id
- 在dao中定义方法
- mapper中写sql语句
<insert id="insertStudentCacheId" parameterType="Student"> insert into student(name,age,score) value(#{name},#{age},#{score}) <selectKey resultType="int" keyProperty="id" order="AFTER"> <!-- order id的生成和insert语句的先后顺序关系 mysql 先执行insert 再写到id的那个字段里 所以生成id放在insert后面 不写 默认根据你的数据库来选择--> select @@identity </selectKey> </insert>
- 实现类中覆写方法
1 @Override 2 public void insertStudentCacheId(Student student) { 3 try { 4 sqlSession = MyBatisUtils.getSqlSession(); 5 6 sqlSession.insert("insertStudentCacheId", student); 7 8 sqlSession.commit(); 9 } finally{ 10 if(sqlSession != null){ 11 //用了close() 就不需要事务的回滚 12 sqlSession.close(); 13 } 14 } 15 16 }
- Test结果
2.删除
- 在dao中定义方法
- mapper中写sql语句
<delete id="deleteStudentById"> delete from student where id = #{ryanxu}<!-- 这里的#{}仅仅是个占位符,里面放什么都可以 --> </delete>
- 实现类中覆写方法
1 @Override 2 public void deleteStudentById(int id) { 3 try { 4 sqlSession = MyBatisUtils.getSqlSession(); 5 6 sqlSession.delete("deleteStudentById", id); 7 8 sqlSession.commit(); 9 } finally{ 10 if(sqlSession != null){ 11 //用了close() 就不需要事务的回滚 12 sqlSession.close(); 13 } 14 } 15 16 }
- Test结果
3.修改
- 在dao中定义方法
- mapper中写sql语句
<update id="updateStudent"> update student set name = #{name},age = #{age},score =#{score} where id = #{id} </update>
- 实现类中覆写方法
1 @Override 2 public void updateStudent(Student student) { 3 try { 4 sqlSession = MyBatisUtils.getSqlSession(); 5 6 sqlSession.delete("updateStudent", student); 7 8 sqlSession.commit(); 9 } finally{ 10 if(sqlSession != null){ 11 //用了close() 就不需要事务的回滚 12 sqlSession.close(); 13 } 14 } 15 16 }
- Test结果
4.查询所有
- 在dao中定义方法
- mapper中写sql语句
<select id="selectAllStudents" resultType="Student"> <!-- 需要定义resultType --> select id,name,age,score from student </select>
- 实现类中覆写方法
1 @Override 2 public List<Student> selectAllStudents() { 3 List<Student> students = new ArrayList<Student>(); 4 try { 5 sqlSession = MyBatisUtils.getSqlSession(); 6 7 students = sqlSession.selectList("selectAllStudents"); 8 } finally{ 9 if(sqlSession != null){ 10 //用了close() 就不需要事务的回滚 11 sqlSession.close(); 12 } 13 } 14 return students; 15 }
根据学习笔记(二) 知道了增删改底层都是调用的update方法 但是查询就不需要调用update方法了,所以可以把sqlSession.submit()去掉
- Test结果
5.查询返回Map
- 在dao中定义方法
- mapper中写sql语句
<select id="selectAllStudents" resultType="Student"><!-- 需要定义resultType --> select id,name,age,score from student </select>
- 实现类中覆写方法
1 @Override 2 public Map<String, Object> selectAllStudentsMap() { 3 Map<String, Object> map = new HashMap<String, Object>(); 4 try { 5 sqlSession = MyBatisUtils.getSqlSession(); 6 map = sqlSession.selectMap("selectAllStudents", "name"); /*mapKey写的是查询出来的对象的属性 name score age这样的*/ 7 } finally{ 8 if(sqlSession != null){ 9 //用了close() 就不需要事务的回滚 10 sqlSession.close(); 11 } 12 } 13 return map; 14 }
- Test结果
Test中 先写dao.selectAllStudentsMap() 再选中按 Alt + Shift + L 生成extract local variable
6.根据id来查询
- 在dao中定义方法
- mapper中写sql语句
<select id="selectById" resultType="Student"> select id,name,age,score from student where id = #{ryanxu} </select>
- 实现类中覆写方法
1 @Override 2 public Student selectStudentById(int id) { 3 Student student = null; 4 try { 5 sqlSession = MyBatisUtils.getSqlSession(); 6 student = sqlSession.selectOne("selectById", id); 7 } finally{ 8 if(sqlSession != null){ 9 //用了close() 就不需要事务的回滚 10 sqlSession.close(); 11 } 12 } 13 return student; 14 }
- Test结果
7.模糊查询
- 在dao中定义方法
- mapper中写sql语句
<select id ="selectByName" resultType="Student"> <!-- select id,name,age,score from student where name like concat('%',#{ryanxu},'%') --> <!-- select id,name,age,score from student where name like '%${value}%' --> select id,name,age,score from student where name like '%' #{ryanxu} '%' </select>
- 实现类中覆写方法
1 @Override 2 public List<Student> selectStudentsByName(String name) { 3 List<Student> students = null; 4 try { 5 sqlSession = MyBatisUtils.getSqlSession(); 6 7 students = sqlSession.selectList("selectByName",name); 8 } finally{ 9 if(sqlSession != null){ 10 //用了close() 就不需要事务的回滚 11 sqlSession.close(); 12 } 13 } 14 return students; 15 }
- Test结果
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
回顾学习笔记(一)(二)(三)
- 三层架构
- 工作原理
- 源码分析
- 主要使用的是SqlSession<--SqlSessionFactory.openSession<--SqlSessionFactoryBuilder.build("主配置文件").
- openSession() 无参的autocommit 是false的
- 输入流是由build方法里有关闭
- 增删改底层实际上是update
- openSession的底层是对一些变量进行初始化 配置文件、执行器、自动提交、dirty
- 增删改的第一句话都是将dirty设置为true,同时也是对事物的提交,提交完就将dirty设为false
- 没有提交,中间发生异常,发生回滚,通过SqlSession 的 close来实现的
- * >=0 ; +>=1 ; ?<=1 ; 无符号就是1有且只有1 选中标签按F2就可以查看标签了
- 映射文件:
- 里的根标签<mapper> 里的<namespace> 就相当于人名里的姓 id 就相当于名
- 增删改 可以传参数过来 parameterType ="..."
- 查询 resultType 不能省 封装成什么对象 查询的是id,name,age,score 返回的是个对象
- 主配置文件:
- properties jdbc连接四要素属性文件
- typeAliases 别名 <package name="com.ryanxu.beans"/>
- environments-->environment 包括jdbc属性文件
- 事务管理器
- 数据源 一般使用的是连接池技术
- 注册映射文件