今天就来聊聊这个东西 今天的主角相信大家也看到了 MyBaties 是个什么东东 它有什么作用?怎么用?好不好用今天来说说 .说到MyBaties 就不得不谈到JDBC大家可能都知道 JDBC用来操作数据库 几乎所有的项目都会跟数据库进行交互 我们传统的JDBC访问数据主要为以下几部
- 通过Class.forName()加载驱动程序
- 通过DriverManage.getConnection()获取数据库连接
- 通过Connection.createStatement()或者preparedStatement()创建操作数据库的语句对象
- 执行SQL语句
- 处理SQL语句
- 关闭资源
弊端
- 他将数据库连接的信息都写在了java代码中 不便于数据源的切换
- 频繁的创建销毁数据连接 影响了程序的性能
- java源码中出现了大量的SQL语句 不便于修改SQL
- java对象模型与数据库关系不兼容 jdbc操作数据库时存在大量的实体对象与数据库关系之间相互转换的代码 可维护性差
这时MyBaties就出现了 MyBaties是基于JDBC的持久化层框架 它对jdbc操作数据库进行了封装 我们不需要花费时间区关注如何区处理注册驱动、创建连接 创建语句对象 以及对象与数据库关系的转化之间繁琐的代码,只需要关注SQL本身 而且不需要将SQL写在源码中 直接写在XML配置文件中 是不是很神奇呢?
那么如何去使用MyBaties
1.创建java项目
2.添加相关联的依赖包
3.添加MyBaties的核心配置文件
4.创建数据库 表以及实体类
5.添加MyBaties映射文件
6.创建SqlSessionFactory对象 SqlSession对象
下载MyBaties的地址网上一搜就可以找到 https://github.com/mybatis/mybatis-3/releases
解压后会发现里面有很多jar包我们可以选择部分添加到项目中 只需要这几个就够了 现在
log4j-1.2.17.jar 这个jar包是一个java日志文件夹包
mybatis-3.5.1.jar 使用MyBateis时必用的架包
mysql-connector-java-5.1.47.jar 用来连接数据库
slf4j-api-1.7.26.jar 简单日记门面
slf4j-log4j12-1.7.26.jar
3.添加MyBaties核心配置文件 这里主要是 配置数据库的连接信息和 关联映射的文件
添加日志组件log4j的配置文件log4j.propertis至classpath根目录下,用于输出MyBatis执行过程中的日志信息。这里的
com/newroad/dao/StudentMapper.xml 是StudentMapper.xml文件的路径不能写错了
<!-- 关联隐射文件 --> <mappers> <mapper resource="com/newroad/dao/StudentMapper.xml"/> </mappers>
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 6 <configuration> 7 <!-- 配置环境信息,即数据源信息 --> 8 <environments default="d1"> 9 <environment id="d1"> 10 <!-- 配置事务管理器 --> 11 <transactionManager type="JDBC" /> 12 <!-- 配置数据源以及数据库连接信息 --> 13 <dataSource type="POOLED"> 14 <property name="driver" value="com.mysql.jdbc.Driver" /> 15 <property name="url" value="jdbc:mysql://localhost:3306/fresh?characterEncoding=UTF-8" /> 16 <property name="username" value="root" /> 17 <property name="password" value="root" /> 18 </dataSource> 19 </environment> 20 </environments> 21 22 <!-- 关联隐射文件 --> 23 <mappers> 24 <mapper resource="com/newroad/dao/StudentMapper.xml"/> 25 </mappers> 26 27 </configuration> 28
4.创建数据库、表以及实体类
package com.newroad.entity; public class Student { private Integer id; private String name; private String password; private String email; @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + "]"; } public Student(Integer id, String name, String password, String email) { super(); this.id = id; this.name = name; this.password = password; this.email = email; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
5.创建StudentMapper.xml 的映射文件 MyBatis映射文件是一个XML文件,在这个XML文件中可以 我们可以写要执行的SQL语句
3 <!-- namespace必須属性 使用mybaties时通过namespace的值找到 Mapper文件 --> 4 <mapper namespace="com.newroad.dao.StudentMapper"> 这一步很重要 是一个必须的属性
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 <!-- namespace必須属性 使用mybaties时通过namespace的值找到 Mapper文件 --> 4 <mapper namespace="com.newroad.dao.StudentMapper"> 5 <!-- 添加用户信息 --> 6 <insert id="save"> 7 insert into student(id,name,password,email) values (#{id},#{name},#{password},#{email}) 8 </insert> 9 10 <!-- 删除学生信息通过ID --> 11 <delete id="deleteById" > 12 delete from student where id=#{id} 13 4 </delete> 15 16 17 <!-- 修改学生信息 --> 18 <update id="updateById"> 19 update student set name=#{name},password=#{password},email=#{email} where id=#{id} 20 </update> 21 <!-- 查询学生信息 --> 22 <!-- 根据学号查询学生信息 --> 23 <!-- resultType | resultMap 这两个属性必须二选一 指的是将查询到的数据转换成怎样的pojo对象 --> 24 <select id="selectByid" resultType="com.newroad.entity.Student"> 25 select *from student where id=#{id} 26 27 </select> 28 29 <!-- 查询所有学生信息 --> 30 <select id="selectAll" resultType="com.newroad.entity.Student"> 31 select *from student 32 33 </select> 34 35 <!--分页查询 --> 36 <select id="selectByPages" resultType="com.newroad.entity.Student"> 37 select *from student limit #{pageNum},#{pageSize} 38 </select> 39 40 41 42 </mapper>
6.创建SqlSessionFactory、SqlSession对象
注意: int num = session.insert("com.newroad.dao.StudentMapper.save", stu);
这里的 com.newroad.dao.StudentMapper 对应着StudentMapper.xml映射文件中的 namespace的值 而后面的save 对应id的名字一定要相同
1 package com.newroad.test; 2 3 import static org.junit.Assert.assertEquals; 4 import java.io.InputStream; 5 import java.util.List; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 import org.junit.After; 10 import org.junit.Before; 11 12 import org.junit.Test; 13 14 import com.newroad.entity.Student; 15 16 public class Test2 { 17 // 获取连接配置对象 18 InputStream in = Test2.class.getResourceAsStream("/mybatis-config.xml"); 19 // 创建sqlsessionFactoryBuilder 20 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); 21 SqlSessionFactory factory = builder.build(in); 22 SqlSession session; 23 24 @Before // 在每个test方法执行之前都会执行这个方法 25 public void init() { 26 session = factory.openSession(); 27 } 28 29 @Test // 测试的方法 30 public void test() { 31 Student stu = new Student(12, "pan", "10086", "123432@qq.com"); 32 int num = session.insert("com.newroad.dao.StudentMapper.save", stu); 33 // 断言结果 如果结果为1 成功 34 assertEquals(num, 1); 35 36 } 37 38 @Test 39 public void deleteById() { 40 int num = session.delete("com.newroad.dao.StudentMapper.deleteById", 6); 41 System.out.println("num=" + num); 42 assertEquals(num, 1); 43 } 44 45 @Test 46 public void selectOne() { 47 Student stu = session.selectOne("com.newroad.dao.StudentMapper.selectByid", 4); 48 System.out.println("num=" + stu); 49 assertEquals(stu, 1); 50 } 51 52 @Test 53 public void listStudent() { 54 List<Student> students = session.selectList("com.newroad.dao.StudentMapper.selectAll"); 55 students.forEach(stu -> System.out.println(stu)); 56 57 } 58 59 @After // 在每个test方法执行后就会执行 60 public void close() { 61 session.commit(); 62 session.close(); 63 } 64 65 }