Mybatis工作原理及入门demo
程序员文章站
2022-07-12 22:19:13
...
MyBatis的工作原理
- 读取MyBatis配置文件:mybatis-config.xml 为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。
- 加载映射文件:映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。
-
构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂
SqlSessionFactory
。 - 创建会话对象:由会话工厂创建ssos对象,该对象中包含了执行SQL语句的所有方法。
- Executor 执行器: MyBatis 底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
- MappedStatement 对象:在Executor 接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
- 输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
- 输出结果映射:输出结果类型可以是Map、List 等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
入门程序
添加Mybatis相关的jar包:
创建持久化类:类中声明的属性与数据库中数据表的字段一致。
package gzc.entity;
public class MyUser {
private Integer uid;
private String uname;
private String usex;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
@Override
public String toString() {
return "MyUser [uid=" + uid + ", uname=" + uname + ", usex=" + usex + "]";
}
}
创建映射文件 :这里创建MyUserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace属性绑定dao接口 -->
<mapper namespace="gzc.dao.UserDao">
<!-- 根据uid 查询一个用户信息 -->
<select id="selectUserById" resultType="gzc.entity.MyUser" parameterType="Integer">
select * from myuser where uid = #{uid}
</select>
<!-- 查询全部用户信息 -->
<select id="selectAllUser" resultType="gzc.entity.MyUser">
select * from myuser
</select>
<!-- 添加一个用户 #{uname} 为gzc.entity.MyUser的属性值-->
<insert id="addUser" parameterType="gzc.entity.MyUser">
insert into myuser values(#{uid},#{uname},#{usex})
</insert>
<!-- 修改一个用户 -->
<update id="updateUser" parameterType="gzc.entity.MyUser">
update myuser set uname=#{uname},usex=#{usex} where uid=#{uid}
</update>
<!-- 删除一个用户 -->
<delete id="deleteUser" parameterType="gzc.entity.MyUser">
delete from myuser where uid=#{uid}
</delete>
</mapper>
创建UserDao接口 :
package gzc.dao;
import java.util.List;
import gzc.entity.MyUser;
public interface UserDao {
// 接口定义的方法名与Mapper映射id一致
public MyUser selectUserById(Integer uid);
public List<MyUser> selectAllUser();
public int addUser(MyUser user);
public int updateUser(MyUser user);
public int deleteUser(Integer uid);
}
创建Mybatis核心配置文件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>
<!--利用mybatis自带环境配置数据源,以后和Spring整合后,这部分数据源可以交由Spring 配置处理-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/springtestdb?serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- SQL映射文件的位置-->
<mapper resource="gzc/mapper/MyUserMapper.xml" />
</mappers>
</configuration>
Mybatis 默认使用log4j输出日志信息,为了方便在控制台查看执行的Sql语句,可以在项目根目录下创建其日志文件log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
#将gzc包下所有类型的日志记录级别设置为DEBUG
log4j.logger.gzc=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
创建测试类 :
package gzc.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 gzc.dao.UserDao;
import gzc.entity.MyUser;
public class MybatisTest {
public static void main(String[] args) {
try {
// 读取配置文件mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory ssl = new SqlSessionFactoryBuilder().build(config);
// 通过SqlSessionFactory创建SQLSession对象
SqlSession ss = ssl.openSession();
/*
* 方法一 : SqlSession执行映射文件中定义的sql,并返回映射结果
* gzc.mapper.MyUserMapper.selectUserById为MyUserMapper.xml中的命名空间+SQL语句的id 例如:
* MyUser mu = ss.selectOne("gzc.mapper.MyUserMapper.selectUserById", 6);
*/
/*
* 方法二 : 通过SqlSession对象getMapper方法获得Mapper映射与Dao接口映射
* 该方法需要绑定dao的接口到Mapper的namespace中
*/
// 将dao接口方法与映射文件关联,返回接口对象
UserDao userDao = ss.getMapper(UserDao.class);
// 查询一个用户
MyUser user = userDao.selectUserById(1);
System.out.println(user);
// 添加一个用户
MyUser newUser = new MyUser(8, "小花", "女");
userDao.addUser(newUser);
// 修改一个用户
MyUser updatemu = new MyUser(7, "小明", "男");
userDao.updateUser(updatemu);
// 删除一个用户
userDao.deleteUser(3);
// 查找所有用户
List<MyUser> myUsers = userDao.selectAllUser();
for (MyUser myUser : myUsers) {
System.out.println(myUser);
}
ss.commit();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上一篇: JAVA 知识点汇总
下一篇: caffe 与 tensorflow对比