一 创建项目的准备工作
1 添加jar包
MySql.jar .MyBatis.jar
2 在src中配置MyBatis.xml文件
二 封装SqlSession对象
1 SqlSessionFactoryBuilder 生命周期
这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需 要存在了。 因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围 (也就是本地方法变量)。
2 SqlSessionFactory
一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。
3 SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围
和DButil工具类的创建一样,实现对sqlSession连接对象的封装
package com.xja.util;import com.mysql.cj.Session;
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;public class SqlSessionUtil {private SqlSessionUtil(){}private static SqlSessionFactory sqlSessionFactory;static{try(InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");) {sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (Exception e) {e.printStackTrace();}}private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();public static SqlSession getSqlSession(){SqlSession session = threadLocal.get();if (session == null){session = sqlSessionFactory.openSession();threadLocal.set(session);}return session;}public static void closeSqlSession(){try {SqlSession sqlSession = threadLocal.get();if (sqlSession != null){sqlSession.close();}} finally {threadLocal.remove();}}public static void commitSqlSession(){SqlSession sqlSession = threadLocal.get();sqlSession.commit();}public static void rollbackSqlSession(){SqlSession sqlSession = threadLocal.get();sqlSession.rollback();}public static <T>T getMapper(Class<T> type){T mapper = getSqlSession().getMapper(type);return mapper;}}
三 创建数据表及实体类
Emp 表 ,实现类Emp实体类(编号,姓名,职位,工资)
四 创建Mapper接口及Mapper映射xml文档
1 com.xja.mapper
2 Mapper.xml中命名空间与mapper接口同名(包名.接口名)
3 在mybatis.xml中注册mapper.xml文档
4 测试类:
通过sqlSession.getMapper(XXXMapper.class) :返回对应的Mapper接口对象
通过mapper对象调用方法
Mapper接口
package com.xja.mapper;import com.xja.bean.Emp;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface EmpMapper {List<Emp> getAll();Emp getEmpById(Integer id);void addEmp(Emp emp );void setSalById(@Param("sal") Double sal,@Param("empno") Integer empno);
}
mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 命名空间 -->
<mapper namespace="com.xja.mapper.EmpMapper"><select id="getAll" resultType="com.xja.bean.Emp">select empno, ename, job, salfrom emp</select><select id="getEmpById" resultType="com.xja.bean.Emp">select empno, ename, job, salfrom empwhere empno = #{id}</select><insert id = "addEmp">insert into emp(ename,job,sal)values(#{ename},#{job},#{sal})</insert><update id ="setSalById" >update empset sal = #{sal}where empno = #{empno}</update><!-- <update id = "setEmp" parameterType="" useGeneratedKeys="false" >--><!-- update emp set empno = 1--><!-- where empno = #{empno}--><!-- </update>--><!-- <delete id="deleteEmp" parameterType="" databaseId="" >--><!-- delete from emp where empno = 7132--><!-- </delete>--></mapper>
五 参数个数和类型
1 仅有一个参数时(8种包装类或String)
参数名没有要求, 但mapper接口中方法的参数名必须与sql语句中#{名} 一致
2 当参数为实体类的对象时
要求SQL中的#{名} 中的名必须与实体类属性名相同
3 当参数个数多余一个时,
1) 参数列表默认存储到map集合中 [arg1, arg0, param1, param2]
在SQL语句,通过key读, 第一个值: #{arg0} 或#{param1}
2)把方法的参数改为map类型 : Map<String,Object> ,把列名作为key,值作为value
3 )在mapper使用注解 : @Param("名") 与#{名} 名称一致.而方法参数名没有要求
六 : 列名与属性名不对应
1 在SQL语句中,给列名起别名,让别名与属性名一致
2 在mapper映射文件中使用添加标签 : resultMap的标签 ,调协列名与属性名的映射
注意:把查询语句返回类型resultType改为resultMap
<mapper namespace="com.xja.bean.Emp">
<resultMap id = "studentMapper" type = "com.xja.bean.Student"><id column = "stu_id" property = "stuId"></id><result column = "stu_name" property="stuName"></result><result column = "stu_sex" property="stuSex"></result><result column = "stu_age" property="stuAge"></result><result column = "stu_phone" property="stuPhone"></result><result column = "stu_address" property="stuAddress"></result></resultMap><select id="getStuByName" resultMap="studentMapper">select *from studentwhere stu_name like #{stuName}'%';</select>
</mapper>