1.配置加载
xml配置Java代码注解mybatis将sql的配置信息加载成为一个个的mapped Statement的对象(包含了传入的参数映射配置、执行的SQL语句、结果映射配置)并将 其存储到内存中SQL解析
当api接口层接受到调用时,会接受到传入的SQL的id和传入对象(可以是map/JavaBean或者基本数据类型),mybatis根据id找到对应的mapped Statement对象,并且根据传入的参数对其进行解析,解析后可以得到最终要执行的SQL语句和参数SQL执行
把解析出的SQL语句和参数拿到数据库执行,得到操作数据库的结果结果映射
将操作数据库的结果按照映射的配置进行转换(可以转换hashmap/JavaBean或基本数据类型),并将最终结果返回1、主配置文件:指定数据库的连接信息以及设置框架的相关参数。
2、关联映射文件:用于定义SQL语句及相关映射信息。
在使用SqlSession的selectList()方法时,指定一个分页参数器 RowBounds;
分页参数器的构造器RowBounds(offset,pageSize);
Offset: 抓取记录的起始位置;
pageSize: 指定的每页显示的记录数;
创建maven项目完成后,配置pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qst</groupId> <artifactId>mybatisMaven</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> </dependencies> <!-- 配置 maven 项目的jdk版本 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>添加相关配置文件
把文件mybatis-config.xml放在src/main/resouces下面
把文件EmpMapper.xml放在你所用的实体类下面
- 修改mybatis-config.xml - 使用EmpMapper.xml
dao方法
public List<Emp> findEmpByNAndS(Map map){ SqlSession session=MyUtil.getSqlSession(); List<Emp>emps=session.selectList("findEmpByNameAndSalary", map); session.close(); return emps; }主方法
Map map=new HashMap(); map.put("name","文琴麻麻" ); map.put("salary", 10000); List<Emp> emps=dao.findEmpByNAndS(map); System.out.println(emps);Mapper.xml
使用resultMap解决 <mapper namespace="/"> <!-- 根据id查找对应的员工信息 --> <select id="selectEmpId" parameterType="int" resultMap="empMap"> select * from t_emp where id=#{id} </select> <resultMap type="com.qst.pojo.Emp2" id="empMap"> <result property="addr" column="address"/> </resultMap> </mapper>dao方法
public Emp2 findEmp(int id){ SqlSession session=MyUtil.getSqlSession(); Emp2 emp=session.selectOne("selectEmpId", id); session.close(); return emp; }测试结果
//JavaBean属性与字段不一致的映射 EmpDao2 ed=new EmpDao2(); Emp2 emp2=ed.findEmp(3); System.out.println(emp2);Mapper.xml
<!-- 真分页实现员工信息列表查询 --> <select id="findPages" parameterType="map" resultType="com.qst.pojo.Emp"> select * from t_emp limit #{offset},#{pageSize} </select>dao
//真分页查询 public List<Emp> findPages(int page,int pageSize){ SqlSession session=MyUtil.getSqlSession(); Map map=new HashMap(); map.put("offset",(page-1)*pageSize); map.put("pageSize", pageSize); List<Emp>emps=session.selectList("findPages", map); return emps; }测试
//真分页 List<Emp>emps=dao.findPages(1, 2); System.out.println(emps);Mapper.xml
<!-- 使用JavaBean实现分页 --> <select id="findPages" parameterType="com.qst.pojo.EmpBean" resultType="com.qst.pojo.Emp"> select * from t_emp limit #{offset},#{pageSize} </select>dao
//使用JavaBean实现真分页 public List<Emp> findPages(int page,int pageSize){ SqlSession session=DBUtil.getSqlSession(); EmpBean eb=new EmpBean(); eb.setPage(page); eb.setPageSize(pageSize); List<Emp>emps=session.selectList("findPages", eb); return emps; }测试
List<Emp>emps=ed.findPages(3, 2); System.out.println(emps);Mapper.xml
<!-- 假分页 --> <select id="findAll2" resultType="com.qst.pojo.Emp"> select * from t_emp </select>dao
//假分页 public List<Emp> findEmps1(int page,int pageSize){ SqlSession session=MyUtil.getSqlSession(); RowBounds rb=new RowBounds((page-1)*pageSize,pageSize); List<Emp>emps=session.selectList("findAll2",null,rb); session.close(); return emps; }main
//假分页 List<Emp>emps=dao.findEmps1(2, 2); System.out.println(emps);Mapper.xml
useGeneratedKeys:是否要主键回显keyProperty:要回显的主键 <!-- 员工信息添加,主键的回显 --> <insert id="addEmpInfo" parameterType="com.qst.pojo.Emp" keyProperty="id" useGeneratedKeys="true"> insert into t_emp(name,sex,salary,address)values(#{name},#{sex},#{salary},#{address}) </insert>dao
//插入员工信息,主键回显 public void addEmpInfo(Emp emp){ SqlSession session=MyUtil.getSqlSession(); session.insert("addEmpInfo", emp); session.commit(); session.close(); }测试
emp.setName("唐漂亮"); emp.setSex("女"); emp.setSalary(10000); emp.setAddress("湖南"); dao.addEmpInfo(emp); System.out.println("获取到回显的id="+emp.getId());if元素:是简单的条件判断逻辑,满足条件时追加if元素内的SQL,不满足条件时不追加
<select id="askEmp" parameterType="map" resultType="com.qst.pojo.Emp"> select * from t_emp where 1=1 <if test="name!=null and name!=''"> and name=#{name} </if> <!-- ps:使用and连接 --> <if test="address!=null and address!=''"> and address=#{address} </if> </select> //if元素的应用 public List<Emp> askEmp(String name,String address){ SqlSession session=MyUtil.getSqlSession(); Map map=new HashMap(); map.put("name", name); map.put("address", address); List<Emp> emps=session.selectList("askEmp", map); session.close(); return emps; } public static void main(String[] args) { Emp emp = new Emp(); EmpDao dao = new EmpDao(); List<Emp> emps=dao.askEmp3("丁丁", ""); System.out.println(emps); }choose元素:类似if else语句
<!--choose的应用 --> <select id="askEmp2" parameterType="map" resultType="com.qst.pojo.Emp"> select * from t_emp <choose> <when test="name!=null and name!=''"> where name=#{name} </when> <when test="address!=null and address!=''"> where address=#{address} </when> <otherwise> where salary>1000 </otherwise> </choose> //choose元素的应用 public List<Emp> askEmp2(String name,String address){ SqlSession session=MyUtil.getSqlSession(); Map map=new HashMap(); map.put("name", name); map.put("address", address); List<Emp> emps=session.selectList("askEmp2", map); return emps; }trim元素
可以在自己包含的内容前面加上某些前缀,也可以在其后加上某些后缀,与之对应属性prefix和suffix
可以把包含内容的某些首部过滤掉也就是忽略,也可以把包含内容的某些尾部过滤掉,对应设置属性prefixOverrides和suffix Overrides
<!-- trim元素的where应用 --> <select id="askEmp3" parameterType="map" resultType="com.qst.pojo.Emp"> select * from t_emp <trim prefix="where" prefixOverrides="and|or"> <if test="name!=null and name!=''"> and name=#{name} </if> <!-- ps:使用and连接 --> <if test="address!=null and address!=''"> and address=#{address} </if> </trim> </select> //trim元素应用,dao里面的方法 public List<Emp> askEmp3(String name,String address){ SqlSession session=MyUtil.getSqlSession(); Map map=new HashMap(); map.put("name", name); map.put("address", address); List<Emp> emps=session.selectList("askEmp3", map); return emps; } <!-- trim元素的set应用 --> <update id="askEmp_set" parameterType="com.qst.pojo.Emp" > update t_emp <trim prefix="set" suffixOverrides=","> <if test="name!=null and name!=''"> name=#{name}, </if> <if test="address!=null and address!=''"> address=#{address} </if> </trim> where id=#{id} </update> //trim元素的set应用 public void changeEmp(Emp emp){ SqlSession session=MyUtil.getSqlSession(); session.update("askEmp_set", emp); session.commit(); session.close(); }where元素
<!-- where元素应用 --> <select id="whereEmp" parameterType="map" resultType="com.qst.pojo.Emp"> select * from t_emp <where> <if test="name!=null and name!=''"> name=#{name} </if> <if test="address!=null and address!=''"> and address=#{address} </if> </where> </select> //where元素的应用,dao里面的方法 public List<Emp> whereEmp(String name,String address){ SqlSession session=MyUtil.getSqlSession(); Map map=new HashMap(); map.put("name", name); map.put("address", address); List<Emp> emps=session.selectList("whereEmp", map); return emps; }set元素
<!-- set元素的应用 --> <update id="setEmp" parameterType="com.qst.pojo.Emp"> update t_emp <set> <if test="name!=null and name!=''"> name=#{name}, </if> <if test="address!=null and address!=''"> address=#{address} </if> </set> where id=#{id} </update> //set元素的应用 public void changeEmp2(Emp emp){ SqlSession session=MyUtil.getSqlSession(); session.update("setEmp", emp); session.commit(); session.close(); }foreach实现了循环逻辑,可以进行一个集合迭代,主要用于构建in条件中
<!-- foreach元素的使用,批量查询 --> <select id="foreachEmp" parameterType="com.qst.pojo.Emp" resultType="com.qst.pojo.Emp"> select * from t_emp where id in <foreach collection="arr" item="arr" open="(" separator="," close=")"> #{arr} </foreach> </select> <!-- foreach元素的使用,批量删除 --> <delete id="forEmpDel" parameterType="com.qst.pojo.Emp" > delete from t_emp where id in <foreach collection="arr" item="arr" open="(" separator="," close=")"> #{arr} </foreach> </delete> //foreach批量查询 public List<Emp> foreachEmp(int[] arrs) { SqlSession session=MyUtil.getSqlSession(); Emp e=new Emp(); e.setArr(arrs); List<Emp> emp=session.selectList("foreachEmp",e); session.close(); return emp; } //foreach批量删除 public void forEmpDel(int[] arrs){ SqlSession session=MyUtil.getSqlSession(); Emp e=new Emp(); e.setArr(arrs); session.delete("forEmpDel",e); session.commit(); System.out.println("删除成功"); session.close(); } public static void main(String[] args) { Emp emp = new Emp(); EmpDao dao = new EmpDao(); //foreach批量查询 int arr[]={2,4,7}; List<Emp> emps=dao.foreachEmp(arr); System.out.println(emps);*/ //foreach批量删除 int arrs[]={2,16,17}; dao.forEmpDel(arrs); }(1)、创建接口
public interface EmpMapper { public List<Emp> findAll();//该方法名和mapper.xml的id名称必须一致 }(2)、获取映射对象
public class MapperFactory { public static EmpMapper getEmpMapper(){ SqlSession session=MyUtil.getSqlSession(); //获取映射器对象 EmpMapper mapper=session.getMapper(EmpMapper.class); return mapper; } }(3)、测试
ps:进行测试之前,要记得把namespace里的路径改成你创建的接口路径
<mapper namespace="com.qst.dao.EmpMapper"> public class Test1 { public static void main(String[] args) { EmpMapper em=MapperFactory.getEmpMapper(); List<Emp> emps=em.findAll(); System.out.println(emps); } }