MyBatis的HelloWord和接口式编程


为什么要使用MyBatis?
 mybatis是一个半自动化的持久层框架
 JDBC
    SQL夹在java代码块里,耦合度高导致硬编码内伤。
    维护不易且实际开发需求中sql是有变化,频繁修改的情况多见。
Hibernate和JPA
   长难复杂sql,对于hibernate而言处理也不容易。
   内部自动化生产的sql,不容易做特殊化。
   基于全映射的全自动化自动框架,大量字段的pojo进行映射时比较困难,
   导致数据库性能下降。
对于开发人员而言,核心sql还是需要自己优化
sql和java编码分开,功能边界清晰,一个专注业务,一个专注数据。






MyBatis的HelloWord和接口式编程_MyBatis的HelloWord和接口




MyBatis的HelloWord和接口式编程_xml_02




mybatis-config.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>
	<!--将我们写好的sql映射文件一定要注册到全局配置文件中-->
	<mappers>
		<mapper resource="EmployeeMapper.xml" />
	</mappers>
</configuration>

EmployeeMapper.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">
<mapper namespace="com.cn.mybatis.dao.EmployeeMapper">
<!-- 
  namespace: 名称空间
  id:唯一标识
  resultType: 返回值类型
  #{id} 从传递过来的参数中取出id
 -->
	<select id="getEmpById" resultType="com.cn.zhu.bean.Employee">
		select id,last_name lastname,email,gender from tbl_employee  where id = #{id}
</select>
</mapper>

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>


EmployeeMapper.java  接口


package com.cn.mybatis.dao;

import com.cn.zhu.bean.Employee;

public interface EmployeeMapper {
	public Employee getEmpById(int  id);
}

Employee.java


package com.cn.zhu.bean;

public class Employee {
	private int id;
	private String lastname;
	private String email;
	private String gender;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getLastname() {
		return lastname;
	}
	public void setLastname(String lastname) {
		this.lastname = lastname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "Employee [email=" + email + ", gender=" + gender + ", id=" + id
				+ ", lastname=" + lastname + "]";
	}
	
}


测试类:MyBatisTest.java


package com.cn.zhu.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

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.Test;

import com.cn.mybatis.dao.EmployeeMapper;
import com.cn.zhu.bean.Employee;

public class MyBatisTest {
	public SqlSessionFactory getSqlSessionFactory() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		return  new SqlSessionFactoryBuilder().build(inputStream);
	}
	/**
	 * 1. 根据xml配置文件(	全局配置文件)创建一个sqlsessionFactory对象
	 *       有数据源一些运行环境信息
	 * 2  sql映射文件: 配置了每一个sql,以及sql的	封装规则等
	 * 3  将sql映射文件注册在全局配置文件中
	 * 4  写代码
	 *       1 根据全局配置文件得到sqlSessionFactory
	 *       2 使用sqlsession工厂,获取到sqlsession对象使用池来执行增删改查
	 *        一个sqlsession就是代表和数据库的一次回话。用完也要关闭
	 * @throws IOException
	 */
/*	@Test
	public void test() throws IOException{

		*//**
		 * 2 获取sqlsession实例,能直接执行已经映射的sql语句
		 *//*
		SqlSession openSession=getSqlSessionFactory().openSession();
		try{
			Employee employee=	openSession.selectOne("com.cn.mybatis.EmployeeMapper.selectEmp", 1);
			System.out.println(employee);		
		}finally{		
			openSession.close();
		}

	}*/
	@Test
	public void test01() throws IOException{
		//1 获取sqlsessionFactory对象
		SqlSessionFactory sqlSessionFactory=getSqlSessionFactory();	
		//2 获取sqlsession对象
		SqlSession openSession=sqlSessionFactory.openSession();
		try{
			//3 获取接口实现的类
			EmployeeMapper   mapper= openSession.getMapper(EmployeeMapper.class);
			Employee employee=	mapper.getEmpById(1);
			System.out.println(employee);
		}finally{
			openSession.close();
		}
	}
}




MyBatis的HelloWord和接口式编程_xml_03