3. 框架原理
- Configuration对象:配置对象,内容是主配置文件(sqlMapConfig.xml),映射文件(User.xml.....)
- MappedStatement对象:输入输出对象,parameterType参数输入,resultType返回值输出
- Executor对象:执行器对象,负责数据库的CRUD操作执行
4. 开发方式
4.1 原始Dao开发
1. UserDao接口
package com.yong.dao;
import com.yong.po.User;
public interface UserDao {
void Create(User user);
User queryUserById(int id);
}
2. UserDaoImpl实现类
package com.yong.dao.impl;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.yong.po.User;
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl() {
super();
}
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
super();
this.sqlSessionFactory = sqlSessionFactory;
}
public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public void Create(User user) {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
sqlSession.insert("test.insert", user);
sqlSession.close();
}
public User queryUserById(int id) {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.queryUserById", id);
return user;
}
}
3. 测试
package com.yong.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.yong.dao.UserDao;
import com.yong.dao.impl.UserDaoImpl;
import com.yong.po.User;
public class MyBatisTest02 {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void initSqlSessionFactory() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void create() {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = new User("Yong", "男", new Date(), "186********", "110*******@qq.com", "123456");
userDao.Create(user);
}
@Test
public void queryUserById() {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
int id = 1;
User user = userDao.queryUserById(id);
System.out.println(user);
}
}
4.2 Mapper代理开发
规则:
- mapper接口的全路径,与mapper映射文件中的namespace属性值一致
- mapper接口方法返回值类型,与sql语句中resultType属性值一致
- mapper接口方法的名称,与sql语句中id属性值一致
- mapper接口方法的形参,与sql语句中parameterType属性值一致
1. UserMapper.java
package com.yong.mapper;
import com.yong.po.User;
public interface UserMapper {
void insert(User user);
User queryUserById(int id);
}
2. UserMapper.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属性:名称空间,相当于java中package,用于防止sql语句名称冲突 -->
<!-- mapper代理开发方法中,namespace属性值必须是mapper接口的全路径 -->
<mapper namespace="com.yong.mapper.UserMapper">
<!-- insert标签:用于放置新增sql语句
id属性:唯一区分一条sql语句
parameterType属性:输入参数类型
resultType属性:返回值类型
#{}:占位符,当参数传递的是pojo的时候,花括号中的内容是pojo的属性
查询主键:
useGeneratedKeys="true": 使用自动生成主键
keyColumn="id":表中列名
keyProperty="id":pojo中属性名 -->
<insert id="insert" parameterType="com.yong.po.User" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
<!-- selectKey标签:查询主键,说明:
keyColumn属性:主键字段(表)
keyProperty属性:主键属性(pojo)
resultType属性:指定主键字段类型
order属性:指定在insert语句执行前还是执行后,获取主键。
AFTER:在insert语句之后
BEFORE:在insert语句之前 -->
<!-- <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
select LAST_INSERT_ID()
</selectKey> -->
insert into user (username, sex, birthday, mobilephone, email, password) values (#{username}, #{sex}, #{birthday}, #{mobilephone}, #{email}, #{password})
</insert>
<!-- select标签:用于放置查询sql语句
#{}占位符,相当于jdbc中的问号?当参数传递的是java简单类型的时候,花括号中的内容可以是任意字符串 -->
<select id="queryUserById" parameterType="int" resultType="com.yong.po.User">
select * from user where id=#{id}
</select>
</mapper>
3. 在sqlMapConfig配置文件中加载映射文件
<!-- 加载映射文件 -->
<mappers>
<!--加载User.xml映射文件,说明:resource属性:指定文件的位置-->
<mapper resource="sqlMap/User.xml"/>
<!-- 加载UserMapper.xml映射文件 -->
<mapper resource="sqlMap/UserMapper.xml"/>
</mappers>
4. 测试代码
package com.yong.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
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 org.junit.Before;
import org.junit.Test;
import com.yong.mapper.UserMapper;
import com.yong.po.User;
public class MyBatisTest03 {
private SqlSessionFactory sqlSessionFactory = null;
@Before
public void initSqlSessionFactory() throws IOException {
// 加载MyBatis主配置文件
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 读取配置文件
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// sqlSessionFactory对象:是MyBatis框架的核心对象,一个应用只需要一个(单例设计模式应用)
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
}
@Test
public void insert() throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 使用sqlSession对象,获取mapper代理对象
// getMapper方法:获取mapper代理对象
// 参数:mapper接口class
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User("Yong", "男", new Date(), "186********", "110*******@qq.com", "123456");
userMapper.insert(user);
sqlSession.close();
}
@Test
public void queryUserById() {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 使用sqlSession对象,获取mapper代理对象
// getMapper方法:获取mapper代理对象
// 参数:mapper接口class
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.queryUserById(1);
System.out.println(user);
sqlSession.close();
}
}