mybatis封神之旅-实操

Posted gonghaiyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis封神之旅-实操相关的知识,希望对你有一定的参考价值。

前言

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java的POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。本教程偏重实践,需要读者动手操作来理解什么是Mybatis及Mybatis的功能。

适用人群

中小型 Web 项目开发者,需要处理SQL复杂连接的问题的技术开发者。

学习前提

学习本教程,你需要对 SQL 语言及 XML 有一定的了解。
鸣谢:http://www.yihaomen.com/article/java/302.htm

简介

什么是Mybatis?

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录。

orm的基本思想

无论是用过的 hibernate,Mybatis,你都可以法相他们有一个共同点:

  1. 从配置文件(通常是 XML 配置文件中)得到 sessionfactory.
  2. 由 sessionfactory 产生 session
  3. 在 session 中完成对数据的增删改查和事务提交等.
  4. 在用完之后关闭session。
  5. 在Java对象和数据库之间有做mapping的配置文件,也通常是xml文件。

开发环境

环境的搭建参考maven教程中的使用maven创建web项目章节。
测试:

<?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>
	<typeAliases>
		<typeAlias type="com.swad.domain.User" alias="User"/>
	</typeAliases>
	<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/springmvc-test"/>
					<property name="username" value="root"/>
					<property name="password" value="egilance1234"/>
				</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/swad/mapper/UserMapper.xml"/>
	</mappers>
</configuration>
package com.swad.util;

import java.io.Reader;

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 com.swad.domain.User;

public class TestMybatis {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;
	
	static{
		try{
			reader = Resources.getResourceAsReader("mybatisConfiguration.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
    
	public static SqlSessionFactory getSession(){
		return sqlSessionFactory;
	}
	
	public static void main(String[] args){
		SqlSession session = sqlSessionFactory.openSession();
		try{
			User user = (User)session.selectList("com.swad.mapper.UserMapper.findAllUser").get(0);
			//下面这种写法是有问题的,报错为:Mapped Statements collection does not contain value for
			//User user = (User)session.selectList("com.swad.mapper.findAllUser").get(0);
			System.out.println(user.getName());
			System.out.println(user.getSalary());
		}finally{
			session.close();
		}
	}
	
}

以接口的方式编程

前面一章,已经搭建好了 Eclipse,Mybatis,MySql 的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession 实例来直接执行已映射的SQL语句。而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如 IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.

package com.swad.util;

import java.io.Reader;

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 com.swad.domain.User;
import com.swad.mapper.UserMapper;

public class TestMybatis {
	private static SqlSessionFactory sqlSessionFactory;
	private static Reader reader;
	
	static{
		try{
			reader = Resources.getResourceAsReader("mybatisConfiguration.xml");
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
    
	public static SqlSessionFactory getSession(){
		return sqlSessionFactory;
	}
	
	public static void main(String[] args){
		SqlSession session = sqlSessionFactory.openSession();
		try{
			User user = (User)session.selectList("com.swad.mapper.UserMapper.findAllUser").get(0);
			//下面这种写法是有问题的,报错为:Mapped Statements collection does not contain value for
			//User user = (User)session.selectList("com.swad.mapper.findAllUser").get(0);
			/*下面这种方式更好!!!
			 * UserMapper userMapper = session.getMapper(UserMapper.class);
			User user2 = userMapper.findById(1);*/
			System.out.println(user.getName());
			System.out.println(user.getSalary());
		}finally{
			session.close();
		}
	}
}

实现数据的CRUD

前面已经讲到用接口的方式编程。这种方式,要注意的一个地方就是。在User.xml 的配置文件中,mapper namespace=“com.yihaomen.mybatis.inter.IUserOperation” ,命名空间非常重要,不能有错,必须与我们定义的package和接口一致。

查询数据

查询出列表,也就是返回 list, 在我们这个例子中也就是List , 这种方式返回数据,需要在 User.xml里面配置返回的类型 resultMap, 注意不是resultType,而这个resultMap 所对应的应该是我们自己配置的。

<resultMap type="com.swad.domain.User" id="user_mapping">
		<id column="id" property="id" />
		<result column="name" property="name" />
		<result column="age" property="age" />
        <result column="salary" property="salary" />
</resultMap>
<!-- 获取用户列表 -->
	<select id="findAllUser" resultMap="user_mapping">
		SELECT
		* 
		FROM  user u
</select>

增加数据

UserMapper.java中:

void saveUser(User user);
<!-- 新增用户 -->
	<insert id="saveUser" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
		INSERT INTO
		user(id,name,age,salary)
		VALUES(#{id},#{name},#{age},#{salary})
</insert>

更新数据

void updateUser(User user);

<!-- 更改用户 -->
	<insert id="updateUser">
		UPDATE  user
		<set>
			<if test="name!=null and name != '' ">
				name = #{name},
			</if>
			<if test="age!=null and age != '' ">
				age=#{age},
			</if>
			<if test="salary!=null and salary != '' ">
				salary=#{salary} 
			</if>
		</set>
		WHERE id = #{id}
	</insert>

删除数据
void deleteUserById(long id);

<!-- 删除用户 -->
	<delete id="deleteUserById">
		DELETE FROM  user WHERE id = #{id}
</delete>

实现关联数据的查询

public List