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>
删除映射文件,然后测试代码。