ssm之路(1)jdbc到mybatis+servlet

1

servlset实现您好:

再maven中添加java ee的相关依赖,mybatis依赖,mysql驱动依赖:

<?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</groupId>
  <artifactId>lmj</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>lmj 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>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!-- 导入java ee jar 包 -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>

    <!-- 导入Mysql数据库链接jar包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.36</version>
    </dependency>
    <!-- mybatis核心包 -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>lmj</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>
    </plugins>
    <resources>
      <resource>
        <directory>src/main/Java</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.* </include>
        </includes>
      </resource>
    </resources>
    <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.0.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.7.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.20.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.0</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>

新建JdbcServlet类:

@WebServlet("/hello")
public class JdbcServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("utf-8");
       resp.setContentType("text/html;charset=utf-8");
       PrintWriter out=resp.getWriter();
       out.write("你好,世界");
    }

}

界面打印出:你好,世界

注意:如果resp.setContentType(“text / html的;字符集= UTF-8”);中写成的HTML /文本,则会流文件的形式向本地传输文本文件。

2.开始JDBC:修改上述代码:

@WebServlet("/hello")
public class JdbcServlet extends HttpServlet {
    String URL="jdbc:mysql://127.0.0.1:3306/ssm?autoReconnect=true&useUnicode=true&characterEncoding=utf8";
    String USER="root";
    String PASSWORD="root";

    public JdbcServlet() throws SQLException {
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("utf-8");
       resp.setContentType("text/html;charset=utf-8");
       PrintWriter out=resp.getWriter();
      // out.write("你好,世界");
        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.通过(java.sql下的)驱动管理类获取数据库连接
            Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
            //3.通过Connection对象创建Statement对象(Statement:用于执行SQL语句的对象,通过COnnection的createStatement()方法来获取)
            Statement st=conn.createStatement();
            //4.通过Statement执行SQL语句:
              /*实际运行中:应该是
                定义sql语句,?表示占位符。
                String sql="select * from book where name=?"
                PreparedStatement preparedStatement=conn.createStatement(sql)
                preparedStatement.setString(1,"java程序设计")
                ResultSet rs=preparedStatement.executeQuery*/

            ResultSet rs=st.executeQuery("select * from book");
            //5.处理(操作)数据库的返回结果(结果集ResultSet)
            while(rs.next()){
                out.write(rs.getString("name")+" "
                        +rs.getString("number")+"<br>");
            }
            //6.释放(关闭)资源
            rs.close();
            st.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

}

即可在页面看到从数据库查询出来的信息。

3.下面是MyBatis登场:

MyBatis的config.xml中:mybatis.xml的全局配置文件,配置了数据源(一般由第三方提供),事务(弹簧提供)等的MyBatis的运行环境,配置了(映射文件)SQL语句

的SqlSessionFactory对象中对象中对象中(会话工厂,创建的SqlSession的),的一个的SqlSession的,操作数据库(发出增删改查)(它是面向对象的v接口),执行器(执行器)(也是一个接口,基本和缓存执行(),SqlSession的内部通过执行器操作数据库.mapped statement(底层封装对象),对sql语句,输入参数,输出结果类型进行封装

MyBatis的开发流程:

1.配置文件创建工厂,2。工厂生成会话,3。会话调用执行器,4。(执行器执行映射器映射文件里的SQL语句)进而操作数据库。

的MyBatis的运行环境的配置(不引用第三方连接池)

<environmetns default =“development”>

     <environmetns id =“development”>

           //使用JDBC事务管理

               <transactionManager type =“JDBC”>

                    //数据库连接池,池(集合,共用的)

<dataSource type =“POOLED”>

                             <property name =“driver”value =“com.mysql.Driver”> ...... <... url,.....> <... username .....> <...密码.....> 

                         </数据源>

汇集类型请看图:

MyBatis数据源的创建过程稍微有些曲折:

从SqlSessionFactoryBuilder对象开始追溯数据源的创建.SqlSessionFactoryBuilder中9个构造方法,其中字符流4个构造方法一一对应字节流4个构造方法,都是将MyBatis的config .XML的配置文件解析成配置对象,最终导向构建(配置配置)进行小号qlSessionFactory的构造例如会在数据源中配置:最大连接数,连接时长,....先做好万事俱备,做好应对各种突发强况的准备措施,增加程序的强壮型,不至于程序很脆弱,一运行就崩的情况。

映射器映射文件:

<select id =“”> --------这里的id称为statementid,将sql语句封装到语句对象中

下面进行代码演示:

首先给出的文件结构:

全局配置的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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&amp;characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        //这里是bookmapper.xml文件的相对路径
        <mapper resource="mapper/BookMapper.xml"/>
    </mappers>
</configuration>

SQL映射文件如下:bookmapper.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">
<mapper namespace="test">
    <select id="findBookById" parameterType="int" resultType="com.lmj.ssm.Book">
	select * from book where book_id=#{id}
	</select>
</mapper>

实体类的书:

public class Book {
    private long bookId;// 图书ID

    private String name;// 图书名称

    private int number;// 馆藏数量

    public Book() {
    }

    public Book(long bookId, String name, int number) {
        this.bookId = bookId;
        this.name = name;
        this.number = number;
     }
//getter,setter方法略。。。
}

下面新建JdbcServlet,完成的servlet +的MyBatis实现对数据库的访问:

@WebServlet("/book/*")
public class JdbcServlet extends HttpServlet {
    String URL="jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&amp;characterEncoding=utf-8";
    String USER="root";
    String PASSWORD="root";

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取方法名字
        String servletPath = req.getPathInfo();// /xxxxxx.do
        // 去掉斜杠和.do
       // replaceAll()方法实际是采用正则表达式的规则去匹配的。在regex中"\\"表示一个"\",在java中一个"\"也要用"\\"表示。这样,前一个"\\"代表regex中的"\",后一个"\\"代表java中的"\",所以字符串转义一次,正则转义一次,那么一个斜扛要写4个。
        String[] methodName1 =servletPath.substring(1,servletPath.length()).split("/");
        String methodName=methodName1[0];
     //  String methodName = servletPath.replaceAll( "\\/",  "");// xxxxxx

        try {
            // 利用反射获取方法
            Method method = getClass().getDeclaredMethod(methodName,
                    HttpServletRequest.class, HttpServletResponse.class);
            // 执行相应的方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
            // TODO: handle exception
        }

        }
        public void mybatisQuery(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();

            String resource="mybatis-config.xml";
//Resources是在org.apache.ibatis.io.Resources包下,它是mybatis架包里
//添加依赖(<dependency><groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId>
 //     <version>3.4.6</version></dependency>)即可
            InputStream inputStream= Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession=sqlSessionFactory.openSession();
            Book book=sqlSession.selectOne("test.findBookById",1000);
           // System.out.println(book);
            out.write(String.valueOf(book));
            sqlSession.close();
        }
        public void jdbcQuery(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            // out.write("你好,世界");
            try {
                //1.加载数据库驱动
                Class.forName("com.mysql.jdbc.Driver");
                //2.通过(java.sql下的)驱动管理类获取数据库连接
                Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
                //3.通过Connection对象创建Statement对象(Statement:用于执行SQL语句的对象,通过COnnection的createStatement()方法来获取)
                Statement st=conn.createStatement();
                //4.通过Statement执行SQL语句:
              /*实际运行中:应该是
                定义sql语句,?表示占位符。
                String sql="select * from book where name=?"
                PreparedStatement preparedStatement=conn.createStatement(sql)
                preparedStatement.setString(1,"java程序设计")
                ResultSet rs=preparedStatement.executeQuery*/

                ResultSet rs=st.executeQuery("select * from book");
                //5.处理(操作)数据库的返回结果(结果集ResultSet)
                while(rs.next()){
                    out.write(rs.getString("name")+" "
                            +rs.getString("number")+"<br>");
                }
                //6.释放(关闭)资源
                rs.close();
                st.close();
                conn.close();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

}

浏览器输入http:// localhost:8080 / book / jdbcQuery或者,http:// localhost:8080 / book / mybatisQuery就能看到测试结果

也可通过JUnit的测试,在测试文件下新建测试类即可:

public class Test {
    @org.junit.Test
    public void findUaerByIdTest() throws Exception{
        String resource="mybatis-config.xml";
        InputStream inputStream= Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession=sqlSessionFactory.openSession();
        Book book=sqlSession.selectOne("test.findBookById",1000);
        System.out.println(book);
        sqlSession.close();
    }
}

贴图如下:

最后注意一下:

<mapper namespace="test">   
<select id="findUserById" parameterType="int" resultType="com.lmj.ssm.Book">

 

需要与jdbcServlet中的对应:

Book book=sqlSession.selectOne("test.findBookById",1000);

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值