Mybatis框架的简单运用
一、配置流程
1.流程示意图(通过xml映射文件实现):
2.流程:
2.1 导入包:
2.1.1 下载包
数据库驱动包(本文以mysql为例):https://mvnrepository.com/artifact/mysql/mysql-connector-java
mybatis框架包:https://mvnrepository.com/artifact/org.mybatis/mybatis
2.1.2 导入程序
将jar包放入程序新建的文件夹
选中jar包,右键build path->add to build path,结果如图,jar包已加载进程序内
2.2 添加规则文件
规则文件的位置:①\mybatis-3.4.1\org\apache\ibatis\builder\xml
②打开上面下载的mybatis框架文件夹,查找dtd
规则文件的key:官方文档内ctrl+f查找public:
选择window->preferences
点击ok,重复上面的操作,完成添加mapper规则文件。
2.3.编写配置文件
2.3.1 创建xml文件
在src文件下创建xml文件,填写文件名为mybatisconfig.xml,然后next:
选择dtd文件,然后next,
选择创建配置文件,然后next->finish,创建成功。
2.3.2 编写文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <!doctype configuration public "-//mybatis.org//dtd config 3.0//en" "mybatis-3-config.dtd" > 3 <configuration> 4 <!--environments标签用于配置数据库连接信息,可以配置多个数据库的连接信息 5 default属性:环境集里面可以配置多个数据库连接环境,但是必须要指定默认的环境,指定的是环境environment标签的id 6 --> 7 <environments default="sms"> 8 <!-- environment环境标签 ,用于配置一个数据库连接的信息--> 9 <environment id="sms"> 10 <!--指定使用的事务类型 11 jdbc : 使用jdbc的事务处理 12 manager: 不需要事务处理 13 --> 14 <transactionmanager type="jdbc"></transactionmanager> 15 <!--datasource标签:配置数据库连接信息 16 type:配置数据源的类型 17 jndi :使用jndi数据源,就是在web服务器配置数据源,让程序调用 18 pooled : 使用默认内置的连接池 19 unpooled:使用直连数据库,不需要连接池 20 --> 21 <datasource type="pooled"> 22 <!-- 连接四要素 --> 23 <property name="driver" value="org.gjt.mm.mysql.driver"/> 24 <property name="url" value="jdbc:mysql://localhost:3306/sms"/> 25 <property name="username" value="root"/> 26 <property name="password" value="12345"/> 27 </datasource> 28 </environment> 29 </environments> 30 <!-- 配置指定加载的映射文件 --> 31 <mappers> 32 <mapper class="cn.zwj.mapper.studentmapper"></mapper> 33 </mappers> 34 </configuration>
2.4 映射文件和映射接口
因为映射文件和映射接口要向对应,所以使用相同命名表示他们的对应关系,在多映射文件中可以很好找到相对应的接口
创建一个映射文件,
<?xml version="1.0" encoding="utf-8"?> <!doctype mapper public "-//mybatis.org//dtd mapper 3.0//en" "mybatis-3-mapper.dtd" > <mapper namespace="cn.zwj.mapper.studentmapper"> <!-- #{}类似于?(预处理块),与pojo中的变量名对应 --> <insert id="insert"> insert into tb_student (student_name, student_pwd, student_status, create_date, student_account) values (#{studentname}, #{studentpwd}, #{studentstatus}, #{createdate}, #{studentaccount}) </insert> </mapper>
1 package cn.zwj.mapper; 2 3 import cn.zwj.pojo.student; 4 5 public interface studentmapper { 6 int insert(student student); 7 }
通过xml中的<mapper>标签的namespace属性,来绑定对应的接口,<insert>标签的id属性值为借口中的方法名
2.5 pojo
1 import java.io.serializable; 2 import java.util.date; 3 4 public class student implements serializable{ 5 private static final long serialversionuid = -9125884258413809899l; 6 public long studentid;//bigint(20) not null auto_increment comment '学生编号', 7 public string studentname;//varchar(50) null default null comment '姓名', 8 public string studentpwd;//varchar(50) null default null comment '密码', 9 public integer studentstatus;//int(11) null default null comment '状态', 10 public date createdate;//datetime null default null comment '创建时间', 11 public string studentaccount;//varchar(50) null default null comment '学生帐号', 12 public long getstudentid() { 13 return studentid; 14 } 15 public void setstudentid(long studentid) { 16 this.studentid = studentid; 17 } 18 public string getstudentname() { 19 return studentname; 20 } 21 public void setstudentname(string studentname) { 22 this.studentname = studentname; 23 } 24 public string getstudentpwd() { 25 return studentpwd; 26 } 27 public void setstudentpwd(string studentpwd) { 28 this.studentpwd = studentpwd; 29 } 30 public integer getstudentstatus() { 31 return studentstatus; 32 } 33 public void setstudentstatus(integer studentstatus) { 34 this.studentstatus = studentstatus; 35 } 36 public date getcreatedate() { 37 return createdate; 38 } 39 public void setcreatedate(date createdate) { 40 this.createdate = createdate; 41 } 42 public string getstudentaccount() { 43 return studentaccount; 44 } 45 public void setstudentaccount(string studentaccount) { 46 this.studentaccount = studentaccount; 47 } 48 }
与数据库中的一个表对应的实体类,实现set/get方法
2.6 会话构建工具类
1 import java.io.ioexception; 2 import java.io.reader; 3 4 import org.apache.ibatis.io.resources; 5 import org.apache.ibatis.session.sqlsession; 6 import org.apache.ibatis.session.sqlsessionfactory; 7 import org.apache.ibatis.session.sqlsessionfactorybuilder; 8 9 public class mybatisutils { 10 //对外只开放一个工厂 11 public static final sqlsessionfactory ssf = createsqlsessionfactory(); 12 //声明一个线程变量 13 public static final threadlocal<sqlsession> thread_local = new threadlocal<>(); 14 15 //1.获得会话工厂 16 private static sqlsessionfactory createsqlsessionfactory() { 17 try { 18 //读取配置文件 19 reader reader = resources.getresourceasreader("mybatisconfig.xml"); 20 //创建会话工厂构建类对象 21 sqlsessionfactorybuilder builder = new sqlsessionfactorybuilder(); 22 //构建会话工厂 23 return builder.build(reader); 24 } catch (ioexception e) { 25 // todo auto-generated catch block 26 e.printstacktrace(); 27 } 28 return null; 29 } 30 31 //2.获得会话 32 public static sqlsession getsession() { 33 if (thread_local.get() == null) { 34 sqlsession session = ssf.opensession(); 35 thread_local.set(session); 36 } 37 return thread_local.get(); 38 } 39 40 public static void close() { 41 if (thread_local.get() != null) { 42 sqlsession session = thread_local.get(); 43 session.close(); 44 thread_local.remove(); 45 } 46 } 47 }
为什么只对外开放一个工厂?
答:因为如果出现多个数据源,数据库的连接就可能来自于不同的数据源!导致数据库连接无法同步,从而导致事务失效!
为什么要声明一个线程变量?
答:同访问的一条线程,获得的会话是相同的,实现线程安全
2.7.测试
1 import org.apache.ibatis.session.sqlsession; 2 import org.junit.test; 3 4 import cn.zwj.mapper.studentmapper; 5 import cn.zwj.pojo.student; 6 import cn.zwj.utils.mybatisutils; 7 8 public class studenttest { 9 @test 10 public void test1() { 11 //获得会话 12 sqlsession session = mybatisutils.getsession(); 13 //构建映射接口 的动态对象 14 studentmapper studentmapper = session.getmapper(studentmapper.class); 15 student student = new student(); 16 student.setstudentname("张三1"); 17 int insert = studentmapper.insert(student); 18 system.out.println(insert); 19 //提交事务 20 session.commit(); 21 mybatisutils.close(); 22 } 23 }
当控制台输出一个大于0的数字,表示成功实现运用mybatis框架操作数据库
2.8 修改为注解实现
2.8.1 流程示意图:
2.8.2 修改代码:
1 import org.apache.ibatis.annotations.insert; 2 import org.apache.ibatis.annotations.options; 3 4 import cn.zwj.pojo.student; 5 6 public interface studentmapper { 7 @insert("insert into tb_student (student_name, student_pwd, student_status, create_date, student_account) values (#{studentname}, #{studentpwd}, #{studentstatus}, #{createdate}, #{studentaccount})") 8 @options(usegeneratedkeys = true, keyproperty = "studentid") 9 //@options:注解声明生成主键 10 int insert(student student); 11 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <!doctype configuration public "-//mybatis.org//dtd config 3.0//en" "mybatis-3-config.dtd" > 3 <configuration> 4 <environments default="sms"> 5 <environment id="sms"> 6 <transactionmanager type="jdbc"></transactionmanager> 7 <datasource type="pooled"> 8 <property name="driver" value="org.gjt.mm.mysql.driver"/> 9 <property name="url" value="jdbc:mysql://localhost:3306/sms"/> 10 <property name="username" value="root"/> 11 <property name="password" value="12345"/> 12 </datasource> 13 </environment> 14 </environments> 15 <!-- 修改映射文件为映射接口--> 16 <mappers> 17 <mapper class="cn.zwj.mapper.studentmapper"></mapper> 18 </mappers> 19 </configuration>
删除映射文件,然后测试代码。