mybatis是一个基于java的持久层框架。
持久化:数据从瞬时状态变为持久状态。------->主要是在Dao层。
瞬时状态:数据存在于内存当中。
持久状态:数据存在于硬盘、磁盘中。
持久层:完成持久化工作的代码块
mtbatis是一个半自动化的ORM框架:即对象--Object、关系--Relationship、映射--Mapping。
java可以通过Mybatis访问数据库
先直接上项目.
- 创建数据库mybatis,数据表user
里边放两个字段id和name - 根据数据表创建实体类User.java
- 编写mybatis.cfg.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="user.mapper.xml" />
</mappers>
</configuration>
- 编写映射文件user.mapper.xml
用来存放sql语句
<?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属性要和一个接口的全限定名保持一致 -->
<mapper namespace="mybatis.mapper.UserMapper">
<!-- resultMap元素用于定义映射规则 -->
<resultMap type="mybatis.entity.User" id="UserMapper">
<id property="id" column="id" />
<result property="name" column="name" />
</resultMap>
<select id="getUser" resultMap="UserMapper">
select * from user where id = #{id}
</select>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
<insert id="insertUser" parameterType="mybatis.entity.User" useGeneratedKeys="true">
insert into user(id,name) values(#{id},#{name})
</insert>
<update id="updateUser" parameterType="mybatis.entity.User">
update user set name=#{name} where id = #{id}
</update>
</mapper>
- 定义mybatis映射文件(mapper接口)
namespace提到的接口
mapper中定义的方法参数与
user.mapper.xml中parameterType相同
import mybatis.entity.User;
public interface UserMapper {
public User getUser(Integer id);
public int deleteUser(Integer id);
public int insertUser(User user);
public int updateUser(User user);
}
- 编写工具类
工具类中有两个方法
i. 类型为SqlSessionFactory的getSessionFactory()
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
该方法用于返回一个SqlSessionFactory对象
ii. 类型为SqlSession的getSession()
通过 SqlSession 实例来直接执行已映射的 SQL 语句
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.builder.SqlSourceBuilder;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
public static SqlSessionFactory getSessionFactory() throws IOException {
String resource ="mybatis.cfg.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
return sessionFactory;
}
public static SqlSession getSession() throws IOException {
SqlSessionFactory sessionFactory=getSessionFactory();
return sessionFactory.openSession();
}
}
- Test类
我们来看看程序执行过程
首先创建一个SqlSession的对象,这个对象通过工具类的getSession()方法创建
然后这个方法里又创建了一个SqlSessionFactory对象
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
SqlSessionFactoryBuilder可以从xml配置文件中获取SqlSessionFactory的实例
最后返回sessionFactory.openSession()相当于sqlSession对象
然后执行映射的sql语句
public class Test {
public static void main(String[] args) throws IOException {
SqlSession sqlSession = MybatisUtil.getSession();
UserMapper mapper=sqlSession.getMapper(UserMapper.class);
User user=mapper.getUser(1);
System.out.println(user.getId()+" "+user.getName());
}
}
- 要注意的一点
在执行curd时,每个操作都算数据库的一个事务
所以在程序中需要手动提交一遍
session.commit();