MyBatis第二篇:框架原理及开发方式

3. 框架原理

  1. Configuration对象:配置对象,内容是主配置文件(sqlMapConfig.xml),映射文件(User.xml.....)
  2. MappedStatement对象:输入输出对象,parameterType参数输入,resultType返回值输出
  3. 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代理开发

规则:

  1. mapper接口的全路径,与mapper映射文件中的namespace属性值一致
  2. mapper接口方法返回值类型,与sql语句中resultType属性值一致
  3. mapper接口方法的名称,与sql语句中id属性值一致
  4. 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();
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值