Mybatis
Mybatis原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache
Software Foundation 迁移到了 Google Code,随着开发团队转投Google
Code 旗下, iBatis3.x正式更名为MyBatis。
Mybatis是一个持久层框架
servlet:负责接受前端请求,调用其他java程序来进行处理,响应。是web层
dao:jdbc 数据持久层
service:验证数据,调用dao结果,组装,是服务层
mybatis是对JDBC功能进行轻量级的封装,它提供了统一的数据库信息配置,放在一个xml中进行读取。将sql提取到一个xml文件中,提供了动态sql功能。 提供了结果自动映射封装,是一个orm(ORM Object Relational Mapping 对象关系映射)实现, orm指的是,将数据中的记录与java中的对象进行关系映射。它支持动态 SQL 以及数据缓存. 对jdbc原生接口进行封装,提供了一些mybatis自己的接口和类来实现.
mybatis环境搭建
1.在数据库中创建库和表
2.创建项目
3.导入mybatis和mysql的jar包
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
4.创建mybaytis全局配置文件
<?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="config.properties"></properties>
<!--配置类型简称-->
<typeAliases >
<!-- <typeAlias type="com.ffyc.mybatispro.model.Admin" alias="Admin"></typeAlias>-->
<package name="com.ffyc.mybatispro.model"/>
</typeAliases>
<!--环境配置-->
<environments default="development">
<environment id="development">
<!--数据事务管理配置-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源 type="POOLED" 使用数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${classDrvierName}" />
<property name="url" value="${url}" />
<property name="username" value="${uname}" />
<property name="password" value="${pwd}"/>
</dataSource>
</environment>
</environments>
<!--配置sql映射文件-->
<mappers>
<mapper resource="mappers/AdminMapper.xml"></mapper>
</mappers>
</configuration>
5.创建sql映射文件
<?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.mybatispro.dao.AdminDao">
<!--定义sql语句-->
<select id="findById" parameterType="int" resultType="Admin">
select id,account,password from admin where id=#{id};
</select>
</mapper>
6.定义接口
public interface AdminDao {
Admin findById(int id);
}
7.测试
public class Test {
public static void main(String[] args) throws IOException {
//读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
/*创建 SqlSessionFactory,用SqlSessionFactory用来封装配置信息,
主要用来创建SqlSession对象,由于创建SqlSessionFactory花销很大,所以在项目只创建一次
* */
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
/*
sqlSession用来每次与数据库会话使用的,每与数据库交互一次就创建一个 sqlSession
*/
SqlSession sqlSession = sessionFactory.openSession();
/*创建接口的代理对象*/
AdminDao adminDao= sqlSession.getMapper(AdminDao.class);
/*由代理对象,调用与接口中方法名称相同id的sql*/
Admin admin=adminDao.findById(1);
System.out.println(admin);
sqlSession .close();//关键
}
}
Mybatis 日志
具体选择哪个日志实现由 MyBatis 的内置日志工厂确定。它会使用最先找到的。
Mybatis 内置的日志工厂提供日志功能,具体的日志实现有以下几种方式:SLF4J|LOG4J|JDK_LOGGINGCOMMONS_LOGGING|STDOUT_LOGGING
配置日志 :
<!--常用设置-->
<settings>
<!--日志功能,在运行时,可以将实际运行的sql细节打印到控制台-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
参数传递
单个参数传递
Admin findById(int id);
多个参数传递使用@Param(“id”)绑定
Admin login(@Param("acc") String account, @Param("pwd") String password);
创建对象需要使用 parameterType 参数进行类型定义,例如Admin login1(Admin admin);
<select id="login1" resultType="Admin">
select * from admin where account=#{account} and password=#{password}
</select>
#{}和${}的区别:
#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
#{}:select * from t_user where uid=#{uid}
拼接符,会传入参数字符串 , 取值以后再去编译 S Q L 语句 , {} 拼接符,会传入参数字符串,取值以后再去编译 SQL 语句, 拼接符,会传入参数字符串,取值以后再去编译SQL语句,方式无法防止 Sql
注入 ${}
${}:select * from t_user where uid= ‘1’
注意:MyBatis 排序时使用 order by 动态参数时需要注意,用$而不是#
查询操作
事务:
每次连接数据库,发送sql,到执行结束。数据有一个机制来进行控制。开启事务,执行sql语句和java操作
最后提交事务,提交事务后数据库才真正的执行。
在Jdbc中事务自动提交。
事务是为的防止在执行代码过程中,java代码异常,导致sql语句未执行完。只有所有的代码执行完,为出现异常数据库才真正执行sql.增、删、改操作在事务的控制中进行。
sql操作中自动获取id:
<insert id="addAdmin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
</insert>
其中需要设置useGeneratedKeys=“true” 、keyColumn=“id”、 keyProperty=“id”。KeyColumn的值是数据库中获取的列名。 keyProperty的值是对象中的属性值。
具体的过程是:执行sql时,它会自动获取数据库中的列的值,把获取后的值赋给对象中的属性。
单张表的sql操作:
查询:
<select id="findById" parameterType="int" resultType="Admin">
select *from admin where id=#{id};
</select>
mybatis会将查询到的结果自动封装到一个对象中。会给创建给定类型的类(Admin)的对象
自动封装的条件:
1.开启全局自动结果映射的配置,默认是PARTIAL ,它有三种设置配置。PARTIAL 只会映射没有定义嵌套结果映射的字段(单张表),NONE 表示关闭自动映射, FULL 会自动映射任何复杂的结果集(无论是否嵌套)。
2.数据库的名字要和给定类中的属性名一致。如果不一致需要在sql语句中设置别名,使得别名和类中的属性名一致。
3.开启驼峰命名自动映射 mapUnderscoreToCamelCase=true,就可以让 数据库中的 admin_gender 映射到java类中的属性 adminGender.
类型处理器
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。
例如:
java.long.Boolean 别名 boolean
resultMap
resultMap标签,自定义结果映射;
<!--id="studentMap"自定义唯一标识 type="student"返回对象类型-->
<resultMap id="studentMap" type="student">
<!--id映射主键,result映射非主键-->
<id column="id" property="id"></id>
<result column="name" property="name" ></result>
<!--用来封装关联对象的信息,用于多表查询-->
<association property="dorm" javaType="dorm" >
<id column="dnum" property="dnum"></id>
</association>
</resultMap>
其中在多表查询中,由于自动结果映射的默认设置是PARTIAL,它只能映射单张表的操作,不能映射多张表的操作,所以就需要我们自己在resultMap中配置映射,或在设置中将自动结果的设置改为FULL,它就在多表操作中能自动映射,需要注意的时,改为FULL时,要注意表和表之间,对象和对象之间定义的属性名、列名,不能相同。
嵌套查询
将一个多表查询拆分为多个单表查询。先查询主表数据,再查询关联表的数据
例如查询宿舍的学生信息,我们可以先查询宿舍,用宿舍id查询学生信息。
<resultMap id="dormMap" type="dorm">
<id column="id" property="id" ></id>
<result column="dnum" property="dnum"></result>
<result property="useDate" column="use_date"></result>
<association property="admin" javaType="admin" column="adminid" select="findadmin" ></association>
<collection property="students" javaType="list" column="id" ofType="student" select="findstudent"></collection>
</resultMap>
<!--用宿舍id查询宿舍信息-->
<select id="find" parameterType="int" resultMap="dormMap">
SELECT id,dnum,adminid ,use_date FROM dorm WHERE id=#{id}
</select>
<!--用adminid查询admin的账号-->
<select id="findadmin" resultType="admin">
select account from admin where id=#{adminid}
</select>
<!--用宿舍id查询该宿舍的学生信息-->
<select id="findstudent" resultType="student">
select id,num,name from student where dormid=#{id}
</select>
动态Sql
mybatis最强大的特性之一就是动态sql功能。
Mybatis实现动态sql的主要元素有:if、where、choose(when、otherwise)、trim、set 、foreach。
if元素
if可以对入参元素进行判断 ,test=“判断条件”。例如
<select id="findStudents" resultType="Student">
select * from student
<where>
<if test="num!=0">
and num=#{num}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</where>
</select>