MyBatis的配置与使用(增,删,改,查)
---恢复内容开始---
mybatis入门介绍
一、mybatis介绍
什么是mybtis?
mybatis 是一个简化和实现了 java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 jdbc 冗余代 码,并提供了一个简单易用的 api 和数据库交互。
mybatis 的前身是 ibatis,ibatis 于 2002 年由 clinton begin 创建。mybatis 3 是 ibatis 的全新设计,支持 注解和 mapper。
mybatis 流行的主要原因在于它的简单性和易使用性。在 java 应用程序中,数据持久化层涉及到的工作有:将从数据库查询到的数据生成所需要的 java 对象;将 java 对象中的数据通过 sql 持久化到数据库中。
mybatis 通过抽象底层的 jdbc 代码,自动化 sql 结果集产生 java 对象、java 对象的数据持久化数据库中的过程 使得对 sql 的使用变得容易。 如
为什么选择mybtis?
- 最重要的就是消除了很多jdbc是冗余。
- 学习成本很低
- 他能很好的与传统数据库协同工作。
- 支持sql语句。
- 他提供了与spring框架的集成。
- 它引入的性能较好。
二、jdac
java 通过 java 数据库连接(java database connectivity,jdbc)api 来操作关系型数据库,但是 jdbc 是一个 非常底层的 api,我们需要书写大量的代码来完成对数据库的操作。
我先从最传统是jdbc代码写起再来对比引入mybatis后两者的比较就会显而易见了。
第一步:创建数据库
第二步:student实体类
1 package com.nf; 2 3 import java.sql.date; 4 5 public class student { 6 7 private integer stuid; 8 private string name; 9 private string email; 10 private date dob; 11 12 public integer getstuid() { 13 return stuid; 14 } 15 16 public void setstuid(integer stuid) { 17 this.stuid = stuid; 18 } 19 20 public string getname() { 21 return name; 22 } 23 24 public void setname(string name) { 25 this.name = name; 26 } 27 28 public string getemail() { 29 return email; 30 } 31 32 public void setemail(string email) { 33 this.email = email; 34 } 35 36 public date getdob() { 37 return dob; 38 } 39 40 public void setdob(date dob) { 41 this.dob = dob; 42 } 43 44 @override 45 public string tostring() { 46 return "student{" + 47 "stuid=" + stuid + 48 ", name='" + name + '\'' + 49 ", email='" + email + '\'' + 50 ", dob=" + dob + 51 '}'; 52 } 53 }
第三步:创建studentmapper接口
package com.nf; import java.sql.sqlexception; public interface studentdao { //方法 public student findstudentbyid(int stuid) ; }
第四步:创建studentmapperimpl实现类
package com.nf; import java.sql.*; public class studentdaoimpl implements studentdao { @override public student findstudentbyid(int stuid) throws sqlexception { student student = null; connection connection; //获取连接 string jdbcurl = "jdbc:mysql://localhost:3306/student2?characterencoding=utf8&usessl=false&servertimezone=utc&rewritebatchedstatements=true"; connection = drivermanager.getconnection(jdbcurl,"root","123456"); try { //加载驱动 class.forname("com.mysql.cj.jdbc.driver"); } catch (classnotfoundexception e) { e.printstacktrace(); } //获取preparedstatement preparedstatement pst = connection.preparestatement("select * from students where stuid=?"); pst.setint(1,stuid); //查询获取结果 resultset rs = pst.executequery(); // 处理结果集 if(rs.next()){ student = new student(); student.setstuid(rs.getint("stuid")); student.setname(rs.getstring("name")); student.setemail(rs.getstring("email")); student.setdob(rs.getdate("dob")); } rs.close(); pst.close(); connection.close(); return student; }
获取数据:
jdbc缺点分析:
上述的每个方法中有大量的重复代码:创建一个连接,创建一个 statement 对象,设置输入参数,关闭资源(如 connection,statement,resultset)。
三、mybatis
我们现在使用mybatis现实上面的代码:
3.1 添加依赖(pom.xml)
1 <dependency> 2 <groupid>org.mybatis</groupid> 3 <artifactid>mybatis</artifactid> 4 <version>3.5.2</version> 5 </dependency>
3.2 全局配置文件(config.xml )
1 <?xml version="1.0" encoding="utf-8"?> 2 <!doctype configuration public "-//mybatis.org//dtd config 3.0//en" 3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <!--根标签--> 5 <configuration> 6 <!-- 环境,可以配置多个,default:指定采用哪个环境 --> 7 <environments default="mycom"> 8 <!-- id:唯一标识 --> 9 <environment id="mycom"> 10 <!-- 事务管理器,jdbc类型的事务管理器 --> 11 <transactionmanager type="jdbc"/> 12 <!-- 数据源,池类型的数据源 --> 13 <datasource type="pooled"> 14 <property name="driver" value="com.mysql.cj.jdbc.driver"/> 15 <property name="url" value="jdbc:mysql://localhost:3306/student2?characterencoding=utf8&usessl=false&servertimezone=utc&rewritebatchedstatements=true"/> 16 <property name="username" value="root"/> 17 <property name="password" value="123456"/> 18 </datasource> 19 </environment> 20 </environments> 21 <mappers> 22 <mapper resource="studentmapper.xml"></mapper> 23 </mappers> 24 </configuration>
3.3配置文件 studentmapper.xml ( studentmapper.xml )
第一步: 在 sql mapper 映射配置文件中配置 sql 语句,假定为 studentmapper.xml
查询操作:
//studentmapper.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:命名空间,随便写,一般保证命名空间唯一 --> <mapper namespace="com.nf.studentdao" >
<!--
column为java实体类的属性名 property为数据库属性名
-->
<resultmap id="mystudent" type="com.nf.student"> <id column="stuid" property="stuid"></id> <result column="name" property="name"></result> <result column="email" property="email"></result> <result column="dob" property="dob"></result> </resultmap>
<!-- statement,内容:sql语句。id:要与接口方法名相同,在同一个命名空间下保持唯一 resulttype:parameter:需要返回的类型;sql语句查询结果集的封装类型,tb_user即为数据库中的表 --> //查询
<select id="findstudentbyid" parametertype="int" resultmap="mystudent"> select stuid as stuid, name, email, dob from students where stuid=#{id} </select>
</mapper>
3.4 测试类
1 public class test2 { 2 public static void main(string[] args) throws sqlexception { 3 sqlsessionfactory factory = null; 4 try { 5 //指定全局配置的文件xml再读取配置文件 6 //(这里可以比喻成一个建筑图 工程师要建房子首先要先看图纸,我们现在把config.xml看做是一张图纸) 7 inputstream inputstream= resources.getresourceasstream("config.xml"); 8 // 构建sqlsessionfactory(创建一个工厂) 9 sqlsessionfactorybuilder builder = new sqlsessionfactorybuilder(); 10 factory = builder.build(inputstream); 11 system.out.println("1.配置的config.xml"+inputstream); 12 system.out.println("2.创建出一个工厂"+factory); 13 } catch (ioexception e) { 14 e.printstacktrace(); 15 } 16 // 获取sqlsession(打开工厂) 17 sqlsession sqlsession = factory.opensession(); 18 system.out.println("3.session"+sqlsession); 19 //studentmapper层(将东西放进工厂生产) 20 studentdao studentdao = sqlsession.getmapper(studentdao.class); 21 system.out.println("4.获得实现类的实例:"+studentdao); 22 student student = studentdao.findstudentbyid(1); 23 system.out.println(student); 24 25 sqlsession.close(); 26 } 27 }
删除操作:
第一步:接口写入一个方法(findstudenrdelete()):
package com.nf; import java.sql.sqlexception; import java.util.list; public interface studentdao { // 查询 public student findstudentbyid(int stuid) throws sqlexception; // 删除 public boolean findstudentdelete(int stuid);
第二步: 配置文件 studentmapper.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 4 5 <mapper namespace="com.nf.studentdao" > 6 7 <resultmap id="mystudent" type="com.nf.student"> 8 <id column="stuid" property="stuid"></id> 9 <result column="name" property="name"></result> 10 <result column="email" property="email"></result> 11 <result column="dob" property="dob"></result> 12 </resultmap> 13 14 //查询 15 <select id="findstudentbyid" parametertype="int" resultmap="mystudent"> 16 select stuid as stuid, name, email, dob 17 from students where stuid=#{id} 18 </select> 19 20 //删除 id:与接口的方法名要一致 student的实体类 21 <delete id="findstudentdelete" parametertype="com.nf.student"> 22 delete from students where stuid=#{id} 23 </delete>
24 <mapper>
第三步:测试类(testdelete.java)
1 package com.nf; 2 3 import org.apache.ibatis.session.sqlsession; 4 import org.apache.ibatis.session.sqlsessionfactory; 5 import org.apache.ibatis.io.resources; 6 import org.apache.ibatis.session.sqlsessionfactorybuilder; 7 8 import java.io.ioexception; 9 import java.io.inputstream; 10 11 12 //删除 13 public class test4 { 14 public static void main(string[] args) { 15 sqlsessionfactory factory = null; 16 try { 17 inputstream inputstream = resources.getresourceasstream("config.xml"); 18 sqlsessionfactorybuilder builder = new sqlsessionfactorybuilder(); 19 factory = builder.build(inputstream); 20 } catch (ioexception e) { 21 e.printstacktrace(); 22 } 23 sqlsession sqlsession = factory.opensession(); 24 studentdao studentdao = sqlsession.getmapper(studentdao.class); 25 26 boolean ok = studentdao.findstudentdelete(1);//点接口方法名 27 if(ok){ 28 system.out.println("删除成功"); 29 }else{ 30 system.out.println("删除失败"); 31 } 32 sqlsession.commit(); 33 } 34 }
添加操作:
第一步:接口写入一个方法(findstudenrdelete()):
package com.nf; import java.sql.sqlexception; import java.util.list; public interface studentdao { // 查询 public student findstudentbyid(int stuid) throws sqlexception; // 删除 public boolean findstudentdelete(int stuid); // 添加 public boolean findstudentinsert(student student); }
第二步:第二步: 配置文件 studentmapper.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 4 5 <mapper namespace="com.nf.studentdao" > 6 7 <resultmap id="mystudent" type="com.nf.student"> 8 <id column="stuid" property="stuid"></id> 9 <result column="name" property="name"></result> 10 <result column="email" property="email"></result> 11 <result column="dob" property="dob"></result> 12 </resultmap> 13 14 15 <select id="findstudentbyid" parametertype="int" resultmap="mystudent"> 16 select stuid as stuid, name, email, dob 17 from students where stuid=#{id} 18 </select> 19 20 21 <delete id="findstudentdelete" parametertype="com.nf.student"> 22 delete from students where stuid=#{id} 23 </delete> 24 //添加 25 <insert id="findstudentinsert parametertype="com.nf.student" "> 26 insert into students(name,email,dob) value(#{name},#{email},#{dob}) 27 </insert> 28 <mapper>
第三步:测试类(testinsert.java)
1 package com.nf; 2 3 import org.apache.ibatis.io.resources; 4 import org.apache.ibatis.session.sqlsession; 5 import org.apache.ibatis.session.sqlsessionfactory; 6 import org.apache.ibatis.session.sqlsessionfactorybuilder; 7 8 import java.io.ioexception; 9 import java.io.inputstream; 10 import java.sql.date; 11 import java.sql.sqlexception; 12 import java.text.parseexception; 13 import java.text.simpledateformat; 14 15 //添加 16 public class test3 { 17 public static void main(string[] args) throws sqlexception { 18 sqlsessionfactory factory = null; 19 try { 20 inputstream inputstream = resources.getresourceasstream("config.xml"); 21 sqlsessionfactorybuilder builder = new sqlsessionfactorybuilder(); 22 factory = builder.build(inputstream); 23 system.out.println("配置xml"+inputstream); 24 system.out.println("创建出一个工厂"+factory); 25 } catch (ioexception e) { 26 e.printstacktrace(); 27 } 28 sqlsession sqlsession = factory.opensession(); 29 studentdao studentdao = sqlsession.getmapper(studentdao.class); 30 student student = new student(); 31 //student.setstuid(4); 32 student.setname("小华"); 33 student.setemail("1084522@qq.com"); 34 // 日期转类型 35 simpledateformat simpledateformat = new simpledateformat("yyyy-mm-dd"); 36 java.util.date date = null; 37 try { 38 date= simpledateformat.parse("2055-6-2"); 39 } catch (parseexception e) { 40 e.printstacktrace(); 41 } 42 //new java.sql.date(date.gettime()); 43 student.setdob( new java.sql.date(date.gettime())); 44 //不严谨 45 //student.setdob(date.valueof("2055-6-2")); 46 boolean ok =studentdao.findstudentinsert(student); 47 if(ok){ 48 system.out.println("添加成功"); 49 }else{ 50 system.out.println("添加失败"); 51 } 52 studentdao.findstudentinsert(student); 53 54 sqlsession.commit(); 55 system.out.println(student.getstuid()); 56 sqlsession.close(); 57 } 58 }