Mybatis
一,Mybatis概述
1.历史:
Mybatis原本是apache的一个项目,原名ibatis,2010转投谷歌,从3.0开始更名为mybatis
Apache软件基金会(Apache Software Foundation,简称 ASF)是专门为运作一个开源软件项目的Apache的团体提供支持的非盈利性组织
2.Mybatis是什么:
mybatis是一个优秀的数据持久层框架
mybatis对jdbc进行了封装,避免了手动设置参数,手动封装查询结果,还将jdbc中的接口进行封装,为我们提供常用的类来实现还可以使用xml或注解方式向数据库发送sql
dao data access object 数据访问对象 把这一类称为数据访问层类(数据持久层类)
jdbc是原生写法,最基本的接口,类实现
二,Mybatis环境搭建
1.框架:
就是对现有的一些基本的写法的代码进行封装(包装)
2.框架的搭建:
(1) 创建表,创建项目
create database mybatisdb charset utf8create table admin(id int primary key auto_increment,account varchar(20),password varchar(20),gender char(1),reg_time datetime
)
(2) 导入相关的jar文件(包)
创建lib文件后将MyBatis jar包和mysql数据库驱动包拖入lib文件中
经过这几步操作后,成功的将MyBatis jar包和mysql数据库驱动包导入
(3)创建mybatis核心配置文件(数据库链接,全局配置)
在项目名下创建recourse目录。选中,右键设置为资源目录
在resource目录中新建FXML File项目命名为mybatis.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">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="自己补全...?serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="自己密码"/>
</dataSource>
</environment>
</environments>
</configuration>
(4) 创建表对应的模型类,添加对应的属性
先进行创建model包将所需模型类写入该包中
若不做过多的使用可只写setter方法和toString方法
package com.ffyc.mybatisdemo.model;import javax.xml.crypto.Data;
import java.util.Date;
/*
模型类,与数据库中的表是对应的,用来封装damin信息*/public class Admin {private int id;private String account;private String password;private char gender;private Date regtime;public Admin(){System.out.println("Admin的无参构造方法");}public void setId(int id) {this.id = id;}public void setAccount(String account) {this.account = account;}public void setPassword(String password) {this.password = password;}public void setGender(char gender) {this.gender = gender;}public void setRegtime(Date regtime) {this.regtime = regtime;}@Overridepublic String toString() {return "Admin{" +"id=" + id +", account='" + account + '\'' +", password='" + password + '\'' +", gender=" + gender +", regtime=" + regtime +'}';}
}
(5)创建Admin操作的接口,定义操作方法
在接口中定义所需使用的方法
package com.ffyc.mybatisdemo.dao;import com.ffyc.mybatisdemo.model.Admin;
import org.apache.ibatis.annotations.Param;import java.util.ArrayList;/*
定义功能*/
public interface AdminDao {/*在接口中定义一个通过id查询admin的方法*/Admin findAdminByID(int ID);// Admin login(@Param("acc") String account, @Param("pwd") String password);Admin login(Admin admin);//查询管理员总人数,返回简单类型数据ArrayList<Admin> findAdmincount();//增int insertAdmin(Admin admin);//删除int deleteAdmin(Admin admin);//改int uppdateadmin(Admin admin);
}
(6)创建sql映射文件 写各种操作sql
在mappers文件夹中创建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">
<!--转门写sql语句的文件-->
<mapper namespace="接口的地址"><!--接口完整的地址--><!--接口中的方法名与映射文件中的标签id相同接口中的参数类型与parameterType接口中的方法地返回值类型与resultType可以自动地将查询结果封装到我们指定的集合中需要注意:表中列名,需要与模型类中的属性名一致
--><select id="findAdminById"
parameterType="int" <!--所给值的类型--> resultType="com.ffyc.mybatis.model.Admin"<!--返回值类型-->>
select * from admin where id = #{id}<!--需符合sql语句规范-->
</select>
</mapper>
然后根据自己在接口中定义的方法进行改写以上文呈现的Admindao接口中的方法为例
<?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">
<!--转门写sql语句的文件-->
<mapper namespace="com.ffyc.mybatisdemo.dao.AdminDao">
<!--接口中的方法名与映射文件中的标签id相同接口中的参数类型与parameterType接口中的方法地返回值类型与resultType可以自动地将查询结果封装到我们指定的集合中需要注意:表中列名,需要与模型类中的属性名一致
--><select id="findAdminByID" parameterType="int" resultType="Admin">select id,account,password,gender,regtime from admin where id = #{id}</select><select id="login" parameterType="Admin" resultType="Admin">select id,account,gender,regtime from admin where account=#{account} and password=#{password}</select><insert id="insertAdmin" parameterType="Admin" >insert into admin(account,password,gender,regtime)value(#{account},#{password},#{gender},now())
</insert><update id="uppdateadmin" parameterType="Admin">update admin set account=#{account},password=#{password},gender=#{gender} where id=#{id}</update><delete id="deleteAdmin" parameterType="Admin"><!--这里的parameterType指传入接口中传入的参数类型,resultType指返回值的类型,进行增删改查操作是返回的是int类型行数,不需要在这里写resultType,但在查询操作中,查询的结果是一个数值,仍然需要在这里声明结果返回的类型-->delete from admin where id=#{id}</delete><select id="findAdmincount" resultType="Admin">select * from admin</select></mapper>
(7)测试读取配置文件 创建链接对话对象,获得接口代理对象,调用方法执行sql,得到结果mtbatis查询时,可以做到自动结果映射
写一个test测试类
package com.ffyc.mybatisdemo.test;import com.ffyc.mybatisdemo.dao.AdminDao;
import com.ffyc.mybatisdemo.model.Admin;
import com.ffyc.mybatisdemo.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.ArrayList;public class test {public static void main(String[] args) throws IOException {
// test.insert();
// test.update();
// test.delete();test.find();}public static void find() throws IOException {//模拟组装要保存的管理员数据SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);ArrayList<Admin> admins= adminDao.findAdmincount();System.out.println(admins);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}public static void insert() throws IOException {//模拟组装要保存的管理员数据Admin admin = new Admin();admin.setAccount("222");admin.setPassword("222");admin.setGender('女');SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);int row = adminDao.insertAdmin(admin);System.out.println(row);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}public static void update() throws IOException {//模拟组装要保存的管理员数据Admin admin = new Admin();admin.setAccount("2223");admin.setPassword("2223");admin.setGender('男');admin.setId(4);SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);int row = adminDao.uppdateadmin(admin);System.out.println(row);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}public static void delete() throws IOException {//模拟组装要保存的管理员数据Admin admin = new Admin();admin.setId(5);SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);int row = adminDao.deleteAdmin(admin);System.out.println(row);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}}
(8)封装MybatisUtil类
由于每次写一个操作方法时都需要与数据库进行交互操作
所以可以写一个MybatisUtil类先创建一个工具包(util包)再将MybatisUtil类写在该包中
package com.ffyc.mybatisdemo.util;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.Reader;public class MybatisUtil {/*静态代码块在类第一次加载时,自动换行,只执行一次*/static SqlSessionFactory sessionFactory;static {//读取配置文件Reader reader = null;try {reader = Resources.getResourceAsReader("mybatis.xml");} catch (IOException e) {throw new RuntimeException(e);}//用来创建SqlSessionFactory,用来创建sqlsession,SqlSession类似于记得把车中的Connection//SqlSessionFactory在项目中只需要创建一个对象即可,里面读取到配置文件中的信息sessionFactory = new SqlSessionFactoryBuilder().build(reader);}public static SqlSession getSqlSession() throws IOException {// 创建SqlSession,域数据库会话对象,每与数据库交互一次,我们就创建一个SQL Session对象,就是一个链接通道,用完关闭SqlSession sqlSession = sessionFactory.openSession();return sqlSession;}}
API接口说明
SqlSessionFactory接口
使用SqlSessionFactory 来创建SqlSession,一旦创建SqlSessionFactory 就会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建它。
SqlSession接口
Sqlsession意味着创建与数据库链接会话,该接口中封装了对数据库操作的方法,与数据库会话完成后关闭会话。
3,Mybatis.xml中配置常用的标签(该功能需写在Mybatis.xml中)
(1)配置全局设置
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种方式:
SLF4J|LOG4J|JDK_LOGGINGCOMMONS_LOGGING|STDOUT_LOGGING
配置日志:
<!--配置全局设置-->
<settings><!--配置在控制台的打印日志的功能--><setting name="logImpl" value="STDOUT_LOGGING"/><!--可以把标准数据库列名和Java标准属性名自定映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换:
与输出日志信息一样属于全局变量
<!--当java中使用标准驼峰命名,数据库中使用下划线连接命名在全局设置中设置-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
(2)为模型类取别名
在配别名后就不需要在parameterType与resultType中写出完整的类地址
在项目中只存在一个模型类
<!--type="模型类完整的地址" alias="别名"-->
<typeAliases><typeAlias type="com.ffyc.mybatispro.dao.AdminDao" alias="admin"/>
</typeAliases>
在项目
<typeAliases><package name="com.ffyc.mybatispro.model"/><!-- 配置模型的类的包地址-->
</typeAliases>
中存在多个模型类(一般使用此方式)
(3)注册sql映射文件,一个功能定义一个mapper
<mappers><mapper resource="mappers/AdminMapper.xml"/>
</mappers>
这里指resource="sql映射文件地址"
4,参数传递
(1)单个参数直接传递
在Admindao中进行传递
Admin selectAdmin(int id);
在AdminMapper.xml中使用传过来的参数(以下相同)
<select id="findAdminById" parameterType="int" resultType="Admin">select id,account,password,gender,reg_time from admin where id = #{id}
</select>
(2)多个参数使用@Param(“”)绑定
Admin selectAdmin(@Param("account")String account,@Param("password")String
password);
<select id="selectAdmin" resultType="Admin">
select id, account, password from admin
where account= #{account} and password=#{password}
</select>
(3)如果传入一个复杂的对象,就需要使用parameterType参数进行类型定义,例如:
Admin selectAdmin(Admin admin);
<select id="selectAdmin" parameterType="Admin" resultType="Admin">
select id, account, password from admin
where account= #{account} and password=#{password}
</select>
5,增删改操作
(1)增
<insert id="唯一标识" parameterType="参数类型">
insert into admin(account,password)values(#{account},#{password})
</insert>
(2)删
<delete id="唯一标识" parameterType="参数类型">
delete from admin where id= #{id}
</delete>
(3)改
<update id="唯一标识" parameterType="参数类型">
update admin set account= #{account},password= #{password} where id= #{id}
</update>
6,查询操作
(1)简单查询
<select id="findAdminInfoCount" resultType="int">
select count(*) from admin
</select>
查询多条数据,返回集合:
<select id="findAdminArray" resultType="admin"><!--这里resultType返回的类型一定是admin类型而不是集合-->select * from admin</select>
(2)对象映射
如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到java对象中.
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>
<select id="findAdminInfoById" parameterType="int"resultType="Admin">
select * from admin where id=#{id}
</select>