一.ORM思想
对象关系映射(Object Relational Maping ,简称ORM):
是一种为了解决面向对象与关系数据库存在的互不匹配的问题的技术。简单来说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。
ORM主要解决对象-关系的映射
常见ORM框架
1.JPA:本身是一种ORM规范,不是ORM框架,由各大ORM框架提供实现
2.Hibernate:目前最流行的ORM框架,设置灵巧,性能优秀,文档丰富
3.MyBatis:目前最受欢迎的持久层解决方案
认识MyBatis
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis框架图
MyBatis核心组件
1.SqlSessionFactoryBuilde(构建器):根据配置信息或Java代码构建SqlSessionFactory对象,
作用:创建SqlSessionFactory对象
2.SqlSessionFactory(会话工厂):好比是DataSource,线程安全,在应用运行期间不要重复创建多次。建议使用单例模式,
作用:创建SqlSession对象
3.SqlSession(会话):好比是Connection,线程不安全,每次使用开启新的SqlSession对象,使用完要正常关闭,默认使用DefaultSqlSession。提供操作数据库的增删改查方法,可以调用操作方法,也可以操作Mapper组件。
4.Executor(执行器):SqlSession本身不能操作数据库,需要Executor来完成,该接口有两个实现:缓存执行器(缺省)、基本执行器
5.MappedStatement:映射语句封装执行语句时的信息如Sql,输入参数,输出结果
MyBatis原理图
二.MyBatis基础
1.Mybatis依赖jar包:
1) mysql-connector-java-5.1.x.jar
2)核心包:mybatis-3.4.5.jar
3)其他依赖
配置文件(两种):
1)Mybatis主配置文件(全局配置文件),只有一份,名字任意,起名为mybatis-config.xml
2)Mybatis映射文件,有多分,名字一般为XxxMapper.xml,Xxx表示模型对象
主配置文件主要包括数据库的信息,如连接池,事务等和全局的配置如关联映射日志,插件等
<?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>
<!-- 属性配置 -->
<!-- <properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="jdbc.url"
value="jdbc:mysql://localhost:3306/mybatisdemo" />
<property name="jdbc.username" value="root" />
<property name="jdbc.password" value="123456" />
</properties> -->
<!-- 从classpath的根路径加载属性 -->
<properties resource="db.properties"/>
<!-- 日志技术 -->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
<typeAliases>
<!-- <typeAlias type="com.bigfong.mybatis.hello.User" alias="User"/> -->
<!-- 一般写到domain包就可以了,自动为该名中的类起别名,默认的别名就是简单类名并且首字每小写 (其实别名不区分大小写) -->
<package name="com.bigfong.mybatis.hello" />
</typeAliases>
<!-- 1.配置数据库环境 -->
<environments default="dev">
<!-- 开发环境:在以后事务管理器和连接池都是交给spring框架来管理的 -->
<environment id="dev">
<!-- [1]事务管理器 -->
<transactionManager type="JDBC" />
<!-- [2]数据库连接池 -->
<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>
<!-- 2.关联映射文件 -->
<mappers>
<mapper resource="com/bigfong/mybatis/hello/UserMapper.xml" />
</mappers>
</configuration>
映射文件
<?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.bigfong.mybatis.domain.UserMapper">
<!-- resultMap:结果集和对象的映射,解决结果集(表)中的列和对象中的属性名称不一致问题
id属性:当前resultMap文件中的resultMap的唯一名称
type属性:把结果集中的每一行数据封装成什么类型的对象
-->
<resultMap id="BaseResultMap" type="User" >
<!-- 功能和result一样,如果是主键建议使用id元素,提升性能 -->
<id column="id" property="id"/>
<!-- 匹配 对象中的哪一个属性对应表中的哪一个列-->
<result column="name" property="name"/>
<result column="salary" property="salary"/>
</resultMap>
<!-- 添加
useGeneratedKeys:是否需要返回自动生成的主键
keyProperty:把自动生成的主键设置到对像的哪一个属性上
-->
<insert id="save" useGeneratedKeys="true" keyProperty="id" >
insert into t_user (name,salary) values (#{name},#{salary})
</insert>
<!--
select元素:专门用来做查询的SQL,
id:唯一标识,用来表示某条SQL语句,id属性和namespace唯一的表示了应用中的某条SQL语句
parameterType:表示执行该SQL语句需要的参数的类型,建议不写,MyBatis可以自行推断出来
resultType:把结果集中的每一条数据封装成什么类型的对象
parameterType="User",使用全局配置中设置的别名
-->
<select id="get" resultMap="BaseResultMap">
select id,name,salary from t_user where id = #{id}
</select>
<!-- 获取总数 -->
<select id="queryForCount" resultType="int">
select count(*) from t_user
</select>
<select id="listAll" resultMap="BaseResultMap">
select id,name,salary from t_user
</select>
<!-- 更新 -->
<update id="update" >
update t_user set name = #{name},salary = #{salary} where id = #{id}
</update>
<!-- 删除 -->
<delete id="delete">
delete from t_user where id = #{id}
</delete>
<!-- 查询部分字段 -->
<select id="getForMap" resultType="map">
select id,name from t_user where id = #{id}
</select>
</mapper>
3.OGNL
OGNL(Object-Graph Navigation Language)对象图形导航语言,一种功能强大的表达式语言。通过OGNL,可以存取对象的属性和调用对象的方法,遍历整个对象的结构图等
OGNL可以直接获取对象的属性,语法为:#{}
如上下文的根对象为employee对象,则表达式: #{dept.name}
表示访问了employee对象的dept属性的name属性,就好比是:employee.getDept().getName();
4.日志框架
jar包:log4j-1.2.17.jar
log4j.properties内容
# 设置全局的日志配置:输出Error级别,输出到控制台, ERROR > WARAN > INFO > DEBUG > TRACE
log4j.rootLogger=ERROR, stdout
# 设置自定义的日志级别
log4j.logger.com.bigfong.mybatis=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
mybatis-config.xml中配置
<!-- 日志技术 -->
<settings>
<setting name="logImpl" value="LOG4J" />
</settings>
5.保存操作
UserMapper.xml添加
<insert id="save" useGeneratedKeys="true" keyProperty="id" >
insert into t_user (name,salary) values (#{name},#{salary})
</insert>
parameterType="" 属性表示传入语句参数的类型,建议不配置,MyBatis可以自行推导出来
测试代码
User user = new User();
user.setName("小王子");
user.setSalary(new BigDecimal("1024"));
// 1.从classpath路径中加载MyBatis全局配置文件mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建SqlSessionFactory对象,好比是DataSource
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.创建SqlSession对象,好比是Connection
SqlSession session = sessionFactory.openSession();
// 4.具体的操作(增删改查)
session.insert("com.bigfong.mybatis.domain.UserMapper.save",user);
//提交事务
session.commit();
session.close();
System.out.println(user);
6.更新
<update id="update" >
update t_user set name = #{name},salary = #{salary} where id = #{id}
</update>
User user = new User();
user.setId(1L);
user.setName("小王子222");
user.setSalary(new BigDecimal("2024"));
// 1.从classpath路径中加载MyBatis全局配置文件mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建SqlSessionFactory对象,好比是DataSource
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.创建SqlSession对象,好比是Connection
SqlSession session = sessionFactory.openSession();
// 4.具体的操作(增删改查)
session.update("com.bigfong.mybatis.domain.UserMapper.update",user);
//提交事务
session.commit();
session.close();
System.out.println(user);
7.删除操作
<delete id="delete">
delete from t_user where id = #{id}
</delete>
// 1.从classpath路径中加载MyBatis全局配置文件mybatis-config.xml
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建SqlSessionFactory对象,好比是DataSource
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
// 3.创建SqlSession对象,好比是Connection
SqlSession session = sessionFactory.openSession();
// 4.具体的操作(增删改查)
session.update("com.bigfong.mybatis.domain.UserMapper.delete",2L);
//提交事务
session.commit();
session.close();
System.out.println(user);
为简化MyBatis操作,封装一个工具类
public class MybatisUtil {
private static SqlSessionFactory factory = null;
static {
try {
factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 返回一个SqlSession对象
public static SqlSession getSession() {
return factory.openSession();
}
public static <T> T getMapper(Class<T> mapperClass) {
return getSession().getMapper(mapperClass);
}
}
8.查询操作:单条记录
<select id="get" resultType="com.bigfong.mybatis.hello.User">
select id,name,salary from t_user where id = #{id}
</select>
SqlSession session = MybatisUtil.getSession();
User user = session.selectOne("com.bigfong.mybatis.domain.UserMapper.get");
session.close();
8.查询操作:多条记录
<select id="listAll" resultType="com.bigfong.mybatis.hello.User">
select id,name,salary from t_user
</select>
@Cleanup
SqlSession session = MybatisUtil.getSession();
List<User> list = session.selectList("com.bigfong.mybatis.domain.UserMapper.listAll");
System.out.println(list);