继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

研究数据库-如何使用mybatis

Caeser110
关注TA
已关注
手记 139
粉丝 31
获赞 154

前言

为了更好的理解 mybatis 这个框架的使用方式,我采样无其他框架的 Demo 直接使用 mybatis ,来学习 mybatis 的使用。让代码是如何调用的,结构清晰的展示出来,知道哪里做了关联,哪里做了输入输出,而且还通过为什么要使用框架,没有框架之前是怎样,使用框架时解决了什么问题,都一一做解释。

图片描述

思考

使用 Java 代码连接数据库,会有这样一个问题,就是我是连接一次就断开,还是一直保持连接的状态,首先我先来看这份代码

import java.sql.*;
public class connectdt {//此类为连接数据库的类
	static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
	static final String DB_URL = "jdbc:mysql://localhost/emp";
	static final String USER = "root";
	static final String PASS = "123456";
	String struser = "username", strpass = "password", strtable1 = "admindt", strtable2 = "books",ID="id";
	Connection conn = null;
	Statement stmt = null;

	public connectdt() {
		try {
			Class.forName(JDBC_DRIVER);// 工程要连接额外的jar包
			conn = DriverManager.getConnection(DB_URL, USER, PASS);
			stmt = conn.createStatement();
		} catch (Exception ee) {
			ee.printStackTrace();
		}
	}
}

以上是一份很正常的 JDBC 连接代码,那好,我们下次再操作数据库的时候是再连接一次(再次调用),还是说这份连接可以一直保持连接的状态,不需要再次连接。很显然,我这份代码每次使用数据库都会连接一次,有好处也有坏处,好处就是,如果你长时间不使用数据库的连接,我这份代码就显得很优雅,因为没有造成浪费,坏处就是如果频繁使用,一旦出现频繁的关闭和打开,就会造成浪费。

  • 只连一次就关闭
public class addook extends JFrame implements ActionListener{
	JLabel label[]={new JLabel("ISBN"),new JLabel("书名"),new JLabel("出版社"),new JLabel("库存")};
	JTextField field[]={new JTextField(),new JTextField(),new JTextField(),new JTextField()};
	JButton submit=new JButton("添加");
	String namepattern = "[\u4e00-\u9fa5]{4,15}";//4到15位汉字
	String sql="";
	connectdt jdbc = new connectdt();// 连接数据库类
	Statement stmt = jdbc.stmt;
	public addook(){…//此处省略数行代码
	public void init(){…//此处省略数行代码
	public void actionPerformed(ActionEvent e) {
		try {
			if(e.getSource()==submit){
				sql="insert into books (ISBN,TITLE,PUBLISH,STOCK) values('"+strT[0]+"','"+strT[1]+"','"+strT[2]+"',"+strT[3]+");";
				rs.close();//关闭
				stmt.close();//关闭
				dispose();	
			}
		}catch (Exception ee) {
			ee.printStackTrace();
		}
	}
}

是自己管理还是交给封装性更好的代码来管理呢?于是连接池出现。

连接池

  • 持久连接
    连接池是维护的数据库连接的缓存,以便在将来需要对数据库的请求时可以重用这些连接。连接池用于增强在数据库上执行命令的性能。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动网站的请求应用,成本高昂,浪费资源。在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。连接池还减少了用户必须等待建立与数据库的连接的时间。

使用连接池

在使用连接池之后,我们发现很多时候写一份SQL难以满足我们的需求,会出现频繁更新SQL语句的情况,比如更新操作,有的时候我们需要更新三个参数,写一个更新的SQL语句:

UPDATE pssm_goods_category set name='办公用品1',category_level1='701',category_level2='0' WHERE id=49;

当更新一个参数的时候需要写另一个语句:

UPDATE pssm_goods_category set name='办公用品1',category_level1='701' WHERE id=49;

如果有50个参数呢?于是出现了动态SQL的概念

<update id="updateGoodsCategoryByTargetItem" parameterType="com.supermarket.pssmsys.entity.GoodsCategory"
		>
		UPDATE pssm_goods_category
		<set>
			<if test="targetItem.name!=null">name=#{targetItem.name},</if>
			<if test="targetItem.categoryLevel1>0">category_level1=#{targetItem.categoryLevel1},</if>
			<if test="targetItem.categoryLevel2>0">category_level2=#{targetItem.categoryLevel2},</if>
			<if test="targetItem.createTime!=null">create_time=#{targetItem.createTime},</if>
			<if test="targetItem.editTime!=null">edit_time=#{targetItem.editTime}</if>
		</set>
		WHERE
		id = #{targetItem.id}	
	</update>

MyBatis

  • 持久框架
    MyBatis就支持动态SQL,意味着写一份SQL就可以支持多种使用方式。
    MyBatis是一个Java持久化框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来。
    与其他的对象关系映射框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作,或者要完全控制SQL的执行,MyBatis是一个不错的选择。
    与JDBC相比,MyBatis简化了相关代码:SQL语句在一行代码中就能执行。MyBatis提供了一个映射引擎,声明式的把SQL语句执行结果与对象树映射起来。通过使用一种内建的类XML表达式语言,或者使用Apache Velocity集成的插件,SQL语句可以被动态的生成。

如何使用MyBatis

public class Main {
	public static void main(String[] args) throws IOException {
        //mybatis的配置文件
        String resource = "mybatis-config.xml";
        //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
        InputStream is = Main.class.getClassLoader().getResourceAsStream(resource);
        //构建sqlSession的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
        //创建能执行映射文件中sql的sqlSession
        SqlSession session = sessionFactory.openSession();
        /**
         * 映射sql的标识字符串,
         * com.caeser.service.BookMapper是BookMapper.xml文件中mapper标签的namespace属性的值,
         * getTITLE是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
         */
        String statement = "com.caeser.entity.Books.getTITLE";//映射sql的标识字符串

        BookMapper bookMapper = session.getMapper(BookMapper.class);

        //执行查询返回一个唯一user对象的sql
        Books books = bookMapper.getBook(1);
        System.out.println(books.getTITLE());

        session.close();
    }
}

结尾

前半段的代码来自我很久之前的一份图书管理系统的源码,很多大学新生都在研究使用我的那份代码,我感到很荣幸。后半段的代码来自毕设项目,使用了MyBatis 的动态SQL,很方便的实现了一份代码多种场合的复用。
最近一段时间可能会比较忙吧,我会尽量写点有用的东西,也开始逐步学习前端的知识,不过我发现,前端的知识很零碎,没有那么多的长篇大论,这需要引起的重视,注重积累,以前我总以为前端没什么逻辑,学习起来就是在背诵的感觉,慢慢的我觉得前端也挺好玩的了。
数据库方面有很长的路要走,双12了,也快年底了,各位2019年的愿望完成了多少呀?
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP