目录
现在网上太多介绍MyBatis了,我直接上代码,和步骤,你们自行对比jdbc的步骤,去对比
就很容易理解了。
1.JDBC:
1.0 jdbc的起源
如何衍生到mvc框架的呢,说白了框架其实就是用来封装代码的,那么我们编写servlet时候,哪些东西,我们是可以封装起来的呢,前人已经为我们思考过了,servlet中,我们有三个事情要做,一是要做映射从数据库拿数据,二是要写操作这些数据的逻辑以及一个转发和重定向的逻辑。三就是类似于jsp,把需要返回的前端代码传到response里面给到webserver。
而正好是如上的三点,我们就封装从三个框架,M是moudle,他需要做一个映射,写一个javabean,再就是从数据库中取数据也就是jdbc。V是view层,他是我们response返回前端代码的层的前端代码的编写,C是controller层,他负责的是进行一个逻辑控制,转发,重定向等等层面。
前面了解了servlet后和基本的MVC的三层架构的来源后,那么我们开始写M层的代码。
为什么会有jdbc,这个很容易理解就是需要我们在写servlet的时候,我们需要写java程序去操作数据库,所以就有了jdbc。
本质其实jdbc就是java的一系列的接口,我们可以通过实现这些接口去连接数据库从而去取数据和操作数据库。
那么操作步骤就如下几步。
获取不同数据库的驱动->建立连接->得到执行对象->执行语句返回结果对象
1.1用idea连接mysql数据库,再创建一个数据库。
关于如何安装数据库和如何使用mysql,这些基本的内容,csdn上随机搜索就可以看到,但是在安装mysql的时候会经常遇到问题,要小心和注意。
如下是用idea连接mysql数据库进行创建一个数据库:
1.2编写servelt的jdbc:
package com.tang;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.IdentityHashMap;
public class TestJDBC extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("welconme to servlet");
String mysqlUrl = "jdbc:mysql://localhost:3306/testjdbc?username=root&password=&useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "544547680";
String sql = "select * from test1";
Connection con = null;
ResultSet resultSet = null;
writer.println("=======================");
try{
Class.forName("com.mysql.jdbc.Driver") ;
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
con = DriverManager.getConnection(mysqlUrl, username, password);
Statement preparedStatement = con.createStatement();
resultSet = preparedStatement.executeQuery(sql);
writer.println("=======================");
while (resultSet.next()) {
writer.println("this is a id " + resultSet.getObject("id"));
writer.println("this is a name" + resultSet.getObject("name"));
writer.println("=======================");
}
writer.println("=======================");
resultSet.close();
preparedStatement.close();
con.close();
}catch(SQLException e){
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1.3web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<servlet-class>com.tang.TestJDBC</servlet-class>
<servlet-name>hello</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/testJDBC</url-pattern>
</servlet-mapping>
</web-app>
1.4 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>com.tang</groupId>
<artifactId>TestReview</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>JavaWeb_Test1 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>10.0.4</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- Mysql连接依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
<build>
<finalName>TestReview</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.Mybaits:
2.0 基本环境的配置和来源:
JDK,MAVEN,TOMCAT,架构,pom,web.xml
pom配置:
<?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>com.tang</groupId>
<artifactId>TestJDBC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>TestJDBC Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>10.0.4</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- Mysql连接依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
<build>
<finalName>TestReview</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
架构:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<context-param>
<param-name>url1</param-name>
<param-value>12345</param-value>
</context-param>
<servlet>
<servlet-name>test1</servlet-name>
<servlet-class>com.tang.TestJDBC</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test1</servlet-name>
<url-pattern>/helloJDBC</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>test2</servlet-name>
<servlet-class>com.tang.TestJDBC2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>/helloJDBC2</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>test3</servlet-name>
<servlet-class>com.tang.TestJDBC3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test3</servlet-name>
<url-pattern>/helloJDBC3</url-pattern>
</servlet-mapping>
</web-app>
来源:
来源就是把jdbc的4大步骤封装了一些,让我们更关注于sql语句的书写和结果集的使用和
调用。
前面jdbc关键步骤如下:
Class.forName("com.mysql.jdbc.Driver") ;//获取驱动
con = DriverManager.getConnection(mysqlUrl, username, password);//获取连接对象
Statement preparedStatement = con.createStatement();//获取执行语句对象
resultSet = preparedStatement.executeQuery(sql);//获取结果集
resultSet.close();
preparedStatement.close();
con.close();
2.1写配置文件mybatisconf
配置文件的编写,有点类似于jdbc的properties文件的编写
<?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核心配置文件-->
<!--& 相当于 & 因为这边需要转译 最后面因为要修改时区加上 serverTimezone=UTC-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/testmybaitis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="544547680"/>
</dataSource>
</environment>
</environments>
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册-->
<mappers>
<mapper resource="mapper.xml"/>
</mappers>
</configuration>
2.2 mybatis的工具类编写:
package com.tang.mybaitisutils;
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;
//目的是为了把mybaitis文件加载进入到输入流里面:
public class MyBaitisUtils {
public static SqlSessionFactory sqlSessionFactory;
static {
try {
String url2 = "mybatisconf.xml";
InputStream in Resources.getResourceAsStream(url2);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession sqlSession (){
return sqlSessionFactory.openSession();
}
}
2.3 编写pojo下的user类
User类,记住五个必要:
package com.tang.pojo;
//五个必要,封装,无参构造器,有参构造器,getter and setter , toString
public class User {
private int id;
private String name;
private int age;
public User(){
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.4编写mapper下的Mapper类
//之前jdbc返回的结果集应该是resultset,mybaitis是通过返回一个接口,接口里面有方法可以把表里面的对象存起来
package com.tang.mapper;
import com.tang.pojo.User;
import java.util.List;
public interface MapperUser {
List<User> getListUser();
}
2.5 编写mapper.xml
其实这一步就是实现两个目的,一个是编写sql语句,第二个是把查询语句对应到返回的结果里面去执行这个语句
其实就是类似于 sqlsession.getMapper其实就是类似于执行statementcreat,而后续的用mapper或者dao的接口里面的方法其实就是statement的excuteupdate和excutequery的方法
<?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=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.tang.mapper.MapperUser">
<!--select查询语句-->
<!--出不来的话 ctrl+enter-->
<select id="getListUser" resultType="com.tang.pojo.User">
select * from testtable1;
</select>
</mapper>
<!-- namespace="com.kun.dao.UserDao" 绑定接口
id="getUserList" 绑定接口里面的方法
resultType="com.kun.pojo.User" 返回类型专注于我们的返回值
-->
2.6 测试,使用mybatis方法
package com.tang;
import com.tang.mapper.MapperUser;
import com.tang.mybatisutils.MyBatisUtils;
import com.tang.pojo.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import java.io.IOException;
import java.util.List;
public class TestJDBC3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("welcome to TestJDBC3");
SqlSession sqlSession = new MyBatisUtils().sqlSession();
MapperUser mapper= sqlSession.getMapper(MapperUser.class);
List<User> userList = mapper.getListUser();
for(User usr : userList){
resp.getWriter().println(usr);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
执行结果: