今天学习了Mybatis的使用,
MyBatis是一个实现了JPA(
Java持久化接口
)规范的用来连接数据库并对其进行增删改查操作的开源框架(连接数据库的框架,与JDBC相似)
详细的Mybatis的资料pick以下链接
:https://blog.youkuaiyun.com/a909301740/article/details/78698682
新建一个Mybatis项目,在WebContent下WEB_INF的lib文件夹下导入如图所示的两个jar包:
在src中新建一个mybatis-config.xml文件,这是Mybatis项目的配置文件,在environment(环境)标签下 完成了与mysql的数据连接:
<environment id="developmet">
<transactionManager type="JDBC"/>
<dataSource type="POOLED"> //数据源采用连接池的方式
//配置文件中的键对应的值
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:
mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false"/
>
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
由于上面的代码格式被笔记编辑过无法显示代码的url,url的value值应该如下编写:
其中&为逻辑运算符,充当and的角色
新建一个User.xml文件,用于实现数据库增删查改分页等方法。在mybatis-config.xml中加入<mappers>,引入Mapper映射文件。
<
mappers
>
<
mapper
resource
=
"com/icss/mapping/user.xml"
/>
</
mappers
>
<mappers>用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件。
定义完增删查改的部分后,准备进入dao层的编写。这里先讲一下如何完成从xml到class函数的实现(表达或许不当,可以借助代码进行理解),导入相对应的包便可。
public
void
testFindUserById() {
//将主配置文件进行解析
String
config
=
"mybatis-config.xml"
;
//用反射机制
InputStream
is
= testMybatis.
class
.getClassLoader().getResourceAsStream(
config
);//或使用Reader read进行读取也是可以的
//得到工厂对象
SqlSessionFactory
factory
=
new
SqlSessionFactoryBuilder().build(
is
);
//从工厂中拿到我们链接在
sqlsession
的对象
SqlSession
sqlsession
=
factory
.openSession();
Object
obj
=
sqlsession
.selectOne(
"getUserById"
, 1);
System.
out
.println(
obj
);
}
如果每一个函数都需要这么一部分代码的话,不但会增加代码的编写量,也会使代码的可读性降低。
所以我们在这里用static的方法将这段代码封装起来。首先我们新建一个SQLSessionUtil.java,在下面编写以下代码
:
package com.icss.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SQLSessionUtil {
private static SqlSessionFactory factory = null;
static Reader read = null;
//静态块,SQLSessionUtil初始化先执行静态块
static {
String config ="mybatis-config.xml";
try {
read = Resources.getResourceAsReader(config);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static SqlSessionFactory getSqlSessionFactory(){
if(factory==null) {
factory = new SqlSessionFactoryBuilder().build(read);
}
return factory;
}
public static SqlSession getSqlSession() {
return getSqlSessionFactory().openSession();
}
}
代码中使用了静态块,当整个SQLSessionUtil'初始化时,先执行静态块的代码,对主配置文件进行解析,用反射机制存入Reader read中。
在getSqlSessionFactory()中先对factory进行判断,若为空则new一个factory。最后在getSqlSession()。
至于使用static的原因是 ,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在。与非static对象不同的是,不需要依赖对象,不需要与对象进行绑定,不需要对象创建变量。具体static的作用可以参考下面的链接进行详读。
关于static和非static变量的区别:https://blog.youkuaiyun.com/a907691592/article/details/51668440
今天就到此结束了,晚安。