SSM框架-MyBatis1
目录
一、什么是MyBatis框架
二、常见的java开发的框架
三、MyBatis的使用
四、MyBatis中常用的三个查询方法
五、单元测试
六、MyBatis中常用的DML方法
一、什么是MyBatis框架
1.官方API:https://mybatis.org/mybatis-3/zh/
二、常见的java开发的框架
1.MyBatis,ORM(Object Relational Mapping)框架,底层是对jdbc进行了封装。
2.Sprint,是一个容器。
3.SprintMVC,分层框架。
4.Struts2,功能类似于SprintMVC。
5.Hibernate,功能类似于MyBatis。
三、MyBatis的使用
1.MyBatis的前身是iBatis,是Apache下的一个开源项目,现在被迁移到了GitHub(代码托管服务平台)上。
(1)API中文使用文档:https://mybatis.org/mybatis-3/zh/ 。
(2)MyBatis各版本下载地址:https://github.com/mybatis/mybatis-3/releases 。
2.使用MyBatis需要从XML中构建SqlSessionFactory。
(1)SqlSessionFactory是用来帮助我们发送sql语句到数据库中查询数据的。
(2)如果想要使用5.X的驱动去连接8.X的数据库,那么需要在url中的?后面加一个serverTimeZone=CST,这个是设置时区的。
(3)在xml是不识别&符号的,需要使用"&"符号来代替。
(4)构建SqlSessionFactory步骤,以及发送sql语句:
- 在类中先加载application-dao.xml文件,这个文件是我们一开始就创建好的。
- java加载文件,会转换为流对象。
- 使用MyBatis中的类Resources.getResourceAsStream("application-dao.xml所在路径")将xml文件转换为一个流对象。
- 通过这个转化为流对象的xml文件创建SqlSessionFactory对象。
- SqlSessionFactory对象是一个接口,是不能直接new对象的,需要使用SqlSessionFactoryBuilder来new对象,然后.build(前面转换为流对象的xml文件)来获取到最终的SqlSessionFactory对象。
- 格式:SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(前面转换为流对象的xml文件);
- 由SqlSessionFactory对象创建发送sql语句的对象。
- 格式:SqlSession session = sqlSessionFactory .openSession();
- 指定发送的sql语句。
- 格式:session.selectList("映射文件中sql语句对应的id")。
(5)案例:
- 使用XML文件配置MyBatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器:
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//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"/> <!--表示当前的事务沿用JDBC的事务逻辑--><dataSource type="POOLED"> <!--当前使用连接池技术--><property name="driver" value="com.mysql.jdbc.Driver"/> <!--&表示&--><property name="url" value="jdbc:mysql://localhost:3306/xiangxue?serverTimeZone=CST&characterEncoding=utf-8"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><!--当前这个配置用来指定写sql语句的文件路径--><mapper resource="com/mybatis/mapper/UserMapper.xml"/></mappers> </configuration> - 使用XML文件配置映射文件,这个文件中存放的是sql语句,用来组织管理sql语句:
-
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper"><select id="selAll" resultType="com.mybatis.pojo.Users">select * from users</select> </mapper> - 构建SqlSessionFactory对象,并执行sql语句:
-
package com.mybatis.test;import com.mybatis.pojo.Users; 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.InputStream; import java.util.Arrays; import java.util.Collections; import java.util.List;public class Demo {public static void main(String[] args) {//加载application-dao.xml文件String resource = "application-dao.xml";//相对于当前的路径//java加载文件,转换为流对象try {InputStream inputStream = Resources.getResourceAsStream(resource);//通过这个xml文件来创建SqlSessionFactory对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//由sqlSessionFactory对象创建发送sql语句的对象SqlSession session = sqlSessionFactory.openSession();List<Users> users = session.selectList("selAll");//指定发送的sql语句是哪一条,在id为selAll的标签中for (Users u : users) {System.out.println(u);}session.close();//关闭资源} catch (IOException e) {e.printStackTrace();}} }
四、MyBatis中常用的三个查询方法
1.selectOne:用于查询单挑数据的情况,返回值是一个对象,如果没有查到任何数据,返回null。
(1)案例:
//查询单个数据
Users user = (Users) session.selectOne("selOne");
System.out.println("user: " + user);
2.selectList:用于查询多条数据的情况,返回值是一个list集合,如果没有查到任何数据,返回没有元素的集合(空集合,不是null)。
(1)案例:
//查询所有数据
List<Users> users = session.selectList("selAll");//指定发送的sql语句是哪一条,在id为selAll的标签中
for (Users u : users) {System.out.println(u);
}
3.selectMap:用于查询多条数据的情况,多条数据要形成一个Map集合,需要指定哪个属性作为key。如果查不到,返回一个空map集合(不是null)。
(1)selectMap有两个参数:
- 第一个参数:映射文件UserMapper.xml中标签的id。
- 第二个参数:指定对象的哪个属性作为结果中map的key。
(2)案例:
Map<Integer, Users> users2 = session.selectMap("selAll", "city");
System.out.println("map: " + users2);
五、单元测试
1.格式:@Test。
2.单元测试的注解,用于不使用main方式创建对象时,也可以直接调用方法。
3.注意:带参数的方法不可以使用单元测试,只能间接调用。
4.案例:
package com.mybatis.test;import org.junit.Test;public class Demo2 {/*** 新增用户* @Test 单元测试的注解,用于不使用main方式创建对象时,也可以直接调用方法*/@Testpublic void addUser(){System.out.println("单元测试");this.ddd("测试调用带参数的方法");}public void ddd(String s){System.out.println("s: " + s);}
}
六、MyBatis中常用的DML方法
1.insert:
(1)格式:
- 不带参数的:session.insert("映射文件中sql语句对应的id");
- 带参数的:session.insert("映射文件中sql语句对应的id",封装好的对象);
- 注意:要在映射文件中的sql语句的参数里取数据可以使用#{对象属性名}或者${对象属性名}。
2.delete:
(1)格式:
- 不带参数的:session.delete("映射文件中sql语句对应的id");
- 带参数的:session.delete("deleteUserParam",封装好的对象);
3.update:
(1)格式:
- 不带参数的:session.update("映射文件中sql语句对应的id");
- 带参数的:session.update("updateUser",封装好的对象);
- 注意:封装的数据,只写我们需要修改的列数据。
4.注意:
(1)DML要考虑事务处理(从mybatis的源码里看到事务默认是手动提交)。
(2)增删改返回的都是整数,所以resultType可以不写。
(3)在mybatis中事务默认情况下是手动提交,需要使用session.commit()提交事务。
(4)可以使用session.commit(true);去设置mybatis的事务为自动提交。
(5)如果在映射文件是sql语句中接收过来的数据是基本数据类型,那么使用#{param1}或者${param1}获取第一个参数,#{param2}或者${param2}获取第二个参数,以此类推。
5.案例:
(1)映射文件代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selAll" resultType="com.mybatis.pojo.Users">select * from users</select><select id="selOne" resultType="com.mybatis.pojo.Users">select * from users where uid = 1</select><insert id="addUser">insert into users values(null,'夏天','123','北京')</insert><update id="updateUser">update users set city='上海' where username='夏天'</update><delete id="deleteUser">delete from users where uid = 3</delete><!--接收传过来的对象数据,使用#{属性名}获取--><insert id="addUserParam">insert into users values(null,#{username},#{password},#{city})</insert><update id="updateUserParam">update users set city = #{city} where username = #{username}</update><delete id="deleteUserParam">delete from users where uid = #{uid}</delete><!--接收过来的数据是基本数据类型,那么使用#{param1}获取第一个参数,#{param2}获取第二个参数,以此类推--><delete id="deleteUserParam2">delete from users where uid = ${param1}</delete>
</mapper>
(2)测试代码
package com.mybatis.test;import com.mybatis.pojo.Users;
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 Demo2 {SqlSession session;public Demo2(){//加载application-dao.xml文件String resource = "application-dao.xml";//相对于当前的路径,要求:application-dao.xml文件在src下//java加载文件,转换为流对象try {InputStream resourceAsStream = Resources.getResourceAsStream(resource);//通过这个xml文件来创建SqlSessionFactory对象SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);//由sqlSessionFactory对象创建发送sql语句的对象session = sessionFactory.openSession();
// session.commit(true);//设置为true表示 mybatis事务为自动提交} catch (IOException e) {e.printStackTrace();}}/*** @Test 单元测试的注解,用于不使用main方式创建对象时,也可以直接调用方法*/@Testpublic void addUser(){System.out.println("单元测试");this.ddd("测试调用带参数的方法");}public void ddd(String s){System.out.println("s: " + s);}/*** 新增用户*/@Testpublic void insertUser(){int n = session.insert("addUser");System.out.println(n == 1?"新增成功":"新增失败");//在mybatis中事务默认情况下是手动提交session.commit();//提交事务}@Test//修改数据public void update(){int n = session.update("updateUser");System.out.println(n == 1?"修改成功":"修改失败");session.commit();//提交事务}//删除数据@Testpublic void delete(){int n = session.delete("deleteUser");System.out.println(n==1?"删除成功":"删除失败");session.commit();}/*----------------------------带参数的DML----------------------------------*//*** 新增用户*/@Testpublic void insertUser2(){Users u = new Users();//开发中这个数据,是用户在表单里面提交的u.setUsername("芳芳");u.setPassword("123");u.setCity("杭州");int n = session.insert("addUserParam", u);System.out.println(n == 1?"新增成功":"新增失败");//在mybatis中事务默认情况下是手动提交session.commit();//提交事务}@Test//修改数据public void update2(){Users u = new Users();//封装的数据,只写我们需要修改的列数据u.setUsername("夏天");u.setCity("深圳");int n = session.update("updateUserParam",u);System.out.println(n == 1?"修改成功":"修改失败");session.commit();//提交事务}//删除数据@Testpublic void delete2(){Users u = new Users();u.setUid(1);int n = session.delete("deleteUserParam",u);System.out.println(n==1?"删除成功":"删除失败");session.commit();}//删除数据@Testpublic void delete3(){int n = session.delete("deleteUserParam2",11);System.out.println(n==1?"删除成功":"删除失败");session.commit();}
}