Mybatis的入门程序
目录:
- Mybatis的入门程序
- 一、查询数据
- 根据表 “主键id” 查询数据
- 模糊查询
- 二、添加数据
- 三、更新数据
- 四、删除数据
作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!
该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!(侵权可联系我,进行删除,如果雷同,纯属巧合)
一、查询数据
在实际开发中,查询操作 通常都会涉及单条数据的 ① 根据表 “主键id” 查询数据,以及多条数据的 ②模糊查询。
根据表 “主键id” 查询数据
根据 “表主键id” 查询数据 主要是通过查询数据库表中的主键( 这里表示唯一的 主键id号 )来实现的。
- 创建 表t_customer
导入 Mybatis框架依赖 (引入Mybatis的核心包 和 Mybatis的依赖包) 和 MySQL驱动JAR: [Mybatis网址
获得Mybatis核心包 和 Mybatis的依赖包MySQL驱动JAR
log4j.properties :
# 因为Mybatis默认使用功能log4j来输出日志信息,所以如果要查看控制处输出sql语句 # 就要在classpath路径下配置log4g的配置文件 : log4j.properties (log4j要配置的"日志文件") : # 即在src目录下配置 log4j.properties配置文件,然后将以下的配置信息复制到配置文件中# Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... #将com.myh包下所有类的日志记录设计为DEBUG log4j.logger.com.myh=DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
由于MyBatis默认使用log4j输出日志信息,所以 如果要查看控制台的输出SQL语句,那么就需要在classpath路径下配置其日志文件。在项目的src目录下创建log4i.properties 文件。
上述代码中 :包含了全局的日志配置、MyBatis的日志配置 和 控制台输出,其中Mybatis的日志配置用于将com.myh包下所有类的日志记录级别设置为DEBUG。
(可在MyBatis使用手册中的Logging可以找到图上述代码中的的配置信息,只需将其复制到项目的log4j配置文件中,并对MyBat志配置信息进行简单修改即可使用。)
- Customer.java :
package com.myh.po; public class Customer { // "顾客"类 --"持久化"类private Integer id; //主键private String username; //客户名称private String jobs; //职业private String phone; //电话public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getJobs() {return jobs;}public void setJobs(String jobs) {this.jobs = jobs;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Customer{" +"id=" + id +", username='" + username + '\'' +", jobs='" + jobs + '\'' +", phone='" + phone + '\'' +'}';} }
从上述代码可以看出,持久化类Customer 与 普通的JavaBean 并没有什么区别,只是其属性字段与数据库中的表字段相对应。实际上,Customer 就是一个POJO (普通Java对象)。MyBatis就是采用POJO作为持久化类来完成对数据库操作的。
- CustomerMapper.xml :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace的命名空间 --> <mapper namespace="CustomerMapper"><!-- 根据客户编号获取客户信息--><select id="findCustomerById" parameterType="Integer" resultType="com.myh.po.Customer">select * from t_customer where id = #{id}</select> </mapper>
第2-3行是MyBatis的约束配置,第6-12行是需要程序员编写的映射信息。其中,<mapper>元素 是配置文件的根元素,它包含一个 namespace属性,该属性为这个 <mapper> 指定了 唯一的命名空间,通常会设置成 “包名+SQL映射文件名”的形式。
子元素 <select> 中的信息是用于 执行查询操作 的配置,其 id 属性是 <select>元素在映射文件中的唯一标识 ,parameterType 属性用于指定传入参数的类型,这里表示传递给执行SQL的是一个Integer类型的参数,resultType 属性用于指定返回结果的类型,这里表示返回的数据是Customer类型。
在定义的查询SQL语句中,“#{ }“用于表示一个 占位符,相当于“?", 而 “#[ id ] " 表示 该占位符 待接收参数的名称为id。
- 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><!--Mybatis的配置文件: mybatis-config.xml : 为全局配置文件,配置了“运行环境的信息”,主要内容是 : 数据库的连接 (其属于Mybatis操作步骤的第一步 : 读取Mybatis-config.xml配置文件的"先行要准备好的内容") --><!-- 1.配置环境,默认环境id为mysql --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><!-- 用于指定MyBatis获取数据库连接的方式。“POOLED”代表的是连接池。 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 2.配置Mapper文件的位置 : mybatis.config.xml配置文件要读取映射文件: 即读取mapper.xml文件 --><!-- 因为按照"Mybatis框架的执行流程图 : 加载了mybatis-config.xml配置文件之后,是要加载"映射文件"的,所以 --><!-- 读取"映射文件" --><mappers><mapper resource="com/myh/mapper/CustomerMapper.xml"/></mappers></configuration>
在上述代码中,第2~3行是MyBatis的配置文件的约束信息,下面 <configuration>元素中的内容就是开发人员需要编写的配置信息。这里按照<configuration>子元素的功能不同,将配置分为了两个步骤 :第1步 配置连接数据库的环境,第2步 配置了Mapper的位置。
- MybatisTest.java (测试类)
package com.myh.test;import com.myh.po.Customer; 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 org.junit.Test;import java.io.InputStream;public class MybatisTest { // 测试类 : 根据id来查询数据/*** 根据客户编号查询客户信息*/@Test //Junit4"单元测试"public void findCustomerByIdTest() throws Exception{//1.读取mybatis框架的配置文件String resource = "mybatis-config.xml";//通过“输入流”读取mybatis配置文件/*在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置,可实施加载“映射文件”*/InputStream inputStream = Resources.getResourceAsStream(resource);//2.根据配置文件“构建会话工厂 : SqlSessionFactory ”SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.通过SqlSessionFactory(会话工厂)创建SqlSession("会话"对象)SqlSession sqlSession = sqlSessionFactory.openSession();//4.SqlSession执行"映射文件"中定义的SQL,并返回"映射结果"//SelectOne()中的参数为 : "映射文件"中的sql语句 + 该sql语句对应的参数为:1 ---执行获得指定id下的“顾客信息”Customer customer = (Customer)sqlSession.selectOne("CustomerMapper.findCustomerById", 1);//打印输出结果System.out.println(customer.toString());//5.关闭SqlSessionsqlSession.close();} }
在测试类的 的findCustomerByldTest( )方法中,首先通过输入流读取了配置文件 ( mybatis-config.xml ),
根据配置文件构建了SqlSessionFactory 对象 (会话工厂对象)。接下来通过SqlSessionFactory 对象的 openSession( ) 方法来获得 SqlSession对象。SelectOne( ) 方法的第1个参数表示 映射SQL的标识字符串,它由CustomerMapper.xml 中 <mapper> 标签的 namespace的值 + . + <select>标签的 id值 组成。 第2个参数表示查询所需要的参数。即查询的是客户表中id为1的客户。最后,程序执行完毕时,要关闭SqlSession。
模糊查询
模糊查询 的实现非常简单,只需要在 根据 “主键id查询” 查询的基础上进行部分修改 即可。
( “映射文件” 和 “测试类” 中的代码有所不同,其他代码都是基本相同的。)
CustomerMapper2.xml (要自动在 mybatis-config.xml中 加载此 ”映射文件“)<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace的命名空间 --> <mapper namespace="CustomerMapper2"><!-- 模糊查询 (根据username来进行"模糊查询") --><select id="findCustomerByName" parameterType="String" resultType="com.myh.po.Customer">select * from t_customer where username like '%${value}%'-- 此处通过 ${}来进行sql的拼接,无法防止SQL注入问题,可用concat()函数 + #{} 解决该问题-- select * from t_customer where username like concat('%',#{value},'%') : 该sql语句不会产生SQL注入问题</select></mapper><!--#{} : 相当于占位符${} : 拼接sql字符串-->
与根据表 “主键id” 相比,上述配置代码中的属性 id、parameterType 和 SQL语句相应变化。
SQL语句中的“${ } " 用来表示用于 拼接SQL语句 的 字符串,即不加解释的原样输出。 “${value}”表示 要拼接的是简单类型参数 ( 表示要拼接在sql语句后面的参数名是value )。
注意点 :
在使用“${ }” 进行SQL字符串拼接时,无法防止SQL注入问题。所以想要既能实查询,又要防止SQL注入,可以对上述映射文件CustomerMapper.xml中模糊查询进行修改,使用MySQL中的 concat( )函数进行字符串拼接。
CustomerMapper2.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace的命名空间 --> <mapper namespace="CustomerMapper2"><!-- 模糊查询 (根据username来进行"模糊查询") --><!--此处通过 ${}来进行sql的拼接,无法防止SQL注入问题,可用concat()函数 + #{} 解决该问题select * from t_customer where username like '%${value}%' : 此sql语句会产生SQL注入问题,下面那个语句则不会--><select id="findCustomerByName" parameterType="String" resultType="com.myh.po.Customer">select * from t_customer where username like concat('%',#{value},'%')</select></mapper><!-- #{} : 相当于占位符${} : 拼接sql字符串 -->
MybatisTest2.java
package com.myh.test;import com.myh.po.Customer; 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 org.junit.Test;import java.io.IOException; import java.io.InputStream; import java.util.List;/*** 模糊查询 : 只是"映射文件" 和 "测试类"中的部分有所不同,其他代码都是基本相同的*/ public class MybatisTest2 { // 测试类 : 模糊查询@Testpublic void findCustomerByNameTest() throws IOException {//1.读取mybatis-config.xml配置文件 (通过"输入流"来读取)String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根据配置文件(通过SqlSessionFactoryBuilder对象 )创建"会话工厂"对象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.执行映射文件中的sql语句,并返回映射结果List<Customer> customers = sqlSession.selectList("CustomerMapper2.findCustomerByName", "张");//打印输出结果for (Customer customer : customers) {System.out.println(customer);}//5.关闭SqlSessionsqlSession.close();} }
二、添加数据
在MyBatis的 映射文件 (XxxMapper.xml ) 中,添加操作 是通过 <insert>元素 来实现的。例如,向数据库中的 t customer表中插入一条数据可以通过如下配置来实现。
ps :
添加数据,也只是映射文件 和 测试类中的部分代码不同,其他代码基本都是相同的。CustomerMapper3.xml : (要自动在 mybatis-config.xml中 加载此 ”映射文件“)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--映射文件中,插入数据用 <insert>元素 --> <!-- #{} : 相当于"占位符" ${} : 相当于在sql语句后要拼接的"字符串" --> <mapper namespace="CustomerMapper3"><insert id="addCustomer" parameterType="com.myh.po.Customer">insert into t_customer(username,jobs,phone)values(#{username},#{jobs},#{phone})</insert> </mapper>
MybatisTest3.java (测试类)
package com.myh.test;import com.myh.po.Customer; 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 org.junit.Test;import java.io.IOException; import java.io.InputStream; import java.util.List;/*** 添加数据 : 只是"映射文件" 和 "测试类"中的部分有所不同,其他代码都是基本相同的*/ public class MybatisTest3 { // 测试类 : 添加数据@Testpublic void addCustomerTest() throws IOException {//1.读取mybatis-config.xml配置文件 (通过"输入流"来读取)String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根据配置文件(通过SqlSessionFactoryBuilder对象 )创建"会话工厂"对象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.SqlSession执行"添加数据"操作//4.1创建Customer对象,并向其中添加数据Customer customer = new Customer();customer.setUsername("小明");customer.setJobs("学生");customer.setPhone("123456");//4.2执行SqlSession的插入方法,返回Sql影响的行数int rows = sqlSession.insert("CustomerMapper3.addCustomer", customer);if (rows > 0) {System.out.println("你成功插入了" + rows + "条数据");} else {System.out.println("执行插入操作失败!");}//4.3提交事务sqlSession.commit();//5.关闭SqlSessionsqlSession.close();} }
在上述代码中,,首先创建了Customer对象,并向Customer对象中添加了属性值;然后通过SqlSession对象的insert( )方法执行插入操作,并通过该操作返回的数据来判断插入操作是否执行成功。最后通过SqlSesseion的commit( )方法提交了事务,并通过close()方法关闭了SqlSession。
三、更新数据
MyBatis的 更新操作 在映射文件 : XxxMapper.xml 中是通过配置 <update>元素 来实现的。如果需要更新数据,可以通过如下代码配置来实现。
ps :
更新操作 / 更新数据,也只是映射文件 和 测试类中的部分代码不同,其他代码基本都是相同的。CustomerMapper4.xml : (要自动在 mybatis-config.xml中 加载此 ”映射文件“)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--映射文件中,更新数据用 <update>元素 --> <!-- #{} : 相当于"占位符" ${} : 相当于在sql语句后要拼接的"字符串" --> <mapper namespace="CustomerMapper4"><update id="updateCustomer" parameterType="com.myh.po.Customer">update t_customer set username = #{username},jobs=#{jobs},phone=#{phone}where id = #{id}</update> </mapper>
MybatisTest4.java (测试类)
package com.myh.test;import com.myh.po.Customer; 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 org.junit.Test;import java.io.IOException; import java.io.InputStream;/*** 更新数据 : 只是"映射文件" 和 "测试类"中的部分有所不同,其他代码都是基本相同的*/ public class MybatisTest4 { // 测试类 : 更新数据@Testpublic void updateCustomerTest() throws IOException {//1.读取mybatis-config.xml配置文件 (通过"输入流"来读取)String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根据配置文件(通过SqlSessionFactoryBuilder对象 )创建"会话工厂"对象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.SqlSession执行"更新"操作Customer customer = new Customer();customer.setId(5);customer.setUsername("小明");customer.setJobs("高级软件开发工程师");customer.setPhone("12345678");int update = sqlSession.update("CustomerMapper4.updateCustomer", customer);if (update > 0) {System.out.println("你成功修改了" + update + "条数据");} else {System.out.println("执行修改操作失败!");}sqlSession.commit();//5.关闭SqlSessionsqlSession.close();} }
四、删除数据
MyBatis的 删除操作 在映射文件中是通过配置 <delete>元素 来实现的。在映射文件 : CustomerMapper4.xml中添加删除客户信息的SQL语句。
ps :
删除操作,也只是映射文件 和 测试类中的部分代码不同,其他代码基本都是相同的。CustomerMapper5.xml (要自动在 mybatis-config.xml中 加载此 ”映射文件“)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--映射文件中,删除数据用 <delete>元素 --> <!-- #{} : 相当于"占位符" ${} : 相当于在sql语句后要拼接的"字符串" --> <mapper namespace="CustomerMapper5"><update id="deleteCustomer" parameterType="Integer">delete from t_customer where id = #{id}</update> </mapper>
MybatisTest5.java (测试类)
package com.myh.test;import com.myh.po.Customer; 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 org.junit.Test;import java.io.IOException; import java.io.InputStream;/*** 删除数据 : 只是"映射文件" 和 "测试类"中的部分有所不同,其他代码都是基本相同的*/ public class MybatisTest5 { // 测试类 : 删除数据@Testpublic void addCustomerTest() throws IOException {//1.读取mybatis-config.xml配置文件 (通过"输入流"来读取)String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2.根据配置文件(通过SqlSessionFactoryBuilder对象 )创建"会话工厂"对象 : SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3.获得SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4.SqlSession执行"删除"操作int delete = sqlSession.delete("CustomerMapper5.deleteCustomer", 5);if (delete > 0) {System.out.println("你成功删除了" + delete + "条数据");} else {System.out.println("执行删除操作失败!");}sqlSession.commit();//5.关闭SqlSessionsqlSession.close();} }