mybatis
参考:
https://blog.csdn.net/ITITII/article/details/79969447
http://www.mybatis.cn/archives/706.html
https://blog.csdn.net/mrright_senlypan/category_10650064.html
基础使用jdbc 连接数据库:
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1、加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2、通过驱动管理类获取数据库链接
String url = "jdbc:mysql://localhost:3306/qh_platform";
String user ="root";
String password ="root@123";
connection = DriverManager.getConnection(url, user, password);
//3、定义sql语句 ?表示占位符
String sql = "select * from plan where id = ?";
//4、获取数据库执行对象statement
preparedStatement = connection.prepareStatement(sql);
//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "67");
//6、向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
//7、遍历查询结果集
while(resultSet.next()){
System.out.println(resultSet.getString("id")+" "+resultSet.getString("plan_name"));
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//8、释放资源
if(resultSet!=null){
try {
resultSet.close();//释放结果集
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();//关闭数据库连接
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Mybatis工作原理:
Mybatis核心对象
(1)SqlSession对象,该对象中包含了执行SQL语句的所有方法
(2)Executor接口,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护
(3)MappedStatement对象,该对象是对映射SQL的封装,用于存储要映射的SQL语句的id、参数等信息。
(4)ResultHandler对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。
Mybatis 核心配置文件
① properties(属性): 驱动 账号 密码
② settings(全局设置)
③ typeAliases(类型别名)
④typeHandlers(类型处理器)
⑤objectFactory(对象工厂)
⑥plugins(插件标签)
⑦environments(环境配置)
⑧databaseIDProvider(数据库厂商标识)
⑨Mappers(映射器)
一些面试题 参考:
https://zhuanlan.zhihu.com/p/368838277
答: Dao接口就是常说的Mapper接口, 接口的全限名就是映射文件中的namespace的值,接口的方法名就是映射文件的MappedStatement的id值, 接口方法内的参数,就是传递给sql的参数, Mapper接口没有实现类,当接口被调用时,接口全限名 + 方法名 拼接的字符串可以定位一个MappedStatement
Dao接口中的方法不能重载, 因为时全限名 + 方法名在mapper.xml中查找 xml中id 不能重复 会报错
(namespace 不同 id 可以重复)
xml中的id 为什么不能重复 使用namespace+id是作为Map,MappedStatement>的key使用
Dao接口的工作原理是 JDK的动态代理, Mybatis运行时 会使用JDK动态代理为接口生成代理proxy, 代理对象会拦截接口方法, 转而执行MappendStatement所代表的sql
Mybatis动态sql可以让我们在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签
① if
② where
③ trim
④ set
⑤ foreach
⑥ choose
参考: https://www.cnblogs.com/aeolian/p/9229149.html
分页方式1: 查出所有数据,然后再list中进行分页
分页方式2: sql 分页 使用limit
分页方式3: 拦截器分页, 创建拦截器 拦截mybatis接口方法()
分页方式4: 使用RowBounds对象进行分页(内存分页,只适合数据量小的情况下)
参考: https://www.w3cschool.cn/mybatis/mybatis-xlc73bt4.html
mybatis缓存分为: 一级缓存和二级缓存
一级缓存: sqlsesson缓存, 只在sqlsession内有效(默认开启)
执行(insert、update、delete),并 commit 了,一级缓存会被清空
二级缓存: 是mapper级别的, 也就是同一个namespace的mapper.xml,当多个SqlSession
使用同一个Mapper操作数据库的时候,得到的数据会在二级缓存中存储.(二级缓存默认关闭)