闲话
为什么昨天中午做的核酸报告还不出来!
基本要点
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中需要使用映射器接口进行注册,而不是之前的那种使用相对于类路径的资源引用
<?xml version="1.0" encoding="utf-8" ?>
<!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">
<!--驱动配置,com.mysql.jdbc.driver -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!--每一个mapper都需要在核心配置文件中注册-->
<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();
}
}
}
运行结果如下,数据库改动符合预期,信息查询成功
如有错误,欢迎指正!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136773.html