网站页面构成要素,wordpress 手机无菜单,网站建设公司dyfwzx,建网站哪个平台好1. what
MyBatis是一款优秀的持久层框架#xff0c;它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射实体类型、接口、Java POJO(Plain Old Java Objects#xff0c;普…1. what
MyBatis是一款优秀的持久层框架它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射实体类型、接口、Java POJO(Plain Old Java Objects普通老式Java对象)为数据库中的记录。 持久层就是和数据库交互的一层——dao层用于操作数据表记录的 框架就是一个半成品我们只需要引入该框架加入自己的代码就可以完成相应的业务功能 持久层框架MyBatis hirenate jpa等 ORM框架Object Relative Mapping(对象关系映射)。表——实体类一条记录——实体类的对象 表的字段——java实体类的属性 2. why 思考JDBC操作数据库时代码量很大。 比如查询时需要手动给占位符赋值需要手动把查询的结果封装到实体类中需要手动关闭资源。 使用MyBatis可以帮你完成上面的操作。
3.快速搭建
1. 创建一个maven的java工程
File——New——New Project——Maven
Name : mybatis01
GroupId : com.zmq
2.引入MyBatis和mysql的依赖 dependencies
!--mybatis的依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.9/version/dependency
!--mysql的依赖--dependencygroupIdrepMaven.mysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency
!--lombok的依赖--dependencygroupIdrepMaven.org.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.28/version/dependency
!--junit依赖--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency/dependencies引入的依赖有顺序否则会报红mybatis依赖需要在最前面 3.创建实体类为了映射表中的记录
4.mybatis的配置文件——配置数据源信息 不需要背 ?xml version1.0 encodingUTF-8?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC /dataSource typePOOLED!--name是固定的 value根据需要配置为自己的内容--property namedriver valuecom.mysql.cj.jdbc.Driver /property nameurl valuejdbc:mysql://localhost:3306/zmq?serverTimezoneAsia/Shanghai /property nameusername valueroot /property namepassword value123456 //dataSource/environment/environments
/configuration修改为自己的数据库名称——修改为自己的数据库用户名修改为自己的数据库密码 5.mybatis的映射文件——编写自己的sql语句
在resources下创建mapper目录在该目录下创建对应的映射文件——UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--namespace:命名空间 --
mapper namespaceaaa!--select:用于编写查询的sql语句id:唯一标签 resultType:结果类型 sql执行完毕后返回对应的java实体类的类型 把查询的结果自动封装到该实体类的属性上--select idgetById resultTypecom.zmq.entity.Userselect * from user where id#{id}/select
/mapper6.将映射文件放入配置文件中 未来我们读取的只有配置文件 !--引入映射文件--
mappersmapper resourcemapper/UserMapper.xml/
/mappers7.测试mybatis是否正确 Testpublic void test01() throws Exception{//1. 读取mybatis的配置文件InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2. 获取SqlSessionFactory对象---创建sqlSession的对象SqlSessionFactory sessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3. 获取SqlSession对象---表示java与数据库的一次连接SqlSession sqlSessionsessionFactory.openSession();//4. 执行sql语句//String statement, 执行映射文件中的哪个标签// Object parameter 需要的参数值User user sqlSession.selectOne(aaa.getById,1);System.out.println(user);}4. mybaits完成CRUD
4 .1 根据id查询
1.UserMapper.xml配置文件中写根据id查询的sql语句
select idgetById resultTypecom.zmq.entity.Userselect * from user where id#{id}/selectselect用于编写查询的sql语句id:唯一标签resultType:结果类型 sql执行完毕后返回对应的java实体类的类型 把查询的结果自动封装到该实体类的属性上#{名称}相当于占位符 2.UserTest类中完成根据id查询的测试
//查询Testpublic void test01() throws Exception{//1.读取mybatis的配置文件按InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2.获取SqlSessionFactory对象SqlSessionFactory sessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3.SqlSession sqlSession sessionFactory.openSession();//4.User user sqlSession.selectOne(UserMapper.getById,9);System.out.println(user);}前三个步骤是固定的 首先读取mybatis的配置文件即mybatis.xml文件 获取SqlSessionFactory对象创建sqlSession的对象 new SqlSessionFactoryBuilder().build(resourceAsStream) 获取SqlSession对象表示java与数据库的一次连接 sessionFactory.openSession() 执行sql语句有两个参数 String statement, 执行映射文件中的哪个标签 Object parameter 需要的参数值 执行sql语句时调用selectOne方法 4.2 添加
1.UserMapper.xml配置文件中写添加用户的sql语句
!--增加--insert idaddinsert into user values (null,#{u_name},#{password})/insertinsert用于编写添加的sql语句#{名称}必须和实体类属性名一致实体类中id为Integer类型不然后续测试时会报错不需要resultType 2.UserTest类中完成添加用户的测试
//添加Testpublic void testAdd() throws Exception{//1.读取mybatis的配置文件按InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2.获取SqlSessionFactory对象——创建swssionFactory对象SqlSessionFactory sessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3.获取sqlSession对象——java与数据库的一次连接SqlSession sqlSession sessionFactory.openSession();//4.创建一个user对象传入添加用户的信息User usernew User(null,汪芜,123456);//5.执行sql语句int row sqlSession.insert(UserMapper.add, user);//将数据提交到数据库中sqlSession.commit();System.out.println(row);} 增删改与查询的不同点 因为执行sql语句时传入的是一个对象而不能一次传递多个值所以需要创建一个user对象将要传递的值放入到user对象中再在执行sql语句中传递符合要求的user对象 User usernew User(null,“汪芜”,“123456”); int row sqlSession.insert(“UserMapper.add”, user); 在执行完sql语句后必须要提交到数据库中 sqlSession.commit(); 执行时调用insert方法 4.3 修改
1.UserMapper.xml配置文件中写修改的sql语句
!--修改--update idupdateupdate user set u_name#{name},password#{password} where id#{id}/update update用于编写修改的sql语句#{名称}必须和实体类属性名一致 2.UserTest类中完成修改的测试
//修改Testpublic void testUpdate() throws Exception {//1.读取mybatis的配置文件InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2.获取SqlSessionFactory对象---创建sqlSession的对象SqlSessionFactory sessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3.获取SqlSession对象---表示java与数据库的一次连接SqlSession sqlSession sessionFactory.openSession();//4.创建一个user对象User usernew User(12,lay,1007);//5.执行sql语句// String statement, 执行映射文件中的哪个标签// Object parameter 需要的参数值int row sqlSession.update(UserMapper.update, user);//6.提交sqlSession.commit();System.out.println(row);} 和增加一样需要创建一个user对象用来传递数据执行时调用update方法执行完毕后需要提交到数据库 4.4 删除
1.UserMapper.xml配置文件中写删除的sql语句
!--删除--delete iddeldelete from user where id#{id}/delete
2.UserTest类中完成删除的测试
//删除Testpublic void testDel() throws Exception {//1.创建mybatis的配置文件InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2.创建SqlSessionFactory对象——创建sqlSession对象SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3.获取sqlSession对象——表示java与数据库的一次连接SqlSession sqlSession sqlSessionFactory.openSession();//4.执行sql语句int row sqlSession.delete(UserMapper.del, 30);sqlSession.commit();System.out.println(row);} 因为删除只需要传递一个id所以不需要和增江、修改一样创建一个对象来传递值同样在执行完毕sql语句后需要提交到数据库 5.企业开发模式 上面我们操作数据库表记录都是使用SqlSession类中的方法而实际开发中我们习惯自己写方法调用自己的方法传递相应的参数。但是这些方法没有方法体{}在接口中。而方法的实现交于mybatis框架完成 1.创建一个接口
public interface UserDao {//根据id查询用户信息public User queryById(int id);
}
2.映射文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--namespace:命名空间必须和接口名一致
--
mapper namespacecom.zmq.dao.UserDao!--select:用于编写查询的sql语句id:唯一标签,必须和Dao接口中的方法名一致resultType:结果类型 sql执行完毕后返回对应的java实体类的类型 把查询的结果自动封装到该实体类的属性上--select idgetById resultTypecom.zmq.entity.Userselect * from user where id#{id}/select
/mapper
3.测试
public class UserTest {//根据id查询Testpublic void testGetById() throws IOException {//1.获取mybatis的配置文件InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2.获取SqlSessionFactory对象——创建sqlSessionFactory对象SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3.获取sqlSession对象SqlSession sqlSession sqlSessionFactory.openSession();//4.获取dao接口的代理实现类UserDao userDaosqlSession.getMapper(UserDao.class);//5.调用自己类中的方法User user userDao.getById(12);System.out.println(user.getU_name());}
}
4.补充Before注解 Before注解是Junit中的一个注解它用于标记一个方法在每个测试方法执行之前都会被自动调用。 通过使用Before注解我们可以将一些通用的准备操作如创建对象、初始化变量等放置在一个方法中以避免在每个测试方法中重复编写相同的准备代码。 Before注解可以将测试中的一些固定步骤提取出来
UserDao userDaonull;
SqlSession sqlSessionnull;
Before
public void before() throws Exception{//1.获取mybatis的配置文件InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);//2.获取SqlSessionFactory对象——创建sqlSessionFactory对象SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);//3.获取sqlSession对象sqlSession sqlSessionFactory.openSession();//4.获取dao接口的代理实现类userDaosqlSession.getMapper(UserDao.class);
}
6.企业模式完成CRUD
6.0 前期准备
1.引入依赖
创建好一个mybatis的java工程后需要在pom.xml文件中引入相关依赖
dependencies
!--mybatis的依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.9/version/dependency
!--mysql的依赖--dependencygroupIdrepMaven.mysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency
!--lombok的依赖--dependencygroupIdrepMaven.org.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.28/version/dependency
!--junit依赖--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!--打印日志--dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependencydependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion5.3.2/version/dependency
/dependencies
2.在resources下创建配置文件——mybatis.xml
?xml version1.0 encodingUTF-8?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC /dataSource typePOOLED!--name是固定的 value根据需要配置为自己的内容--property namedriver valuecom.mysql.cj.jdbc.Driver /property nameurl valuejdbc:mysql://localhost:3306/zmq?serverTimezoneAsia/Shanghai /property nameusername valueroot /property namepassword value123456 //dataSource/environment/environments
/configuration
3.创建相应的实体类——entity——Student
package com.zmq.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** program: mybatis01work* description: 学生表* author: 赵梦倩* create: 2024-05-20 16:42**/
Data
NoArgsConstructor
AllArgsConstructor
public class Student {private Integer id;private String name;private String phone;private String email;private String profession;private Integer age;
}
4.创建相应的接口——dao——StudentDao
package com.zmq.dao;import com.zmq.entity.Student;import java.util.List;/*** program: mybatis01work* description: 学生表的相关方法接口* author: 赵梦倩* create: 2024-05-20 16:44**/
public interface StudentDao {//1.根据id查询public Student getById(int id);//2.查询所有public ListStudent getAll();//添加public int add(Student student);//修改public int update(Student student);//删除public int delete(int id);}
5.创建mybatis的映射文件——mapper——StudentMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
!--namespace:命名空间 --
mapper namespacecom.zmq.dao.StudentDao/mapper
6.在配置文件中引入映射文件 !--引入映射文件--mappersmapper resourcemapper/StudentMapper.xml//mappers
6.1 查询所有
1.映射文件【StudentMapper.xml】中写sql语句 select idgetAll resultTypecom.zmq.entity.Studentselect * from t_student/select
2.单元测试类中测试方法 Testpublic void testGetAll() throws IOException {InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession sqlSessionFactory.openSession();StudentDao studentDaosqlSession.getMapper(StudentDao.class);ListStudent all studentDao.getAll();for (Student s:all) {System.out.println(s.getName());}}
6.2 根据id查询
1.映射文件【StudentMapper.xml】中写sql语句
select idgetById resultTypecom.zmq.entity.Studentselect * from t_student where id#{id}/select
2.单元测试类中测试方法
Testpublic void testGetById() throws IOException {InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession sqlSessionFactory.openSession();StudentDao studentDaosqlSession.getMapper(StudentDao.class);Student byId studentDao.getById(2);System.out.println(byId.getName());}
6.3 添加
1.映射文件【StudentMapper.xml】中写sql语句
insert idadd insert into t_student values (null,#{name},#{phone},#{email},#{profession},#{age})/insert
2.单元测试类中测试方法
Testpublic void testAdd() throws IOException {InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession sqlSessionFactory.openSession();StudentDao studentDaosqlSession.getMapper(StudentDao.class);Student studentnew Student(null,张数,1007,110qq.com,软件工程,16);int add studentDao.add(student);System.out.println(add);sqlSession.commit();}
6.4 修改
1.映射文件【StudentMapper.xml】中写sql语句 update idupdateupdate t_student set name#{name},phone#{phone},email#{email},profession#{profession},age#{age} where id#{id}/update
2.单元测试类中测试方法
Testpublic void testUpdate() throws IOException {InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession sqlSessionFactory.openSession();StudentDao studentDaosqlSession.getMapper(StudentDao.class);Student studentnew Student(25,张数三,1007,110qq.com,软件工程,16);int update studentDao.update(student);System.out.println(update);sqlSession.commit();}
6.5 删除
1.映射文件【StudentMapper.xml】中写sql语句
delete iddeletedelete from t_student where id#{id}
/delete
2.单元测试类中测试方法
Testpublic void testDel() throws IOException {InputStream resourceAsStream Resources.getResourceAsStream(mybatis.xml);SqlSessionFactory sqlSessionFactorynew SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession sqlSessionFactory.openSession();StudentDao studentDaosqlSession.getMapper(StudentDao.class);int delete studentDao.delete(25);System.out.println(delete);sqlSession.commit();}
7. idea安装的相关插件
插件1MyBatisX
可以用于纠错
插件2Lombok
帮忙生成setgettoString构造方法——通过注解
引入lombok依赖 !--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.24/version/dependency
实体类中使用lombok注解
//set和get以toString方法生成
Data
//无参构造方法
NoArgsConstructor
//有参构造方法
AllArgsConstructor
8.易错点
8.1 导包时
两个xml文件要打开记事本粘贴
否则会报错——创建实例错误
8.2 获取结果name为空
因为创建实体类时属性与数据库表属性不一致导致
解决实体类属性与数据库表属性完全一致
8.3 Mapped Statements collection does not contain
两种可能
①写错名称
②配置文件中没有引入映射文件
其他错误
①密码账号错误
②写错sql语句——在数据库中执行下