创建dao层——重中之重
基础sql
先创建一个Mapper接口,再简单的写个增、删、改、查接口
package com.xinxi2.dao; import com.xinxi2.bean.Student; import java.util.List; public interface StudentMapper { List<Student> getList(); int addStudent(Student student); int updateStudent(Student student); int deleteStudentbyId(int id); }
再创建一个Mapper的XML配置文件来实现这个接口
映射规则
mapper标签中的namespace属性映射的是你刚刚创建的Mapper接口,映射的是你刚刚创建的Mapper接口的地址,映射完毕后Mapper接口和MapperXML配置文件的图标会变为一直蓝鸟和一直红鸟如果没有去网上搜索一下,下载一个idea中的Mybatis插件就好了,巨简单,我就不教了。
SpringXMl实现接口
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xinxi2.dao.StudentMapper"> <select id="getList" resultType="com.xinxi2.bean.Student"> SELECT id,name,bigname,riqi,GradeID,age FROM student </select> <insert id="addStudent" parameterType="com.xinxi2.bean.Student" keyProperty="id" keyColumn="id" useGeneratedKeys="true"> insert into student(id,name,bigname,riqi,GradeID,age) values (#{id},#{name},#{bigname},#{riqi},#{gradeid},#{age}) </insert> <update id="updateStudent" parameterType="com.xinxi2.bean.Student"> update student set name=#{name},bigname={bigname},riqi=#{riqi},GradeID=#{gradeid},age=#{age} where id=#{id} </update> <delete id="deleteStudentbyId" parameterType="int"> delete from student where id=#{id} </delete> </mapper>
你们应该也发现了每个标签都有大差不差的属性,下面是我认为常用的一些属性
常用属性
id | (都能用)与namespace接口中对应的方法作的映射 |
parameterType | (都能用)传入的参数格式 |
resultType | (用于查询)返回的数据类型,当返回多个参数的时候,建议使用 resultMap |
resultMap | (用于查询)返回的数据类型,相当于对 resultType的封装。resultType、resultMap两者只能存在一个如果使用resultMap的话要把查询出来的几列数据都要声明一下。 |
基础sql测试
测试的漏洞
在测试之前我们要先把dao层的MapperXML配置文件放在target里面的dao层中
测试时是运行target里面的代码,我们这样写现在是有一点问题因为还没有学spring框架,这样写方便学习(注意)每次编写完一次MapperXML的文件都要复制进来一次
开始测试
package com.xinxi2; import com.xinxi2.bean.Student; import com.xinxi2.dao.StudentMapper; 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 java.io.InputStream; import java.util.Date; import java.util.List; public class Test { public static void main(String[] args) { //声明mybatis配置文件 String resources="mybatis.xml"; InputStream inputStream=null; SqlSessionFactory sqlSessionFactory=null; //获得sqlSession对象 SqlSession sqlSession=null; try { inputStream= Resources.getResourceAsStream(resources); sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); sqlSession=sqlSessionFactory.openSession(); //创建StudentDao层对象 StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class); List<Student> list=studentMapper.getList(); for (Student student:list){ System.out.println(student.getName());//输出name } Student student=new Student(); student.setName("牛牛"); student.setBigname("牛圈"); student.setRiqi(new Date()); student.setGradeid(1); student.setAge(18); studentMapper.addStudent(student); //新镇修改删除都要有提交事务 sqlSession.commit(); //新增后获取的自增id System.out.println(student.getId()); }catch (Exception e){ e.printStackTrace(); }finally { //关闭sqlSession sqlSession.close(); } } }
修改和删除就先省略了,我相信你会
进阶带参sql查询
单参数方式
一个参数的情况下但是两个参数呐?这时候就需要用到我们的@Param()注解了
@Param()注解方式
如果有两个及以上参数并且使用了@Param()注解就不需要parameterType属性了
Map方式
如果使用map方式的话在测试时,要把map当作数组来使用,sql中的#{name}要在创建map键值里要有一个k值是name
实体类方式
上面的三种方式是在特殊的情况下使用,真正常用的是实体类的方式
实体类方式测试
package com.xinxi2; import com.xinxi2.bean.Student; import com.xinxi2.dao.StudentMapper; 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 java.io.InputStream; import java.util.Date; import java.util.List; public class Test { public static void main(String[] args) { //声明mybatis配置文件 String resources="mybatis.xml"; InputStream inputStream=null; SqlSessionFactory sqlSessionFactory=null; //获得sqlSession对象 SqlSession sqlSession=null; try { inputStream= Resources.getResourceAsStream(resources); sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); sqlSession=sqlSessionFactory.openSession(); //创建StudentDao层对象 Student student=new Student(); student.setName("牛牛"); student.setBigname("牛圈"); student.setId(1); StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class); List<Student> list=studentMapper.getListbyStudent(student); for (Student student1:list){ System.out.println(student1.getName());//输出name } }catch (Exception e){ e.printStackTrace(); }finally { //关闭sqlSession sqlSession.close(); } } }