首页 > IT职业 > IT职场 > 研究数据库-如何使用mybatis
为了更好的理解 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>
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年的愿望完成了多少呀?
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4729/viewspace-2824501/ ,如需转载,请注明出处,否则将追究法律责任。