mybatis(中)
知识点回顾:
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>
<!--引入存放值的属性文件
<properties resource="存放值的属性文件的地址"></properties>
-->
<properties resource="config.properties"></properties>
<!--全局配置 配置日志实现 使用log4j;添加log4j日志组件 导入jar包-->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!--为类定义别名
<typeAlias type="全类名地址" alias="全类名的别名"></typeAlias>
-->
<typeAliases>
<typeAlias type="com.ffyc.mybatis.model.Admin" alias="Admin"></typeAlias>
</typeAliases>
<!--配置数据库连接的相关信息-->
<environments default="development">
<environment id="development">
<!--配置事务管理类型,使用jdbc事务管理
事务:一次对数据库操作的若干个流程的管理 例如(转账 A->B A-100 B+100 这就是两个变化)
-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源
type="UNPOOLED" 不使用数据库连接池
type="POOLED" 使用数据库连接池
-->
<dataSource type="POOLED">
<!--数据库驱动-->
<property name="driver" value="${Diver}" />
<!--数据库地址-->
<property name="url" value="${urlValue}"/>
<!--数据库用户名密码-->
<property name="username" value="${userName}" />
<property name="password" value="${passWord}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/AdminMapper.xml"/>
</mappers>
</configuration>
2、配置属性文件config.properties
//文件中写新键对应的值
Diver = com.mysql.cj.jdbc.Driver
urlValue = jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
userName = root
passWord = root
3、为类名定义别名
<!--为类定义别名
<typeAlias type="全类名地址" alias="全类名的别名"></typeAlias>
-->
<typeAliases>
<typeAlias type="com.ffyc.mybatis.model.Admin" alias="Admin"></typeAlias>
</typeAliases>
4、设置 连接数据库配置 事务,数据库连接池
<!--配置数据库连接的相关信息-->
<environments default="development">
<environment id="development">
<!--配置事务管理类型,使用jdbc事务管理
事务:一次对数据库操作的若干个流程的管理 例如(转账 A->B A-100 B+100 这就是两个变化)
-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源
type="UNPOOLED" 不使用数据库连接池
type="POOLED" 使用数据库连接池
-->
<dataSource type="POOLED">
<!--数据库驱动-->
<property name="driver" value="${Diver}" />
<!--数据库地址-->
<property name="url" value="${urlValue}"/>
<!--数据库用户名密码-->
<property name="username" value="${userName}" />
<property name="password" value="${passWord}"/>
</dataSource>
</environment>
</environments>
5、SQL映射文件
<!--添加SQL映射文件-->
<mappers>
<mapper resource="mapper/AdminMapper.xml"/>
<mapper resource="mapper/EmployeeMapper.xml"/>
<mapper resource="mapper/DeptMapper.xml"/>
</mappers>
6、接口与XML之间的关系
xml 命名空间(namespace)= “接口类路径”
接口方法名 与 标签id 相等
接口方法参数 与 标签 参数类型相等
接口方法返回值 与 标签返回值类型相等
Sqlsession 获得接口的代理对象
接口的代理对象.接口方法
mybatis执行流程
读取核心配置文件,创建SqlSessionFactory 只读取,创建一次
创建SqlSession 与数据库会话对象
执行方法
提交事务
关闭会话
日志输出 mybatis自己根据配置选择
Junit测试 单元测试
今天的学习内容是:建立在单张表的基础上
一、基本的增删改查
二、向SQL中传参数
三、SQL的返回结果
1、基本的增删改查
新建一个项目
点击完成一个mybatis项目就创建完成了。。。
删除不需要的依赖
创建 MyBatis 全局配置文件
MyBatis 的配置文件包含了对 MyBatis 行为的设置信息。 配置文档的顶层
结构如下(标签需要按照特定顺序排放):
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
mybatis-config文件配置
<?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 resource="存放值的属性文件的地址"></properties>
-->
<properties resource="config.properties"></properties>
<!--全局配置 配置日志实现 使用log4j;添加log4j日志组件 导入jar包-->
<settings>
<setting name="logImpl" value="LOG4J"/>
<!--
数据库下划线 对应 java命名驼峰
是否开启驼峰命名自动映射,即从经典数据库列名A_COLUMN 映射到经典 java属性名 aColumn
-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--lazyLoadTriggerMethods 指定哪些方法触发延迟加载-->
<setting name="lazyLoadTriggerMethods" value=""/>
<!--name="cacheEnabled" value="true" 开启全局二级缓存配置-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--为类定义别名
<typeAlias type="全类名地址" alias="全类名的别名"></typeAlias>
还有更牛逼的方式package是用一条语句对model整个包下的所有类定义别名
-->
<typeAliases>
<typeAlias type="com.ffyc.mybatis.model.Admin" alias="Admin"></typeAlias>
<typeAlias type="com.ffyc.mybatis.model.Employee" alias="Employee"></typeAlias>
<typeAlias type="com.ffyc.mybatis.model.Dept" alias="Dept"></typeAlias>
</typeAliases>
<!--配置数据库连接的相关信息-->
<environments default="development">
<environment id="development">
<!--配置事务管理类型,使用jdbc事务管理
事务:一次对数据库操作的若干个流程的管理 例如(转账 A->B A-100 B+100 这就是两个变化)
-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源
type="UNPOOLED" 不使用数据库连接池
type="POOLED" 使用数据库连接池
-->
<dataSource type="POOLED">
<!--数据库驱动-->
<property name="driver" value="${Diver}" />
<!--数据库地址-->
<property name="url" value="${urlValue}"/>
<!--数据库用户名密码-->
<property name="username" value="${userName}" />
<property name="password" value="${passWord}"/>
</dataSource>
</environment>
</environments>
<!--添加SQL映射文件-->
<mappers>
<mapper resource="mapper/AdminMapper.xml"/>
<mapper resource="mapper/EmployeeMapper.xml"/>
<mapper resource="mapper/DeptMapper.xml"/>
</mappers>
</configuration>
配置属性文件config.properties,添加日志文件
//文件中写新键对应的值
Diver = com.mysql.cj.jdbc.Driver
urlValue = jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
userName = root
passWord = root
创建数据库
在java下创建mapper包用来存放接口
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();关闭
2、向SQL中传参数
#{} 占位符,是经过预编译的,编译好 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>
3、SQL的返回结果
简单类型输出映射
返回简单基本类型
public int findUserInfoCount();
< select id="findUserInfoCount" resultType="int">
select count(*) from userInfo
< /select>
POJO 对象输出映射
如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到POJO对象中. 如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>
public User findUserInfoById(int id)
<select id="findUserInfoById" parameterType="int" resultType="User">
select * from t_user where id=#{id}
</select>
定义resultMap
(1). resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为“useresultMap”
(2). resutlMap 的 id 属性是映射的 POJO 类
(3). id 标签映射主键,result 标签映射非主键
(4). property 设置 POJO 的属性名称,column 映射查询结果的列名称
使用 resutlMap
<?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">
<!--
parameterType="参数类型"
传值: #{属性名} values (?,?,?) 赋值方式是预编译的,它是安全的 可以放置SQL注入
传列名: ${属性名} values ('admin1','222','男') 字符串拼接方式
insert into admin(account,password,sex)values ('${account}','${password}','${sex}')
${} 多用来传列名,而不是传数据
order by 排序(数据库语法I)
useGeneratedKeys="true" 可以返回刚插入的数据主键
keyColumn="id" 告知主键列
keyProperty="id" 告知与主键列对应的属性
-->
<insert id="saveData" parameterType="Admin" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
/*insert into admin(account,password,sex)values ('${account}','${password}','${sex}')*/
insert into admin(account,password,sex)values (#{account},#{password},#{sex})
</insert>
<update id="updateAdmin" parameterType="Admin">
update admin set account=#{account},
password=#{password},
sex=#{sex}
where id = #{id}
</update>
<delete id="deleteAdmin">
delete from admin where id=#{id}
</delete>
<!--
特殊情况下,列名与属性名不一致Admin{id=2, account='admin', password='111', sex='null'} ,就要用到自定义映射resultMap
数据库列名我改为sex1
resultMap:结果集映射
-->
<resultMap id="adminMap" type="Admin">
<!--主键-->
<id column="id" property="id"></id>
<!--其他列-->
<result column="account" property="account"></result>
<result column="password" property="password"></result>
<result column="sex1" property="sex"></result>
</resultMap>
<!--
resultType="Admin" 返回值类型 根据返回值类型 创建一个对象
将数据库自动映射到java对象中,前提是表中的列名与类中的属性名相同
开启驼峰命名自动映射 从数据库命名转java驼峰命名
-->
<select id="getAdminById" resultMap="adminMap">
select * from admin where id = #{id}
</select>
<select id="getAdmin" resultType="Admin">
select * from admin where account = #{acc} and sex=#{sex}
</select>
<!--java中已有的类作为类型使用时,可以直接使用mybatis定义好的别名-->
<select id="getAdmin1" resultType="Admin" parameterType="hashmap">
select * from admin where account = #{acc} and sex=#{sex}
</select>
<select id="getAdminList" resultType="Admin">
select * from admin
</select>
<!--
简单类型不用写成resultType="java.lang.Integer"
可以直接写成resultType="int"
-->
<select id="getAdminCount" resultType="int">
select count(*) from admin
</select>
</mapper>