目录
java后端框架简介
mybatis(数据层):对jdbc进行封装
spring(业务层):对整个java后端架构进行管理
springweb:对web层(servlet)进行封装
springboot:对spring框架的搭建进行封装
除此之外还有很多,但是今天我们这里主要介绍mybatis。
一、Mybatis概述
原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移
到了 Google Code,随着开发团队转投Google Code 旗下,iBatis3.x正式更名为MyBatis。
MyBatis 是一款优秀的持久层框架。
Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可。
MyBatis 可以使用 XML 或注解来配置和映射,将数据库中的记录映射成Java 的 POJO(Plain
Old Java Objects,普通的 Java 对象),是一种 ORM(ORM)Object Relational Mapping 对象关系映射)
实现.
二、Mybatis环境搭建
(1)在数据库中创建一张表和表对应的实体集
这里我以admin表为例
(2)在IDEA中创建一个Maven项目
在pom.xml文件中导入MyBatis jar包,MySQL数据库驱动包(注:在<project>标签中新建<dependence>标签并在此标签中导入一下代码)
<!--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>
最终结果如图所示
(3)创建MyBatis全局配置文件
将与数据库链接的信息抽取到该配置文件,使用时直接读取,避免大量重复代码。
在项目main文件夹中有一个resources文件夹,我们在他下面创建一个.xml文件,这里我命名为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>
<!--mybatis核心全局配置文件-->
<settings><!--mybatis日志,用于控制台打印日志信息-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--配置数据库连接相关信息-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--type="POOLED" 使用数据库连接池,默认创建10个链接对象,减少创建销毁操作--><!--链接数据库,每次访问数据库,创建一个connection,用完关闭-->
<!--但访问量大,每次都要创建连接对象,用完关闭,比较耗时-->
<!--但数据库连接池:在池集合中提前创建连接对象,用时拿,用完还,不用创建销毁,省时-->
<dataSource type="POOLED">
<!--数据库连接配置-->
<!--driver的value里面根据自己的MySQL版本进行填写,我用的是MySQL8,其他版本导入路径请自行搜索填写。-->
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!--url中的127.0.0.1:3306请填写自己链接数据库时显示的链接地址,/ssmdb是本人创建admin表所属的数据库名称,请根据自己创表所在数据库及时变更,剩下部分照抄即可。-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai" />
<!--请根据自己连接数据库的账户密码填写-->
<property name="username" value="root" />
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
(4)创建访问的接口,定义方法
如图,在java文件夹中根据自己习惯创建下级文件夹,最后创建一个接口,这里我以AdminDao为例。在接口中定义方法(如下代码)
public interface AdminDao{
Admin findAdminById(int id);
}
创建模型类,这里示例是admin类,getter、setter类中的属性,重写toString方法
(5)创建sql映射文件(用于sql实现)
在如图红框文件夹下创建mapper文件夹并创建一个Mapper.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="接口的地址">
<!--根据与数据库交互的具体需要填写相应标签和sql语句-->
</mapper>
这里namespace =“接口的地址”就是上面创建AdminDao接口的类的路径,我的是com.mybatispro.dao.AdminDao,接下来我们对admin表中对应id的成员信息进行查询操作。
<?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="接口的地址">
<!--id="接口中对应方法名" parameterType="方法传入的数据类型" resultType="项目中该类的路径"-->
<select id="findAdminById" parameterType="int" resultType="com.mybatispro.model.Admin">
select * from admin where id = #{id} <!--填写sql语句,#{id}表示通过发放传入sql的id信息-->
</select>
</mapper>
注:<select id=" ">中id名称必须和上面定义的接口中对应的方法名一致
#{} 是占位符,采用预编译方式向sql中传值,放置sql注入,一般传值我们选择此种方式
这里还需要注册映射文件。打开我们创建的mybatis.xml文件,创建以下标签进行操作
<!--注册映射文件-->
<mappers>
<mapper resource="com.mybatispro.mapper/AdminMapper.xml"></mapper>
</mappers>
resource的值是项目中映射文件的路径,以后每创建一个模块的映射文件都要来这里进行注册,效果如下:
(6)测试
这里我创建了一个Test1的类用来测试
API 接口说明:SqlSessionFactory 接口使用 SqlSessionFactory 来创建 SqlSession,一旦创建 SqlSessionFactory 就会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建它,一个应用运行中也不建议多次创建 SqlSessionFactory。SqlSession 接口Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方法,与数据库会话完成后关闭会话。
package com.mybatispro.test;
import com.mybatispro.dao.AdminDao;
import com.mybatispro.model.Admin;
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 Test1 {
public static void main(String[] args) throws IOException {
//1.mybatis读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//2.创建 SqlSessionFactory,用来创建SqlSession对象(连接数据库的会话对象,类似connection)
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//3.创建SqlSession对象
SqlSession sqlSession = sessionFactory.openSession();
//4.创建接口代理对象(因为接口是无法创建对象的,这里只是创建的代理对象仍保持AdminDao类型而已),我的示例接口和类为 AdminDao和Admin 大家请以自己为准
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
//5.调用方法
Admin admin = adminDao.findAdminById(1);//让代理对象帮我们调用映射文件中与此接口名称相同的方法
System.out.println(admin);
//6.关闭会话对象
sqlSession.close();//关闭与数据库的链接对象
}
}
具体代码如上,请一定认准导入接口的位置,是在Apache的ibatis包下!!!
如下是查询结果,找到了数据库表中id为1的admin信息

补充1:
这里推荐大家下载一个插件,可以在我们输错地址或方法名等错误时及时报错
在顶部工具栏的File项中找到setting设置,下载下图中的插件。
补充2:
映射文件 <select>标签中的resultType属性的值我们是以该类在项目中的路径命名,但每次写一长串路径不仅麻烦还不美观,因此我们可以通过给类配置别名来简化操作,通过给定一次该类所在文件夹的路径,以使以后每次调用该文件夹中的类只需写出类名即可。
在mybatis.xml文件的<configuration>标签中写入以下代码
<!--为类配置别名-->
<typeAliases>
<package name="类所在包名"/>
</typeAliases>
自此,我们再进行有关Admin类相关的操作时,就可简化书写
补充3:
请根据下图所示,严格遵守映射文件中各属性内容与相应接口方法对应规范!
三、封装、参数传递
因为mybatis读取配置文件和创建 SqlSessionFactory,用来创建SqlSession对象实际上只用执行一次即可,因此我们可以重写一个类,将这两个步骤写到一个静态代码块中,每次加载时执行一次即可。
package com.mybatispro.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 sqlSessionFactory = null;
static {
//1.mybatis读取配置文件
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis.xml");
} catch (IOException e) {
e.printStackTrace();
}
//2.创建 SqlSessionFactory,用来创建SqlSession对象(连接数据库的会话对象,类似connection)
//SqlSessionFactory只需创建一个,不需要销毁
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
//获得SqlSession对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
这样我们每次测试时就可以省去测试代码中的1、2行。
(1)单个参数传递
直接传参,接口中写出相应方法。
public class Test2 {
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
Admin admin = adminDao.findAdminAccount("admin");
System.out.println(admin);
sqlSession.close();
}
}
//Admin findAdminAccount(String account);接口中的方法
(2)多个参数传递
使用@Param(“id”)绑定参数再传递
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//生成接口代理对象
adminDao.login("admin","111");
sqlSession.close();
}
//Admin login(@Param("acc")String account,@Param("pwd")String password);接口中方法
mapper.xml中代码
<select id="login" resultType="Admin">
select * from admin where account = #{acc} and password = #{pwd}
</select><!--这里#{acc}便取得是@Param绑定的数据-->
创建类传参
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//生成接口代理对象
Admin admin1 = new Admin();
admin1.setAccount("admin");
admin1.setPassword("111");
adminDao.login1(admin1);
sqlSession.close();//关闭连接对象,如果使用数据库连接池功能,本质上是还给连接池
}
//Admin login1(Admin admin);接口中方法
mapper.xml中代码
<select id="login1" parameterType="Admin" resultType="Admin">
select * from admin where account = #{account} and password = #{password}
</select><!--这里#{account}便取得是admin类中的数据-->
(3)返回多个结果
这里我们就需要List来进行存储了
public static void main(String[] args) {
SqlSession sqlSession = MyBatisUtil.getSqlSession();
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
List<Admin> admins = adminDao.findAdmin();
sqlSession.close();
}
//List<Admin> findAdmins(@Param("orderColumn") String orderColumn);接口中的方法
mapper.xml中代码
<select id="findAdmins" resultType="Admin" parameterType="string">
select ${orderColumn} from admin order by ${orderColumn} desc
</select>
这里我们注意到sql中属性名不再用#{},而是${}
#{} 和 ${} 区别:#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入#{}:delete from admin where id=#{id}结果: delete from admin where id = ?${}会将将值以字符串形式拼接到 sql 语句, ${ }方式无法防止 Sql 注入${}: delete from admin where id=’${id}’结果: delete from admin where id=’1’一般是#{ } 向 sql 传值使用, 而使用${ }向 sql 传列名例如在 order by $ {column} 语句后面可以动态替换列名, select后的列名也可以改变
以上就是对mybatis框架的搭建和初步认识,接下来我将会分享更多有关mybatis框架的内容,敬请期待吧!