MyBatis 学习

本文介绍了JDBC在实际开发中的不足,如重复代码多、SQL语句不易配置和维护。然后,概述了MyBatis框架,它封装了JDBC,提高了开发效率。最后,展示了MyBatis的配置文件和映射文件的示例,以及如何在Java程序中使用MyBatis执行SQL查询并获取结果。
摘要由CSDN通过智能技术生成

1:JDBC开发存在哪些缺点?

1):从数据库中查询学生信息,将学生信息封装为学生对象,将学生对象放到List集合中,进行展示。

package com.fangjun.jdbc;

import com.fangjun.javabean.Student;

import java.sql.*;
import java.util.ArrayList;
import java.util.ResourceBundle;

public class Test05 {
    public static void main(String[] args) {
        Connection connection=null;
        Statement statement =null;
        ResultSet resultSet=null;//结果集对象
        ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
        String driver = jdbc.getString("driver");
        String url = jdbc.getString("url");
        String user = jdbc.getString("user");
        String pass = jdbc.getString("pass");
        ArrayList<Student> students = new ArrayList<>();
        try {
            Class.forName(driver);
            connection=DriverManager.getConnection(url,user,pass);
            statement=connection.createStatement();
            String sql="select id,name,birth from tbl_student";
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()){
                String id = resultSet.getString(1);
                String name = resultSet.getString(2);
                String birth = resultSet.getString(3);
                Student student = new Student();
                student.setId(id);
                student.setName(name);
                student.setBirth(birth);
                students.add(student);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if (resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        //在这里拿着list集合去展示
        for (Student student:students){
            System.out.println(student);
        }
    }
}

缺点:
1)重复代码太多,开发效率降低;
以下代码反复从结果集中取数据,反复调用对象的Set和Get方法给对象的属性赋值。这个过程完全可以使用反射机制替代,mybatis框架就是别人提前写好了java代码。他封装了jdbc代码,利用反射机制,帮助我们创建java对象。

            while (resultSet.next()){

                  //反复调用同一个方法,只有参数不同
                String id = resultSet.getString(1);
                String name = resultSet.getString(2);
                String birth = resultSet.getString(3);


                Student student = new Student();
                 //反复调用同一个方法,只有参数不同
                student.setId(id);
                student.setName(name);
                student.setBirth(birth);
                students.add(student);
            }

2)jdbc中编写在java代码,SQL语句不支持配置。语句可能后期需要调优以及修改。在java程序中编写的SQL语句,修改后,后期需要重新修改,会导致代码的重新编译与部署。违背OCP原则。

2:Mybatis框架的概述

框架的表现形式就是别人写好的一堆class文件,这些字节码通常被打包成了jar包,使用这个框架只需要将jar包引入到classpath中就可以。使用框架的目的是提高开发效率。

3:Mybatis的使用

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"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/wkcto"/>
                <property name="username" value="root"/>
                <property name="password" value="333"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="SqlMapper.xml"/>
    </mappers>
</configuration>

SqlMapper.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="dd">
    <!--id具有唯一性,代表SQL语句,id具有唯一性,代表了这条sql语句,将来这个id是需要“拷贝”到java程序当中的。查询结果集的列名要和javabean的属性名对应上,不对应的时候使用as关键字起别名。 通过resultType 诉mybatis,最终查询出的结果集赋值到javabean的哪个对象上面-->
    <select id="sdsdad" resultType="com.javabean.Student">
        select id as sid,name as sname,birth as sbirth from tbl_student
    </select>
</mapper>

对应的java程序

package com.fangjun;

import com.javabean.Student;
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.InputStream;
import java.util.List;


public class mybaits001 {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        SqlSession sqlSession = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //事务自动提交机制关闭,等同于connection.setAutoCommit(false);
            sqlSession = sqlSessionFactory.openSession();

            //执行业务逻辑
            List<Student> students = sqlSession.selectList("sdsdad");
            for (Student student:students){
                System.out.println(student.getSid()+","+student.getSbirth()+","+student.getSname());
            }
            //没有出现异常,则事务结束,进行提交
            sqlSession.commit();
        } catch (Exception e) {
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        }finally {
            if (sqlSession!=null){
                sqlSession.close();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值