1.MyBatis是什么?
MyBatis是一个框架,是一个持久层框架,又称为ORM框架。
什么是持久层呢?我的理解是把数据保存、存储起来的操作,就是直接操作数据库的。
ORM,Object Relational Mapping,对象关系映射。对象好比如Java实体类,关系就比如数据库的关系。意思就是我们对持久化对象进行的操作(CRUD等),ORM框架会将这些操作映射到对数据库的操作,也就是框架代替我们写了原始的操作数据库的代码,不再需要我们每次都自己去加载驱动、创建数据库连接等等工作。
2.MyBatis的工作原理
(1)读取MyBatis的主配置文件,获取数据库连接,加载映射文件。
(2)构建SqlSessionFactory会话工厂,并且使用工厂生产SqlSession会话对象。
(3)使用会话对象创建Dao接口的代理对象。
(4)使用代理对象来调用接口方法。
(5)处理结果集。
(6)释放资源。
3.MyBatis实现CRUD
我使用的环境:IDEA2018+jdk1.8+maven3.6.1
(1)创建maven项目,导入mybatis,mysql,Junit等相关依赖。
(2)创建实体类以及用户持久层接口
/**
* 用户实体类
*/
public class User implements Serializable {
private Integer userId;
private String userName;
private String userSex;
private Integer userAge;
// getter setter toString()省略
}
/**
* 用户持久层接口
*/
public interface UserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
/**
* 新增一个用户
*/
void insertOne(User user);
/**
* 修改用户
* @param user
*/
void updateUser(User user);
/**
* 根据id删除用户
* @param id
*/
void deleteUserById(Integer id);
}
(3)创建MyBatis主配置文件mybatisConfig.propeties(名字可以自取)
<?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">
<!-- mybatis主配置文件 -->
<configuration>
<!-- 读取配置JDBC连接参数的文件 -->
<properties resource="jdbcConfig.properties"></properties>
<!-- 为实体类起别名 -->
<typeAliases>
<package name="com.jodi.domain"></package>
</typeAliases>
<!-- 配置环境 -->
<environments default="mysql">
<environment id="mysql">
<!-- 配置JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接池 -->
<dataSource type="POOLED">
<!-- 配置连接参数 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<!-- 配置映射文件的位置 -->
<mappers>
<mapper resource="com/jodi/dao/UserDao.xml" />
</mappers>
</configuration>
(4)创建持久层接口的映射文件UserDao.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指定接口 -->
<mapper namespace="com.jodi.dao.UserDao">
<!-- 配置resultMap 用于解决实体类属性和数据库字段不一致的问题-->
<resultMap id="userMap" type="user">
<!-- 主键字段的对应 -->
<id property="userId" column="id" />
<!-- 非主键字段的对应 propertry(实体类属性) column(数据库字段) -->
<result property="userName" column="name" />
<result property="userSex" column="gender" />
<result property="userAge" column="age" />
</resultMap>
<!-- 查询所有 -->
<!-- <select id="findAll" resultType="com.jodi.domain.User"> -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
<!-- 新增一个用户 -->
<insert id="insertOne" parameterType="com.jodi.domain.User" >
<!-- 获取新增的id -->
<selectKey keyProperty="id" keyColumn="id" resultType="java.lang.Integer" order="AFTER">
select last_insert_id()
</selectKey>
insert into user (name, gender, age) values (#{name}, #{gender}, #{age})
</insert>
<!-- 修改用户 -->
<update id="updateUser" parameterType="com.jodi.domain.User" >
update user set gender = #{gender} where id = #{id}
</update>
<!-- 根据id删除用户 -->
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete from user where id = #{id}
</delete>
</mapper>
(5)编写测试类
public class Testmybatis {
/**
* 1. 读取配置文件
* 2. 创建SqlSessionFactory工厂
* 3. 使用工厂生产SqlSession对象
* 4. 使用SqlSession对象生成UserDao接口的代理对象
* 5. 使用代理对象调用接口方法
* 6. 释放资源
*/
private InputStream is = null;
private SqlSession sqlSession = null;
private UserDao userDao = null;
/**
* 初始化
* @throws IOException
*/
@Before
public void init() throws IOException{
// 1.读取配置文件
is = Resources.getResourceAsStream("mybatisConfig.xml");
// 2.SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 3.创建SqlSession会话对象
sqlSession = sqlSessionFactory.openSession();
// 4.创建dao接口的代理对象
userDao = sqlSession.getMapper(UserDao.class);
}
/**
* 释放资源
* @throws IOException
*/
@After
public void destory() throws IOException{
// 提交事务
sqlSession.commit();
sqlSession.close();
is.close();
}
/**
* 查询所有用户
* @throws IOException
*/
@Test
public void TestFindAll() {
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
}
/**
* 新增一条记录
*/
@Test
public void testInsertOne(){
User user = new User();
user.setUserName("jodi");
user.setUserSex("男");
user.setUserAge(6);
//System.out.println("before -" + user);
userDao.insertOne(user);
//System.out.println("after -" + user);
}
/**
* 修改用户
*/
@Test
public void testUpdateUser(){
User user = new User();
user.setUserSex("女");
user.setUserId(6);
userDao.updateUser(user);
}
/**
* 根据id删除用户
*/
@Test
public void testDeleteUserById(){
userDao.deleteUserById(6);
}
}
全文只是个人的笔记,可能没有太大参考价值,如有错误,欢迎大佬指正。