141_Java_SpringMybatis_SqlSessionFactory_SqlSession_Mapper映射
【摘要】 SqlSessionFactory
SqlSession
Mapper进行接口 (namespace)和接口方法的映射(select id)的映射
MyBatis简介
1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4) 半自动ORM(Object Relation Mapping)框架
1 接口式编程
原生: Dao ====> DaoImpl
mybatis: Mapper ====> xxMapper.xml(没写实现类,而是有一个与之对应的配置文件)
2、SqlSession代表和数据库的一次会话;用完必须关闭;
3、SqlSession和connection一样她都是非线程安全。每次使用都应该去获取新的对象。(不能写成成员变量 private SqlSession sqlsession)
4、mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象,将接口和xml进行绑定)
EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
5、两个重要的配置文件:
mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等...系统运行环境信息
sql映射文件:保存了每一个sql语句的映射信息 能将sql抽取出来
1 配置文件三个
a) 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/test?useSSL=false&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="xxxx" />
</dataSource>
</environment>
</environments>
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<mappers>
<mapper resource="EmployeeMapper.xml" />
</mappers>
</configuration>
b) 对象Mapper.xml配置
<!-- 1 传统方式, 制定全类目
namespace:名称空间;指定为接口的全类名
id:唯一标识; resultType:返回值类型; #{id}:从传递过来的参数中取出id值
public Employee getEmpById(Integer id);
-->
<mapper namespace="com.alex.mybatis.bean.Employee">
<!-- 2 接口方式: a) 接口和配置文件动态绑定 b) select id 与接口方法名对应getEmpById -->
<mapper namespace="com.alex.mybatis.dao.EmployeeMapper">
<select id="getEmpById" resultType="com.alex.mybatis.bean.Employee">
select id,last_name lastName,email,gender from tbl_employee where id = #{id}
</select>
</mapper>
c) log4j.properties 配置
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
# 控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/mybatis.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
code
1 工具类 创建SqlSessionFactory_获取SqlSession
public class MybatisUtils {
/**
* 1、根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息
* 2、sql映射文件;配置了每一个sql,以及sql的封装规则等。
* 3、将sql映射文件注册在全局配置文件中
* 4、写代码:
* 1)、根据全局配置文件得到SqlSessionFactory;
* 2)、使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查
* 一个sqlSession就是代表和数据库的一次会话,用完关闭
* 3)、使用sql的唯一标志来告诉MyBatis执行哪个sql。sql都是保存在sql映射文件中的。
*
* @throws IOException
*/
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybatis第一步:获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
// 2、获取sqlSession实例,能直接执行已经映射的sql语句
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
2 Bean对象 / 接口
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 + "]";
}
}
接口
public interface EmployeeMapper {
public Employee getEmpById(Integer id);
}
入门测试
public class MyBatisTest {
//1 入门 传统方式
@Test
public void test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
/**
* // 2、获取sqlSession实例,能直接执行已经映射的sql语句
* // sql的唯一标识: "namespace + id " : statement Unique identifier matching the statement to use.
* // 执行sql要用的参数:parameter A parameter object to pass to the statement.
* sql的唯一标识 sqlSession.selectOne( "namespace + id ", "param1")
* namespace + id
* <mapper namespace="com.alex.mybatis.bean.Employee">
* <select id="getEmpById">
*/
Employee employee = sqlSession.selectOne("com.alex.mybatis.bean.Employee.getEmpById", 1);
System.out.println(employee);
sqlSession.close();
}
// 2 升级为接口方式 (接口与配置文件动态绑定)
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpById(1);
// 没有写接口实现类,但是只要将接口和方法进行绑定,
// mybatis 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
System.out.println(mapper.getClass()); //class com.sun.proxy.$Proxy4
System.out.println(employee);
sqlSession.close();
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)