第一步:使用mysql数据库建立表
第二步:使用eclipse创建项目
1.完整目录结构
2.代码
Employee.java
package com.mybatis.bean;
import org.apache.ibatis.type.Alias;
@Alias(value = "emp")
public class Employee {
private Integer id;
private String lastName;
private String email;
private String gender;
public Integer getId() {
return id;
}
public void setId(Integer 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 [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";
}
}
EmployeeMapper.java
package com.mybatis.dao;
import com.mybatis.bean.Employee;
public interface EmployeeMapper {
public Employee getEmpbyID(Integer id);
}
EmployeeMapperAnnotion.java
package com.mybatis.dao;
import org.apache.ibatis.annotations.Select;
import com.mybatis.bean.Employee;
public interface EmployeeMapperAnnotion {
@Select("select * from tbl_employee where id = #{id}")
public Employee getEmpbyID(Integer id);
}
映射配置文件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">
<!-- namespace:名称空间,指定接口的全类名
id: 唯一标识符
resultType:返回的对象类型
如果数据库的某些字段与对象的属性不相同,1.可以把数据库的这些字段取别名(如数据库字段 last_name与对象属性lastName不一致.
2.在全局配置文件中设置驼峰命名法,需要符合驼峰命名法的要求:
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
-->
<mapper namespace="com.mybatis.dao.EmployeeMapper">
<!-- getEmpbyID 通过id返回Employee对象,是借口EmployeeMapper下的方法 -->
<select id="getEmpbyID" resultType="com.mybatis.bean.Employee" databaseId="mysql1">
select * from tbl_employee where id = #{id}
</select>
<select id="gerEmpbyID" resultType="com.mybaties.baen.Employee" databaseId="oracle2">
select employee_id id,employee_lastName lastName,employee_email email,employee_gender gender from employee_
where employee_id =#[id]
</select>
<select id="gerEmpbyID" resultType="com.mybaties.baen.Employee" databaseId="sql server3">
select employee_id id,employee_lastName lastName,employee_email email,employee_gender gender from employee_
where employee_id =#[id]
</select>
</mapper>
测试类testMybatis.java
package test;
import java.io.IOException;
import java.io.InputStream;
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 org.junit.Test;
import com.mybatis.bean.Employee;
import com.mybatis.dao.EmployeeMapper;
import com.mybatis.dao.EmployeeMapperAnnotion;
public class testMybatis{
// private SqlSessionFactory sqlSessionFactory;不能作为成为变量,它是非线程安全的,需要使用则需要重新New一个新的对象,然后关闭,
// 不能同时多个线程使用,产生资源竞争,A线程正在使用,而B线程已经修改了A线程坑需要用到的数据
private SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory SqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
return SqlSessionFactory;
}
/*
* 1.接口式编程与原生编程的区别:
* Mapper接口代替了xxxMapper.xml
* 2.SqlSession代表和数据库的一次回话,用完必须关闭;
* 3.SqlSession和connection一样都是非线程安全。每次使用都应该去获取新的对象
* 4.mapper接口没有实现类,但是mybatis会为这个接口生产一个代理对象
* (将接口和xml进行绑定)
* EmployeeMapper empMapper= sqlSession.getMapper(EmployeeMapper.class);
* 5.两个重要的配置文件
* mybatis的全局配置文件:包含数据库连接池信息,实物管理器信息等....系统运行环境信息
* sql映射文件:保存了每一个sql语句的映射信息;将sql语句抽取出来交给session
*/
@Test
public void test1() throws IOException {
//1.获取SqlSessionFactory对象
SqlSessionFactory ssf= getSqlSessionFactory();
//2.获取SqlSession对象
SqlSession ss=ssf.openSession();
//3.获取接口的实现类对象
//会为接口自动创建一个代理对象,代理对象去执行增删改查方法
try {
EmployeeMapper mapper = ss.getMapper(EmployeeMapper.class);
Employee emp2 = mapper.getEmpbyID(2);
System.out.println(emp2);
System.out.println(mapper.getClass());//返回的是一个代理对象
} finally {
ss.close();
}
}
@Test
public void test2() throws IOException {
SqlSessionFactory ssf= getSqlSessionFactory();
SqlSession ss=ssf.openSession();
try {
EmployeeMapperAnnotion mapper2=ss.getMapper(EmployeeMapperAnnotion.class);
mapper2.getEmpbyID(2);
System.out.println(mapper2.getEmpbyID(2));
}finally{
ss.close();
}
}
}
全局配置文件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>
<!--
1.mybatis可以使用properties来引入外部properties配置文件的内容
resource:引入类路径下的资源
url:映入网络路径或者磁盘路径下的资源
-->
<properties resource="properties-config.properties"></properties>
<!--
2.setting 包含了很多重要的设置项
setting:用来设置每一个设置项
name:设置项名
value:设置项取值
-->
<!-- 在控制台打印sql语句 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
</settings>
<typeAliases>
<!--
3.typeAliases:为某个Java类型起别名
type:指定要起别名的类型全类名;默认别名就是类名小写:employee
alias:指定新的别名
-->
<!-- 方式1 默认别名是类名的小写格式
<typeAlias type="com.mybatis.bean.Employee"/>
-->
<!-- 方式2 别名由自己命名
<typeAlias type="com.mybatis.bean.Employee" alias="emp"/>
-->
<!-- 方式3 package:为某个包下的所有类批量起别名
name:指定包名(为当前包下及下面所有的后代包的每个类都起一个默认别名(类名小写))
-->
<package name="com.mybatis.bean"/>
<!-- 凡是4 批量起别名的情况下(承接方式3),使用@Alias注解为某个类型指定新的别名 -->
</typeAliases>
<!--
4.environments:环境们,mybatis可以配置多种环境,default指定使用某种环境,可以达到快速切换
enviroment:配置一个具体的环境信息,必须要两个标签,id代表当前环境的唯一标识
transactionManager:事务管理器类型: type="[JDBC|MANAGED]"
dateSource:数据源类型: type=”[UNPOOLED|POOLED|JNDI]”
-->
<environments default="mysql1">
<!-- 示例模板 1-->
<environment id="sql server3">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.jdbc.sql server.Driver"/>
<property name="url" value="jdbc:sql server://...."/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
<!-- 示例模板 2-->
<environment id="oracle2">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${oracle.driver}"></property>
<property name="url" value="${oracle.url}"></property>
<property name="username" value="${oracle.username" ></property>
<property name="password" value="${oracle.password}"></property>
</dataSource>
</environment>
<environment id="mysql1">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--
5.datebaseIdProvider:支持多数据库厂商;
type=“DB-VENDOR”:VendorDatebaseProvider
作用就是得到数据库厂商的标识(驱动getDatebaseProductName()),mybatis提供这些数据库的标识:MySQL,Oracle,SQL Server,xxxx
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql1"/>
<property name="Oracle" value="oracle1"/>
<property name="SQL Server" value="sql serrver1"/>
</databaseIdProvider>
<!-- 写好的sql映射文件一定要注册到全局配置文件中 -->
<!--
6. mapper:注册一个sql映射
注册配置文件:
resource:应用类路径下的sql映射文件
如:将EmployeeMapper.xml放在com.config包下
则为resource="com/config/EmployeeMapper.xml"
url:应用网络路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml
注册接口:
class:应用(注册)接口
1.有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
2.没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
-->
<mappers>
<!--第一种:和持久化类放在一起 <mapper resource="com/mybatis/bean/EmployeeMapper.xml"/> -->
<!--第二种:单独放独立创建的配置文件包中 <mapper resource="com/config/EmployeeMapper.xml"></mapper> -->
<!--第三种:和接口类放在一起,并且文件要和接口同名 <mapper class="com.mybatis.dao.EmployeeMapper"></mapper> -->
<!--第四种:将sql语句直接利用注解写在接口上,这种情况不需要sql配置文件,用测试类中的test2方法测试 <mapper class="com.mybatis.dao.EmployeeMapperAnnotion"></mapper>-->
<!-- 批量注册 -->
<package name="com.mybatis.dao"></package>
</mappers>
</configuration>
数据库配置properties-config.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=shapolang
<example>
oracle.jdbc=org.oracle.Driver
oracle.url=jdbc:.....
oracle.username=scott
oracle.password=123...