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="dbconfig.properties"></properties>
<!--
2、settings包含很多重要的设置项setting:用来设置每一个设置项
name:设置项名
value:设置项取值
-->
<settings>
<!--开启驼峰命名法-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--
environments:环境们,mybatis可以配置多种环境 , default指定使用某种环境。可以达到快速切换环境
environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
transactionManager:事务管理器
type事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口,type指定为全类名
dataSource:数据源;
type:数据源类型;UNPOOLED( UnpooledDataSourceFactory)
POOLED(PooledDataSourceFactory)
JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,tpe是全类名
-->
<environments default="development">
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type=""></dataSource>
</environment>
<environment id="development">
<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>
<!--
databaseIdProvider:支持多数据库厂商的;
type="DB_VENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识,mybatis就能根据数据库厂商标识来执行不同的sql
-->
<databaseIdProvider type="DB_VENDOR">
<!--为不同的数据库厂商起别名-->
<property name="MySQL" value="mysql"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
<mappers>
<!--将我们写好的sql映射文件写到全局变量中-->
<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.gognda.mybatis.bean.EmployeeMapper">-->
<mapper namespace="com.gognda.mybatis.dao.EmployeeMapper">
<!--
mapper:告诉 MyBatis 去哪里找映射文件
namespace:名称空间;接口全类名
id:唯一标识
resultType:返回值类型
#{id}:从传过来的参数中取出id值
-->
<!--根据databaseId识别执行那个数据可-->
<select id="getEmpById" resultType="com.gognda.mybatis.bean.Employee" databaseId="mysql">
select * from tbl_employee where id = #{id}
</select>
<!--public void addEmp(Employee employee);-->
<select id="getEmpById" resultType="com.gognda.mybatis.bean.Employee" databaseId="oracle">
select * from tbl_employee where id = #{id}
</select>
<!--parameterType:可以省略-->
<insert id="addEmp" parameterType="com.gognda.mybatis.bean.Employee" >
insert into tbl_employee(id,last_name,gender,email)
values (#{id},#{lastname},#{gender},#{email})
</insert>
<!--public boolean updateEmp(Employee employee);-->
<update id="updateEmp" >
update tbl_employee set last_name=#{lastname},gender=#{gender},email=#{email}
where id=#{id}
</update>
<!--public void deleteEmp(Integer id);-->
<delete id="deleteEmp">
delete from tbl_employee where id=#{id}
</delete>
</mapper>
dbconfig.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=password
Employee
package com.gognda.mybatis.bean;
public class Employee {
private int id;
private String lastname;
private String gender;
private String email;
public Employee() {
}
public Employee(int id, String lastname, String gender, String email) {
this.id = id;
this.lastname = lastname;
this.gender = gender;
this.email = email;
}
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", lastname='" + lastname + '\'' +
", gender='" + gender + '\'' +
", email='" + email + '\'' +
'}';
}
}
EmployeeMapper
package com.gognda.mybatis.dao;
import com.gognda.mybatis.bean.Employee;
public interface EmployeeMapper {
public Employee getEmpById(int id);
public void addEmp(Employee employee);
public boolean updateEmp(Employee employee);
public void deleteEmp(Integer id);
}
MyBatisTest
package com.gognda.mybatis.Test;
import com.gognda.mybatis.bean.Employee;
import com.gognda.mybatis.dao.EmployeeMapper;
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 java.io.IOException;
import java.io.InputStream;
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)、使用SqlSessionFactory得到SqlSession对象然后进行增删改查;
* 一个SqlSession代表和数据库的一次会话,用完关闭
* 3)、使用sql唯一标识来告诉Mybatis执行那个sql,sql都是保存在sql映射文件中
* */
@Test
public void test01() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取sqlSession实例,能直接执行已经映射的sql语句
SqlSession openSession = sqlSessionFactory.openSession();
//第一个参数:sql的唯一标识
//第二个参数:执行sql要用的参数
try {
Employee employee = openSession.selectOne("com.gognda.mybatis.bean.EmployeeMapper.selectEmp", 1);
System.out.println(employee);
}finally {
openSession.close();
}
}
/*
* 1、接口式编程
* 原生:Dao ————》DaoImpl
* mybatis:Mapper————》xxMapper.xml
* 2、SqlSession代表和数据库的一次会话,用完必须关闭
* 3、SqlSession和connection一样都是非线程安全的,每次使用都应该获取新的对象(不应该声明共享的成员变量)
* 4、mapper接口没有实现类,但mybatis会为接口生成一个代理对象
* (将接口和xml文件进行绑定,然后就会产生代理对象)
* EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
* 5、两个重要的配置文件
* mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等系统运行信息
* sql映射文件:保存了每一个sql语句的映射信息
* */
@Test
public void test02() throws IOException {
//1、获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = getsqlsessionFactory();
//2、获取SqlSession对象
SqlSession openSession = sqlSessionFactory.openSession();
//3、获取接口的实现类对象
//会为接口自动的创建一个代理对象,代理对象去执行增删查改方法
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
System.out.println(employee);
}finally {
openSession.close();
}
}
/*
* 测试增删改
1、mybati S允许增删改直接定义以下类型返回值
Integer、Long、Boolean、void
2、我们需要手动提交数据
sqlSessionFactory . openSession();===>手动提交
sqlSessionFactory . openSession(true);===》自动提交
* */
@Test
public void test03() throws IOException {
SqlSessionFactory sqlSessionFactory = getsqlsessionFactory();
//1、获取的SqlSession不会自动提交数据
SqlSession openSession = sqlSessionFactory.openSession();
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
//测试添加方法
// Employee employee = new Employee(2, "bbbb", "0", "qq@com");
// mapper.addEmp(employee);
//测试修改方法
//Employee employee = new Employee(1, "cccc", "0", "123@qq.com");
//boolean b = mapper.updateEmp(employee);
//System.out.println(b);
//测试删除方法
mapper.deleteEmp(1);
//手动提交数据
openSession.commit();
}finally {
openSession.close();
}
}
}