mybatis:
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回
myBatis功能架构:
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
mybatis配置
1.SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。 mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
3、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
4、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
5、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
6、 Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7、 Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
mybatis解决jdbc的编程问题:
1.使用连接池连接
2.将SQL语句配置到映射xml文件与Java代码分离
3.自动将java对象映射置sql语句通过parameterType定义输入的参数的类型
4.自动将结果映射到java对象中,而且可以通过resultType定义输出的结果类型
mybatis与hibernate 的区别:
1.mybatis通过xml或注解的形式书写sql语句需要自己编写sql语句,并将sql语句和java对象映射成最终执行的sqlhibernate几乎不用自己书写sql语句,都直接操作封装好的对象即可
2。mybatis可以控制sql的执行性能可以用于对关系模型要求不高的软件的开发吗,mybatis无法做到与数据库的无关性,如果需要实现多种的数据库的 软件的类型需要定义多套sql的映射文件工作量大
3.hibernate 对象/关系映射能力极强,与数据库无关性好
sqlSession的获取:
SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。 SqlSession通过SqlSessionFactory创建。 SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了 所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作方法。 每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。
因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。
/////获取sqlsession并且执行相应的操作
public void test5() throws IOException {
// TODO Auto-generated method stub
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in= Resources.getResourceAsStream(resource);
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句,selectone:第一个参数是对的应的xml文件中的的id,第二个是对应的要传入的参数
sqlSession.delete("test.deleteUser",10);
sqlSession.commit();
//释放资源
sqlSession.close();
}
SqlMapConfig.xml配置文件:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器):用于读取你的映射文件
1.使用相对于类路径的资源(现在的使用方式)如:<mapper resource="sqlmap/User.xml" />
2.使用mapper接口类路径如:<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>
3.注册指定包下的所有mapper接口如:<package name="cn.itcast.mybatis.mapper"/>
注意:2.3方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis全局的配置文件 配置运行环境等信息 -->
<configuration>
<!-- 环境标签 和 Spring 整合后environment将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<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="123"/>
</dataSource>
</environment>
</environments>
<!-- mapper的位置 -->
<mappers>
<mapper resource="sqlmap/user.xml"/>
</mappers>
</configuration>
方式二:
准备数据库配置文件:
<?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">
<!-- mybatis全局的配置文件 配置运行环境等信息 -->
<configuration>
<!-- 引入配置的连接池的 -->
<properties resource="db.properties"></properties>
<!-- 环境标签 和 Spring 整合后environment将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- mapper的位置 -->
<mappers>
<mapper resource="sqlmap/user1.xml"/>
</mappers>
</configuration>
mybatis中的映射文件:
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,
如果parameterType传输单个简单类型值,${}括号中只能是value。
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。如果有多条数据,则分别进行映射,并把对象放到容器List中
resultMap:手动映射
映射文件例子:
<?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,命名空间用于隔离SQL,防止出现在id相同的xml文件 -->
<mapper namespace="test">
<!-- 通过id查询 ;select是查询 在这个标签下书写SQL语句,
parameterType:是指定传入参数的类型
resultType:书写的为对象的话,就会自动返回这个对象,自动映射,属性要与数据库一一对应
resultMap:手动映射
-->
<select id="selectid" parameterType="Integer" resultType="com.leo.domain.User">
select * from user where id= #{v}
</select>
<!-- 模糊查询用户
#{}表示的为占位符。占位符?两边已经加上过''后了,,#{}括号内可以为任意字符
也可用"%"#{value}"%"可以防止sql注入
${}字符串拼接,${}两边必须加上'',中间只能为{value}
-->
<select id="selectlist" parameterType="String" resultType="com.leo.domain.User">
select * from user where username like '%${value}%'
</select>
<!-- 添加
返回自增的主键
<selectKey>是获得当前的id
select Last_INSERT_ID():mysql提供的
keyProperty="id" :返回值放到的user中id属性
resultType="Integer" ,id的属性是
order="AFTER":主键自增的mysql为after,oracle是before
-->
<insert id="insertuser" parameterType="com.leo.domain.User">
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select Last_INSERT_ID()
</selectKey>
insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 修改操作 -->
<update id="updateuser">
update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address}
where=#{id}
</update>
<!-- 删除 -->
<delete id="deleteUser">
delete from user where id=#{id}
</delete>
这知识简单的入门级程序,下章节讲述常用的动态代理mapper,主要就是mybatis的操作流程,