一、Maven介绍
1.概念:
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
2.为啥使用maven:
之前项目中需要引入大量的jar包。这些jar从网上下载,可能下载地址不同意。这些jar之间可能存在冲突。我们应该有一个软件,帮你完成jar的下载。这个工具就是maven。
(主要和jar包有关系)...
3.maven 工作原理:
4.安装Maven和配置
如果本地之前安装过maven。不需要在装。
Download Apache Maven -- Maven
5.idea关联本地maven⭐⭐
6.ieda创建Maven项目⭐⭐
1.maven的Java工程
2 maven的javaweb工程
7.然后把之前那个图书管理系统导入maven项目里面
二、Mybatis框架
1.什么是mybatis
MyBatis 是一款优秀的==持久层框架==,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射实体类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2
.框架: 别人写好的一个半成品工程。我们只需要安装指定的配置来使用这个半成品。
持久层框架: 就是与数据库交互的框架。---简化我们操作数据库表记录的一个框架。
ORM框架: Object Relative Mapping .
表----实体类
字段---属性
一条记录----对象
多条记录----对象集合
2.为什么使用mybatis
(这次主要和数据库的jdbc有关,是为了简化数据库jdbc的代码)
这是之前的连接数据库的操作BaseDao
原来的jdbc操作数据库代码中可以看出,我们操作数据库非常麻烦。需要手动设置占位符的值,而且需要手动封装处理结果集。 我们可以使用mybatis完成上面繁琐的操作。
Mybatis就是为了简化java操作数据库的代码。
3.如何使用mybatis:
先手建一个工程,然后在创建maven的java工程并引入依赖,
1.pom.xml:引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>mybatis01</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <!-- <scope>test</scope>--> </dependency> <!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.34</version> </dependency> <!--mybatis框架的依赖--> <dependency> <groupId>repMaven.org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> </dependencies> </project>
2.创建实体类:
package org.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @className: User * @author: Zyl * @date: 2024/12/11 9:11 * @Version: 1.0 * @description: */ @Data @AllArgsConstructor @NoArgsConstructor public class User { private Integer id; private String name; private Integer age; private String salary; public User(String name, Integer age, String salary) { this.name = name; this.age = age; this.salary = salary; } }
3.mybatis配置文件---不需要背
在resources下面新建一个文件: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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <!--name是固定的 value根据需要配置为自己的内容--> <property name="driver" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- <!–引入映射文件–> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers>--> <!--引入映射文件--> <mappers> <mapper resource="mapper/UserMapper2.xml"/> </mappers> </configuration>
4.编写映射文件---不需要背
在resources下面建一个目录mapper,在目录下建一个和实体类对应的 映射文件:UserMapper.xml(这是我的User实体表)
(主要是用来编写sql语句的)UserMapper.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"> <!--namespace:命名空间。现在可以随便写。后期需要和接口所在的包对应--> <mapper namespace="qy179"> <!--select表示查询sql标签 id:表示sql语句的唯一标识,通常使用mapper接口的全类名.方法名组成 resultType:表示结果类型。 mysql执行完该sql后返回的数据类型 #{id}:表示占位符。mybatis会自动给该占位符赋值 --> <select id="getById" resultType="org.example.entity.User"> select * from user where id=#{id} </select> <!--删除语句--> <delete id="deleteById"> delete from user where id=#{id} </delete> <!--增加语句--><!--增、删、改\返回的类型都是int ,所以不用写resultType--> <insert id="insertById" > insert into user(name,age,salary) values(#{name},#{age},#{salary}) </insert> <!--修改语句--><!--#{name},#{age},#{salary}必须和实体类的属性名一致--> <update id="updateById"> update user set name=#{name},age=#{age},salary=#{salary} where id=#{id} </update> <!--查询所有的语句--> <select id="getAll" resultType="org.example.entity.User"> select * from user </select> </mapper>
5.把映射文件放到配置中
6.单元测试:
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.example.entity.User; import org.junit.Test; import java.io.InputStream; import java.util.List; /** * @className: Test01 * @author: Zyl * @date: 2024/12/11 9:35 * @Version: 1.0 * @description: */ public class Test01 { @Test public void test01() throws Exception{//测试不用写 //1.读取mybatis的配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行写的sql语句 //括号里第一个String statement.表示sql的标志,namespace+id; // 括号里第二个参数Object parameter.表示sql的参数 User user = sqlSession.selectOne("qy179.getById", 1); System.out.println(user); } @Test public void test02() throws Exception{//删除语句 //1.读取mybatis的配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行写的sql语句 int row = sqlSession.delete("qy179.deleteById", 1); System.out.println("影响的行数"+row); //提交数据 sqlSession.commit(); } @Test public void test03() throws Exception{//增加语句 //1.读取mybatis的配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行写的sql语句 //构造函数 User user = new User("zyl", 23, "10000"); int row=sqlSession.insert("qy179.insertById",user ); System.out.println("影响的行数"+row); //提交 sqlSession.commit(); } @Test public void test04() throws Exception{//修改语句 //1.读取mybatis的配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行写的sql语句 User user = new User(4, "hahhah", 18, "5471"); int row=sqlSession.update("qy179.updateById",user ); System.out.println("影响的行数"+row); //提交 sqlSession.commit(); } @Test public void test05() throws Exception{//查询所有的数据 //1.读取mybatis的配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //4.执行写的sql语句 List<User> objects = sqlSession.selectList("qy179.getAll"); System.out.println(objects); //提交 sqlSession.commit(); } }
4.使用接口绑定模式:
为了优化错误
1.dao接口:
2.映射文件也得重写一下:
UserMapper2.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"> <!--namespace:命名空间。现在可以随便写。后期需要和接口所在的包对应 这一次qy179就要改成 对应的接口名字了--> <mapper namespace="org.example.dao.UserDao"> <insert id="add"> insert into user(name,age,salary) values(#{name},#{age},#{salary}) </insert> <update id="update"> update user set name=#{name},age=#{age},salary=#{salary} where id=#{id} </update> <delete id="deleteById"> delete from user where id=#{id} </delete> <!--select表示查询sql标签 id:表示sql语句的唯一标识,通常使用mapper接口的全类名.方法名组成 resultType:表示结果类型。 mysql执行完该sql后返回的数据类型 #{id}:表示占位符。mybatis会自动给该占位符赋值 --> <select id="getById" resultType="org.example.entity.User"> select * from user where id=#{id} </select> <select id="selectAll" resultType="org.example.entity.User"> select * from user </select> </mapper>
3.再次测试:
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.example.dao.UserDao; import org.example.entity.User; import org.junit.Test; import java.io.InputStream; import java.util.List; /** * @className: Test02 * @author: Zyl * @date: 2024/12/11 11:50 * @Version: 1.0 * @description: */ public class Test02 { @Test public void test01() throws Exception{//根据id查询数据 //1.读取mybatis的配置文件 InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession = sqlSessionFactory.openSession(); //为接口实现代理实现类 UserDao userDao = sqlSession.getMapper(UserDao.class); User byId = userDao.getById(4); System.out.println(byId); } @Test public void test02() throws Exception{//增加数据 //1.读取mybatis的配置文件 InputStream resourceAsStream=Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession=sqlSessionFactory.openSession(); //为接口实现代理实现类 UserDao userDao=sqlSession.getMapper(UserDao.class); User user=new User("www",23,"10000"); int row=userDao.add(user); System.out.println("影响的行数"+row); //提交 sqlSession.commit(); } @Test public void test03() throws Exception{//查询所有的数据 //1.读取mybatis的配置文件 InputStream resourcesAsStream=Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourcesAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession=sqlSessionFactory.openSession(); //为接口实现代理实现类 UserDao userDao=sqlSession.getMapper(UserDao.class); List<User> user=userDao.selectAll(); System.out.println(user); //提交 sqlSession.commit(); } @Test public void test04() throws Exception{//删除数据 //1.读取mybatis的配置文件 InputStream resourceAsStream=Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂--获取SqlSession对象 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream); //3.获取SqlSession对象--理解为java与数据库的一次会话 SqlSession sqlSession=sqlSessionFactory.openSession(); //为接口实现代理实现类 UserDao userDao=sqlSession.getMapper(UserDao.class); int row=userDao.deleteById(8); System.out.println("影响的行数"+row); //提交数据 sqlSession.commit(); } @Test public void test05() throws Exception{//修改数据 //读取mybatis的配置文件 InputStream resourcesAsStream=Resources.getResourceAsStream("mybatis.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourcesAsStream); //3.获取SqlSession对象 SqlSession sqlSession=sqlSessionFactory.openSession(); //4.为接口实现代理实现类 UserDao userDao=sqlSession.getMapper(UserDao.class); User u=new User(4, "石昊", 18, "5471"); int row = userDao.update(u); System.out.println("影响的行数"+row); //提交 sqlSession.commit(); } }