一 创建项目的准备工作
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 mapper
PUBLIC "-//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, sal
from emp
</select>
<select id="getEmpById" resultType="com.xja.bean.Emp">
select empno, ename, job, sal
from emp
where empno = #{id}
</select>
<insert id = "addEmp">
insert into emp(ename,job,sal)
values(#{ename},#{job},#{sal})
</insert>
<update id ="setSalById" >
update emp
set 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 student
where stu_name like #{stuName}'%';
</select>
</mapper>