关于Mybatis的简介
什么是mybatis
MyBatis前身叫ibatis是基于Java的数据持久层框架,它内部封装了JDBC,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。MyBatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中SQL的动态参数进行映射生成最终执行的SQL语句,最后由MyBatis框架执行SQL并将结果映射为Java对象并返回。MyBatis 的本质就是 Java 对数据库的操作。
MyBatis的生命周期?
(1)加载mybatis的配置文件—>config.xml(也加载关联的映射文件—>mapping.xml)
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
1
(2)构建SqlSessionFactory工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
1
SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用。 SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后它就失去了作用,所以SqlSessionFactoryBuilder 不需要长期存在,只作用于创建 SqlSessionFactory 的方法中即可。
(3)创建能执行映射文件的SqlSession
SqlSession sqlSession = factory.openSession();
1
SqlSession 应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库
资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally…语句来保证其正确关闭。
(4)创建 SQL Mapper 接口,执行sqlSession.insert等方法
User user = new User("李四", "qqq");
sqlSession.insert("com.mybatis.pojo.User.add", user);
sqlSession.commit(); // 事务提交
sqlSession.close(); // 关闭
SQL Mapper 接口由 SqlSession 所创建,它的生命周期应该小于等于 SqlSession 的生命周期。 Mapper 代表的是一个请求中的业务处理 ,所以它应该在一个请求中,一旦处理完了相关的业务,就应该废弃它。
Dao接口的工作原理是什么?
Dao 接口,就是人们常说的 Mapper 接口,接口的全限名,就是映射文件中的 namespace的值,接口的方法名,就是映射。
文件中 MappedStatement 的 id 值,接口方法内的参数,就是传递给 sql 的参数。Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个 MappedStatement。
在 Mybatis 中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个 MappedStatement 对象。
Dao 接口里的方法参数不同时能重载吗?
不能重载的,因为是全限名+方法名的保存和寻找策略。
Dao 接口的工作原理是 JDK 动态代理,Mybatis 运行时会使用 JDK 动态代理为 Dao接 口 生 成 代 理 proxy 对 象 , 代 理 对 象 proxy 会 拦 截 接 口 方 法 , 转 而 执 行MappedStatement 所代表的 sql,然后将 sql 执行结果返回。
Mybatis书写增删查代码:
增:



运行后


删除


userDao.delete(uid: ___)表示想要删除的行数id

运行后;

单查




修改数据库中的表:

修改前:

修改后:

sql语句:
<update id="update" parameterType="com.zhu.bean.User">
update t_user set username=#{username},password=#{password},phone=#{phone},address=#{address} where uid=#{uid}
</update>
Mybatis的用处就是为了能够是写代码方便一些;以下代码可以完成整个数据库的连接
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"" target="_blank">http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置环境信息===就是配置连接数据库的参数
default:指定配置的环境信息的id,表示默认连接该环境
-->
<environments default="mysql">
<environment id="mysql">
<!--配置事务的处理方式:模式使用JDBC的事务处理-->
<transactionManager type="jdbc"></transactionManager>
<!--数据源的默认type设置为pooled,表示使用连接池-->
<dataSource type="pooled">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
<property name="username" value="0000"/>
<property name="password" value="0000"/>
</dataSource>
</environment>
<environment id="oracle">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
<!--加载mapper配置文件-->
<mappers>
<mapper class="com.zhu.dao.UserDao" />
</mappers>
</configuration>
书写sql语句方可查询想要的数据
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"" target="_blank">http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace:把配置文件和接口进行映射-->
<mapper namespace="com.zgz.dao.usedao">
<!--通过select标签进行查询
id:映射接口的方法名
parameterType:指定参数的类型(如果是集合类型只需要指定集合元素的类型即可)
resultType:指定返回值的类型
-->
<select id="selectAll" resultType="com.zgz.bean.Use">
select * from emp;
</select>
<insert id="add" parameterType="com.zgz.bean.Use">
insert into emp(eid,ename,dept,job,sal,phone,address) values(#{eid},#{ename},#{dept},#{job},#{sal},#{phone},#{address});
</insert>
<delete id="delete" parameterType="int">
delete from emp where eid#{eid}
</delete>
<select id="selectByid" parameterType="int" resultType="com.zgz.bean.Use">
select * from emp where eid=#{eid}
</select>
</mapper>