为什么昨天中午做的核酸报告还不出来!
1、使用注解开发的本质是反射,核心是动态代理
反射可以参考我之前的博客 注解和反射
动态代理可以参考 代理模式
mapper中会引用上面的sqlSession,存放我们配置信息,如dataSource等
mapper下的mapperInterface通过反射获取到对应的接口类信息
mapper下的methodCache获取调用方法的信息
2、简单的sql可以使用注解,复杂的还是建议使用xml文件
比如我们需要用到结果集映射,那么使用注解开发就不太合适了
3、Mybatis执行流程(分析一下我创建sqlSession的工具类MybatisUtils和对应源码)
Resource获取全局文件—>实例化sqlSessionFactoryBuilder构造器—>读取配置文件获得sqlSessionFactory实例(XMLConfigBuilder解析配置)—>sqlSessionFactory.openSession()方法获取sqlSession时,将配置传到sqlSession实例中,并创建事务管理器和执行器—>实现CRUD(不成功则回滚)—>提交事务—>关闭
4、注解实现增删查改
我们结合一个demo来做个简单了解
下面是我所建表t_decade_user下的数据
注意:User3这个类的属性名称应该与数据库中的字段名称对应上,因为使用注解无法配置结果集映射,所以可能会导致CRUD出现问题
使用注解做增删改操作时,需要在工具类创建的时候就实现自动提交事务
package com.decade.utils;
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.IOException;
import java.io.InputStream;
/**
* Mybatis工具类
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 使用Mybatis第一步:获取sqlSession
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 既然有了sqlSessionFactory,我们就可以得到sqlSession实例了
// sqlSession完全包含了面向数据库执行sql命令所需要的方法,如果要开启自动提交事务,openSession中设置true即可
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession(true);
}
}
然后我们在接口类中声明相关方法
package com.decade.mapper;
import com.decade.pojo.User3;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserInfoMapper {
@Select("select * from t_decade_user where id = #{userId}")
List<User3> getUserInfo(@Param("userId") String id);
@Insert("insert into t_decade_user(id,name,age,sex) values(#{id},#{name},#{age},#{sex})")
int addUser(User3 user3);
@Update("update t_decade_user set name = #{name},age = #{age} where id = #{id}")
int updateUser(User3 user3);
@Delete("delete from t_decade_user where id = #{uid}")
int deleteUser(@Param("uid") String id);
}
注意:由于我们使用注解开发,没有对应的xml文件了,所以我们在核心配置文件mybatis-config.xml中需要使用映射器接口进行注册,而不是之前的那种使用相对于类路径的资源引用
DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="db.properties">
<property name="username" value="decade"/>
<property name="password" value="11111"/>
properties>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
settings>
<typeAliases>
<typeAlias alias="user3" type="com.decade.pojo.User3"/>
typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
dataSource>
environment>
environments>
<mappers>
<mapper class="com.decade.mapper.UserInfoMapper"/>
mappers>
configuration>
这个是存放数据库信息的配置文件db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/decade_test?useUnicode=true&characterEncoding=UTF-8
username=root
password=root
最后我们写一个测试类进行测试
import com.decade.mapper.UserInfoMapper;
import com.decade.pojo.User3;
import com.decade.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void test() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
// 增加一个004
mapper.addUser(new User3("004", "胡歌", 26, "man"));
// 修改004的年龄
mapper.updateUser(new User3("004", "胡歌", 28, "man"));
// 删除002号
mapper.deleteUser("002");
// 查询005号信息
List<User3> userInfo = mapper.getUserInfo("005");
userInfo.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
}
如有错误,欢迎指正!