MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,而且更名为MyBatis,是一个基于Java的持久层框架。html
在咱们传统的 JDBC 中,咱们除了须要本身提供 SQL 外,还必须操做 Connection、Statment、ResultSet,不只如此,为了访问不一样的表,不一样字段的数据,咱们须要些不少雷同模板化的代码,闲的繁琐又枯燥。java
而咱们在使用了 MyBatis 以后,只须要提供 SQL 语句就行了,其他的诸如:创建链接、操做 Statment、ResultSet,处理 JDBC 相关异常等等均可以交给 MyBatis 去处理,咱们的关注点因而能够就此集中在 SQL 语句上,关注在增删改查这些操做层面上。mysql
而且 MyBatis 支持使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。git
首先,咱们须要先下载和搭建 MyBatis 的开发环境。github
打开连接 http://github.com/mybatis/mybatis-3/releases 下载 MyBatis 所须要的包和源码,当前最新版本为 3.4.6,官方还提供了文档: 戳这里,虽然感受写得通常,但仍是有一些参考价值...唉,别当教程看,当字典看!web
下载好 MyBatis 的包解压后,能够获得如下的文件目录:sql
其中 mybatis-3.4.6.jar 包就是 MyBatis 的项目工程包,【lib】文件夹下就是 MyBatis 项目须要依赖的第三方包,pdf 文件是它英文版的说明,不要英文也能够戳上面的连接。数据库
IDEA 默认是不支持 MyBatis 开发的,须要本身下载第三方插件来支持,惋惜的是功能强大的【MyBatis Plugin】是收费的,须要咱们本身破解!apache
在【File】菜单下找到【Settings】,而后再【Plugins】下点击【Browse repositories..】:编程
在搜索栏中输入【MyBatis Plugin】,而后点击【Install】(我这里是安装好了因此没有这个按钮):
有幸找到最新的破解方法,最新支持破解的版本号为:v3.58 crack,下载连接:戳这里
把它下载到 【D:\Download】目录下,打开 idea.vmoptions (【Help】->
【Eidt Custom VM Options...】):
在下方插入 -javaagent:D:/Download/ideaagent-1.2.jar
重启 IDEA,首次启动须要信任本地服务器 ssl 证书,点击接受后如未激活,再次重启便可:
至此,咱们就为 IDEA 配置好了 MyBatis 的开发环境,能够检验一下是否安装成功:
咱们来实际开发一个 MyBatis 程序,感觉一下。
首先咱们建立一个数据库【mybatis】,编码方式设置为 UTF-8,而后再建立一个名为【student】的表,插入几行数据:
DROP DATABASE IF EXISTS mybatis; CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8; use mybatis; CREATE TABLE student( id int(11) NOT NULL AUTO_INCREMENT, studentID int(11) NOT NULL UNIQUE, name varchar(255) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO student VALUES(1,1,'我没有三颗心脏'); INSERT INTO student VALUES(2,2,'我没有三颗心脏'); INSERT INTO student VALUES(3,3,'我没有三颗心脏');
在 IDEA 中新建一个 Java 工程,并命名为【HelloMybatis】,而后导入必要的 jar 包:
在 Package【pojo】下新建实体类【Student】,用于映射表 student:
package pojo; public class Student { int id; int studentID; String name; /* getter and setter */ }
在【src】目录下建立 MyBaits 的主配置文件 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> <!-- 别名 --> <typeAliases> <package name="pojo"/> </typeAliases> <!-- 数据库环境 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射文件 --> <mappers> <mapper resource="pojo/Student.xml"/> </mappers> </configuration>
在 Package【pojo】下新建一个【Student.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="pojo"> <select id="listStudent" resultType="Student"> select * from student </select> </mapper>
<typeAliases>
别名,因此在这里的 resultType
能够直接写 Student,而不用写类的全限定名 pojo.Studentnamespace
属性其实就是对 SQL 进行分类管理,实现不一样业务的 SQL 隔离在 Package【test】小建立测试类【TestMyBatis】:
package test; 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 pojo.Student; import java.io.IOException; import java.io.InputStream; import java.util.List; public class TestMyBatis { public static void main(String[] args) throws IOException { // 根据 mybatis-config.xml 配置的信息获得 sqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 而后根据 sqlSessionFactory 获得 session SqlSession session = sqlSessionFactory.openSession(); // 最后经过 session 的 selectList() 方法调用 sql 语句 listStudent List<Student> listStudent = session.selectList("listStudent"); for (Student student : listStudent) { System.out.println("ID:" + student.getId() + ",NAME:" + student.getName()); } } }
运行测试类:
咱们来看看常规的一套增删改查应该怎么实现:
首先,咱们在 SQL 映射文件中新增语句,用来支撑 CRUD 的系列操做
<?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="pojo"> <select id="listStudent" resultType="Student"> select * from student </select> <insert id="addStudent" parameterType="Student"> insert into student (id, studentID, name) values (#{id},#{studentID},#{name}) </insert> <delete id="deleteStudent" parameterType="Student"> delete from student where id = #{id} </delete> <select id="getStudent" parameterType="_int" resultType="Student"> select * from student where id= #{id} </select> <update id="updateStudent" parameterType="Student"> update student set name=#{name} where id=#{id} </update> </mapper>
package test; 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 pojo.Student; import java.io.IOException; import java.io.InputStream; import java.util.List; public class TestMyBatis { public static void main(String[] args) throws IOException { // 根据 mybatis-config.xml 配置的信息获得 sqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 而后根据 sqlSessionFactory 获得 session SqlSession session = sqlSessionFactory.openSession(); // 增长学生 Student student1 = new Student(); student1.setId(4); student1.setStudentID(4); student1.setName("新增长的学生"); session.insert("addStudent", student1); // 删除学生 Student student2 = new Student(); student2.setId(1); session.delete("deleteStudent", student2); // 获取学生 Student student3 = session.selectOne("getStudent", 2); // 修改学生 student3.setName("修改的学生"); session.update("updateStudent", student3); // 最后经过 session 的 selectList() 方法调用 sql 语句 listStudent List<Student> listStudent = session.selectList("listStudent"); for (Student student : listStudent) { System.out.println("ID:" + student.getId() + ",NAME:" + student.getName()); } // 提交修改 session.commit(); // 关闭 session session.close(); } }
上述的程序中:
session.insert("addStudent", student1);
增长了一个 ID 和 studentID 都为 4,名字为“新增长的学生” 的学生session.delete("deleteStudent", student2);
删除了 ID = 1 的学生Student student3 = session.selectOne("getStudent", 2);
获取了 ID = 2的学生session.update("updateStudent", student3);
将 ID = 2 的学生的名字修改成 “修改的学生”session.commit()
来提交事务,也能够简单理解为更新到数据库运行得到正确结果:
若是要对数据库中的 student 表进行模糊查询,须要经过匹配名字中的某个字来查询该用户。
咱们首先在 Student.xml 配置文件中配置 SQL 映射:
<select id="findStudentByName" parameterMap="java.lang.String" resultType="Student"> SELECT * FROM student WHERE name LIKE '%${value}%' </select>
<select>
标签对中 SQL 语句的 “${}” 符号,表示拼接 SQL 串,将接受的参数内容不加任何修饰地拼接在 SQL 中,在 “${}” 中只能使用 value
来表明其中的参数。由于是模糊查询,因此获得的查询结果可能不止一个,因此咱们使用 SqlSession 的 selectList() 方法,写一个测试方法:
@Test public void test() throws IOException { // 根据 mybatis-config.xml 配置的信息获得 sqlSessionFactory String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 而后根据 sqlSessionFactory 获得 session SqlSession session = sqlSessionFactory.openSession(); // 模糊查询 List<Student> students = session.selectList("findStudentByName", "三颗心脏"); for (Student student : students) { System.out.println("ID:" + student.getId() + ",NAME:" + student.getName()); } }
测试结果:
value
或者其余任意名称来获取。欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz 欢迎关注公众微信号:wmyskxz_javaweb 分享本身的Java Web学习之路以及各类Java学习资料