自学笔记,如有错误请指出,我虚心改正
环境说明:Windows10、MyEclipse2016ci、jdk1.8、MySQL5.7、Tomcat9.0
第一次说MyBatis只是完成从JDBC到MyBatis过渡,直观地展示MyBatis的实现,之后会说MyBatis如何一步一步完成甚至和Spring整合,在此之前可以回顾一下JDBC(https://blog.csdn.net/jinxlzc/article/details/83690134)
回顾完毕之后来看我们的Mybatis,创建一个名为MybatisDemo的web项目,项目的结构如下:
数据库
我使用的是MySQL数据库,在数据库软件中创建mybatistest库在该库中创建student表,该表的结构如下:
需要注意的是我这里使用的MyISAM数据库引擎,部分引擎不兼容Mybatis,具体原因我还不知道,查了很多博客与资料也没有解释,知道的朋友可以评论告诉我
外部包
该项目需要两个外部包
第一个是数据库连接包 mysql-connector-java-5.0.8-bin.jar,即在使用JDBC时我们用到的包,因为我使用的数据库是MySQL,该包在MySQL官网就能找到下载链接(https://dev.mysql.com/downloads/connector/j/),这里我使用的是5.0.8版本的
第二个是mybatis-3.4.2.jar,这里我用的是Mybatis的jar包而非mybatis和Spring整合jar包,现在Mybatis的资源托管在GitHub上,下载连接(https://github.com/mybatis/mybatis-3/releases)
将这这两个外部包导入项目前期准备就基本完成
mysql.properties
mysql.properties是外部配置文件,里面保存有数据库的基本配置信息,包括数据库的驱动、数据库的url路径、数据库的用户名和密码,均以键值对形式保存,里面内容需根据自己的实际情况进行配置
该文件需要自行在src文件夹下创建新文件然后命名为mysql.properties,该文件源码如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/mybatistest?useUnicode\=true&characterEncoding\=utf8
jdbc.username=root
jdbc.password=root
pojo包
src下创建pojo包,该包保存有对应表结构的pojo类,还有与每个pojo类对应并保存了动态SQL的XML文件
以我数据库中的student表为例,在pojo包下创建Student.java和收Student.xml,在Student.java填入各种对应数据库结构封装属性和set、get方法,在Student.xml保存各种对应增删改查操作的动态SQL并起别名方便之后调用
Student.java代码如下:
package com.lzc.pojo;
public class Student
{
private int id;
private String name;
public Student()
{
//保留空参构造,因为下面有一个非空参构造则空参构造器不会自动生成,
//但实际会用到,使用在这里我们手动创建一个空参构造器
}
public Student(String name,int id)
{
this.name=name;
this.id=id;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id=id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
}
Student.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 通常设置成pojo包名
在后续调用sql语句的时候 会使用到 -->
<mapper namespace="com.lzc.pojo">
<!-- 这条语句中 用id:listStudent进行标示 供后续代码调用
resultType表示的返回一个关联Student类的数据
在这里本来应该使用的是com.tzy.pojo.Student
但是在之前的mybatis-configuration.xml中定义了
typeAliases别名 所以可以直接使用Student-->
<!--查所有-->
<select id="listStudent" resultType="Student">
select * from student
</select>
<!--增-->
<insert id="addStudent" parameterType="Student" >
insert into student (id,name) values (#{id},#{name})
</insert>
<!--删-->
<delete id="deleteStudent" parameterType="Student" >
delete from student where id= #{id}
</delete>
<!--查-->
<select id="getStudent" parameterType="_int" resultType="Student">
select * from student where id= #{id}
</select>
<!--改-->
<update id="updateStudent" parameterType="Student" >
update student set name=#{name} where id=#{id}
</update>
</mapper>
mybatis-configuration.xml
mybatis-configuration.xml是Mybatis的核心配置文件,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部配置文件 -->
<properties resource="mysql.properties">
</properties>
<typeAliases>
<!-- 定义别名 -->
<!-- 针对单个别名定义type:类型的路径 alias:别名 -->
<typeAlias type="com.lzc.pojo.Student" alias="Student"/>
<!-- 下面一行package name 作用为批量定义别名 指定一个包名 mybatis会自动扫描这个
包中的pojo类 自动定义别名 别名就是类名(首字母大小写均可) -->
<package name="com.lzc.pojo"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 事务控制交给mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池 由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<!-- resource方法 一次加载一个映射文件 注意路径和xml文件-->
<mappers>
<mapper resource="com/lzc/pojo/Student.xml"/>
</mappers>
</configuration>
test包
在src下创建test包用于对增删改查的测试,在该包下创建测试类TestMybatis.java,第一步要配置好Mybatis的基本信息并获取会话,TestMybatis.java具体代码如下:
package com.lzc.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.lzc.pojo.Student;
public class TestMybatis {
public static void main(String[] args) throws IOException {
//mybatis配置文件
String resource = "mybatis-configuration.xml";
//得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂 传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session=sqlSessionFactory.openSession();
//填入
//CURD
//代码
//区域
}
}
}
查所有
根据SQL( select * from student )查找的结果集是整张表的内容,使用list接收并用for语句将其全部输出,为了方便观察之后增删改查操作,我在下面所有增删改查操作之后都会添加如下代码:
System.out.println("当前数据库student表内容如下");
List<Student> cs=session.selectList("listStudent");
for (Student a : cs) {
System.out.println(a.getName()+" "+a.getId());
}
该操作会将表内当前所有内容输出,目前数据库为空:
运行该段代码结果如下:
增
根据配置文件与SQL,需要向session提供含有增加条目的id和name的Student对象,填入代码如下:
Student st1=new Student("李泽辰",1);
Student st2=new Student("周杰伦",2);
Student st3=new Student("陈奕迅",3);
Student st4=new Student("邓紫棋",4);
Student st5=new Student("林宥嘉",5);
session.insert("addStudent",st1 );
session.insert("addStudent",st2 );
session.insert("addStudent",st3 );
session.insert("addStudent",st4 );
session.insert("addStudent",st5 );
运行结果如下:
当前数据库状态:
删
根据配置文件与SQL,需要向session提供含有删除条目的id的Student对象,以删除周杰伦为例,填入代码如下:
Student st=new Student();
st.setId(2);
session.delete("deleteStudent", st);
运行结果如下:
当前数据库状态:
改
根据配置文件与SQL,需要向session提供含有修改条目的id和修改的新name的Student对象,以把陈奕迅改名为张学友为例填入代码如下:
Student st=new Student("张学友",3);
session.update("updateStudent", st);
运行结果如下:
当前数据库状态:
查
根据配置文件与SQL,需要向session提供含有查询条目的id的Student对象,以查询id为4和5为例,填入代码如下:
Student st1=new Student();
Student st2=new Student();
st1.setId(4);
st1=session.selectOne("getStudent", st1);
System.out.println(st1.getName()+" "+st1.getId());
st2.setId(5);
st2=session.selectOne("getStudent", st2);
System.out.println(st2.getName()+" "+st2.getId());
运行结果如下: