Mybatis(上)
传统 JDBC 编程
1、 加载数据库驱动
2、 创建并获取数据库链接
3、 创建 statement 对象
4、 拼写 sql 语句
5、 设置 sql 语句中的占位符的值
6、 执行 sql 语句并获取结果
7、 对 sql 执行结果进行解析处理
8、 释放资源
java框架
框架会将很多基本功能进行封装,程序员在框架基础上在进行业务开发。
代码简洁,开发高效。
了解框架主要功能
搭建框架:
添加框架依赖的jar
写配置文件
框架中提供自己的一些接口,实现某种功能。
mybatis:
原来是Apache的一个开源项目,2010年迁移到谷歌,更名为mybatis
数据访问层(数据持久层) Dao(data Access Object)
Controller Servlet属于控制层
View(前端)
是一个ORM框架。
ORM(Object Relational Mapping)
Object Relational Mapping
java对象 映射 数据库表
mybatis封装一些关于对数据库操作的一些接口,代替了jdbc
对jdbc进行了封装,简化操作。
mybatis环境搭建:
1、导入mybatis jar mysql驱动包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
创建MyBatis 全局配置文件
MyBatis 的配置文件包含了对 MyBatis 行为的设置信息。 配置文档的顶层 结构如下(标签需要按照特定顺序排放):
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
1、先创建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">
<!--配置事务管理类型,使用jdbc事务管理-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源-->
<dataSource type="POOLED">
<!--数据库驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!--数据库地址-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai" />
<!--数据库用户名密码-->
<property name="username" value="root" />
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/AdminMapper.xml"/>
</mappers>
</configuration>
2、创建SQL映射文件AdminMapper.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.ffyc.mybatis.mapper.AdminMapper">
<insert id="saveData" parameterType="com.ffyc.mybatis.model.Admin">
insert into admin(account,password,sex)values (#{account},#{password},#{sex})
</insert>
</mapper>
插入数据
<?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="接口地址">
<insert id="接口方法名" useGeneratedKeys="把新增加的主键赋值到自己定义的 keyProperty " keyProperty="接收主键的属性" parameterType="全类名地址">
(SQL语句:) insert into user(userName,userAge)values(#{userName},#{userAge})
</insert>
</mapper>
#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
#{}:select * from t_user where uid=#{uid}
$ {} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句,$ 方式无法防止 Sql 注入 $ {}
$ {}:select * from t_user where uid= '1'
注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是#
修改
<update id="唯一标识" parameterType=“参数类型">
update ts_user set userName = #{userName},userAge = #{userAge} where userId = #{userId} </update>
删除
<delete id="唯一标识" parameterType="参数类型">
delete from ts_user where userId = #{id}
</delete>
查询
<select id="唯一标识" resultType="返回结果集类型">
select * from ts_user where id= #{id}
</select>
Mybatis-Dao 层 Mapper 接口
Mapper 接口开发方法只需要程序员编写 Mapper 接口(相当于 Dao 接口), 由 Mybatis 框架根据接口定义创建接口的动态代理对象.
使用 session.getMapper(接口.class);获得代理对象 Mapper 接口开发需要遵循以下规范:
1、 Mapper.xml 文件中的 namespace 与 mapper 接口的类路径相同。
2、 Mapper 接口方法名和 Mapper.xml 中定义的每个 statement 的 id 相同
3、 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同 4、 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
测试
MyBatis 读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
创建 SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
创建 SqlSession
SqlSession sqlSession = sessionFactory.openSession();
SqlSessionFactory 接口 一旦创建,SqlSessionFactory 就会在整个应用过程中始终存在。所以没有理由 去销毁和再创建它,一个应用运行中也不建议多次创建 SqlSessionFactory。如 果真的那样做,会显得很耗时。
SqlSession 接口
Sqlsession 意味着创建数据库会话,该接口中封装了对数据库操作的方法,与 数 据 库 会 话 完 成 后 关 闭 会 话 。
mybatis 中 使 用 SqlsessionFactory 的 openSession 方法创建。
Sqlsession 中的方法:
getMapper(Class class);获得接口代理对象
commit();提交事物
close();关闭