
一、mybatis执行流程对象作用线程安全SqlSessionFactory会话工厂创建SqlSession线程安全全局单例SqlSession数据库会话执行 SQL、事务控制非线程安全每次操作新建Mapper代理对象执行 SQL 的接口代理非线程安全依赖SqlSession1.1核心执行流程读取配置文件MyBatis 首先会加载核心配置文件sqlMapConfig.xml/mybatis-config.xml和所有 Mapper 映射文件。核心配置文件包含数据库连接信息、环境配置、事务管理器、类型别名等全局设置。Mapper 映射文件包含具体的 SQL 语句、参数映射、结果映射规则。构建SqlSessionFactory对象这一步是 MyBatis 的初始化阶段会解析配置文件并构建SqlSessionFactory。SqlSessionFactory是 MyBatis 的核心工厂对象全局单例负责创建SqlSession。它内部维护了数据库连接池、配置元信息是线程安全的。创建SqlSession对象通过SqlSessionFactory打开会话创建SqlSession。SqlSession是 MyBatis 与数据库交互的会话对象非线程安全每次数据库操作都应创建新实例。它封装了数据库连接、事务控制、SQL 执行的核心方法。获取 Mapper 代理对象图中多个mapper指向SqlSession代表通过SqlSession.getMapper(xxxMapper.class)获取 Mapper 接口的代理对象。这个代理对象由 MyBatis 动态生成实现了 Mapper 接口的所有方法会自动关联对应的 SQL 语句。这是 MyBatis 推荐的操作方式替代了传统的selectOne/insert等方法。执行数据库操作通过 Mapper 代理对象调用方法MyBatis 会执行以下操作封装 SQL 参数执行预编译 SQL处理结果集映射将数据库记录转为 Java 对象管理事务提交 / 回滚最终与数据库完成交互实现增删改查操作。sqlsession可以实现JDBC的connection以及mysql执行本质操作数据库mybatis实现目前是mapper接口xml映射二、mybatis关联映射把数据库表之间的关系 → 映射成 Java 对象之间的关系关系标签作用多对一 / 一对一association关联单个对象一对多collection关联集合对象查单个对象多对一 / 一对一→ 用association查集合对象一对多→ 用collection三、注解开发把原来写在 Mapper.xml 里的 SQL直接写在 DAO 接口的方法上面不用 XML 文件步骤 1DAO 接口上直接写 SQL重点直接在DAO 接口的方法上加注解写 SQL 就行。1. 查询Selectpublic interface UserDao { // 查询所有用户 Select(select * from user) ListUser findAll(); }2. 新增Insert// 新增用户 Insert(insert into user(name,age) values(#{name},#{age})) int addUser(User user);3. 修改Update// 修改用户 Update(update user set name#{name} where id#{id}) int updateUser(User user);4. 删除Delete// 删除用户 Delete(delete from user where id#{id}) int deleteUser(int id);步骤 2MyBatis 核心配置文件中注册 DAO 接口在sqlMapConfig.xml中直接注册 DAO 接口mappers !-- 注解开发直接写接口全类名 -- mapper classcom.qcby.dao.UserDao/ /mappers步骤 3测试调用和之前一样UserDao userDao session.getMapper(UserDao.class); ListUser list userDao.findAll(); // 直接调用关联映射多对一用Results Result代替 XMLSelect(select u.*, d.id dept_id, d.name dept_name from user u left join dept d on u.dept_idd.id) Results({ Result(property id, column id), Result(property name, column name), // 关联对象property实体类属性, javaType类型, column外键列 Result(property dept, javaType Dept.class, column dept_id, one One(select com.qcby.dao.DeptDao.findById)) }) ListUser findUserWithDept(); 对比的是对象Userdaopackage com.qcby.dao; import com.qcby.entity.User; import org.apache.ibatis.annotations.*; import javax.jws.soap.SOAPBinding; import java.util.List; public interface UserDao { //查询所有 Select(select * from user) Results(iduserMap,value { Result(property id,column id), Result(property username,column username), Result(property birthday,column birthday), Result(property sex,column sex), Result(property address,column address) }) public ListUser findAll(); //通过ID查询 Select(select * from user where id #{id}) ResultMap(value userMap) public User findById(int id); //增加 Insert(insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})) SelectKey(statementselect last_insert_id(),keyColumn id,keyProperty id,before false,resultType Integer.class) public int insert(User user); //更新 Update(update user set username #{username},birthday #{birthday},sex #{sex},address #{address} where id #{id}) public int update(User user); //删除 Delete(delete from user where id #{id}) public int delete(int id); //查询数量 Select(select count(*) from user) public int findCount(); //模糊查询 Select(select * from user where username like concat(%,#{username},%)) public ListUser findByName(String username); }testimport com.qcby.dao.UserDao; import com.qcby.entity.User; 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 org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.sql.Date; import java.util.List; public class UserTest { private InputStream in null; private SqlSession session null; private UserDao mapper null; Before public void init() throws IOException { in Resources.getResourceAsStream(SqlMapConfig.xml); SqlSessionFactory factory new SqlSessionFactoryBuilder().build(in); session factory.openSession(); mapper session.getMapper(UserDao.class); } After public void destory() throws IOException { session.close(); in.close(); } Test public void findAll() throws IOException { ListUser users mapper.findAll(); for (User user:users) { System.out.println(user); } } Test public void findById(){ User user mapper.findById(4); System.out.println(user); } // 这里修复了日期 Test public void insert(){ User user new User(); user.setSex(女); user.setUsername(小美); // 正确写法 user.setBirthday(new Date(System.currentTimeMillis())); user.setAddress(保定); int insert mapper.insert(user); session.commit(); System.out.println(插入成功 insert); } // 这里修复了日期 Test public void update(){ User user new User(); user.setId(22); user.setSex(女); user.setUsername(小美); // 正确写法 user.setBirthday(new Date(System.currentTimeMillis())); user.setAddress(上海); int insert mapper.update(user); session.commit(); System.out.println(修改成功 insert); } Test public void delete(){ int delete mapper.delete(22); session.commit(); System.out.println(删除成功 delete); } Test public void findCount(){ int count mapper.findCount(); System.out.println(总记录数 count); } Test public void findByName(){ ListUser list mapper.findByName(小); for (User user : list) { System.out.println(user); } } }