有关MyBatis起步
一个可以基本实现运行的工程的目录结构如下:
需要依赖数据库jar包和mybatisjar包:
conf.xml文件
conf.xml可以简化JDBC操作,实现数据的持久化。其配置数据库信息和需要加载的映射文件。这个文件完成的工作是访问数据库、创建数据库操作语句等等。本来这些东西在JDBC当中要写很多遍,但是每次写的无非就那几句,所以这个conf不仅是必要的,也是充分的。
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/person?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="shopkeeper\mapper\personMapper.xml"/> </mappers> </configuration>
conf文件规定了:
一、数据库信息
MyBatis运行时的数据库环境。通过environments标签即其下属的environment标签可以声明可用的数据库环境,通过environments的default属性来指定运行时默认的数据库环境。
事务的提交方式和数据源类型。每一个environment都有一个transactionManager标签,其Type属性规定了事务提交方式。可取值有,JDBC :利用JDBC方式处理事务(commit rollback close);MANAGED:将事务交由其他组件去托管(spring, jboss)。environment的另一个标签是dataSource,其Type属性规定了数据源类型。可取值为,UNPOOLED:传统的JDBC模式(每次访问数据库,均需要打开、关闭等数据库操作,但是打开、关闭数据库是比较消耗性能的);POOLED:使用数据库连接池;JNDI:从tomcat中获取一个内置的数据库连接池(数据库连接池-数据源),默认会关闭连接。
dataSource下的标签声明了打开某个数据库的操作,从驱动到数据库位置到账户密码都和JDBC如出一辙。
conf.xml
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/person?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
JDBC
try
{
Class.forName(“com.mysql.cj.jdbc.Driver”);
Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/STUDB?serverTimezone=UTC”, “root”, “password”);
…
conn.close();
}
catch(Exception e)
{
System.err.println(“异常”+e);
}
二、映射文件
conf.xml还规定了绑定的映射文件Mapper.xml,这样我们在读取conf.xml时还能连带着读取到Mapper.xml的路径,这样就可以访问它了。所以这个Mapper时什么东西,我将在下下个标题总结。
实体类
实体类将数据库的一张表映射成为一个对象,这样我们可以如同操作一个实体对象一般操作数据库的一张表。
public class Person {
private int age;
private String name;
private int id;
public Person() {
}
public Person(int age, String name, int id) {
this.age = age;
this.name = name;
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", id=" + id +
'}';
}
}
Mapper.xml
直截了当的来讲,Mapper就是写了MyBatis下操作数据库时的数据操作语句。
<mapper namespace="shopkeeper.mapper.personMapper"> <!--parameterType :输入参数的类型 resultType:查询返回结果值的类型,返回类型--> <select id="queryPersonById" resultType="shopkeeper.entity.Person" parameterType="int"> select * from person where id=#{id} </select> <insert id="addPerson" parameterType="shopkeeper.entity.Person"> insert into person (age,name,id) values (#{age},#{name},#{id}) </insert> <update id="updatePerson" parameterType="shopkeeper.entity.Person"> update person set age=#{age},name =#{name} where id=#{id} </update> <delete id="detelePersonById" parameterType="int"> delete from person where id=#{id} </delete> <select id="queryAll" resultType="shopkeeper.entity.Person"> select * from person </select> </mapper>
因为conf.xml中可能会映射多个Mapper文件,所以需要能唯一标识每一个Mapper。mapper标签的namespace就是干的这件事情。
在mapper标签里面就可以写这些sql语句了,同样的,也需要唯一标识一个mapper的一条sql语句,其属性id就是干的这件事。
后续我们就会使用namespace+id来确定究竟使用哪条语句。
此外,每一条sql,parameterType是输入参数的类型,resultType是查询返回结果值的类型并且有以下约定:
输入参数parameterType 和输出参数resultType 在形式上都只能有一个;
如果输入/输出参数:是简单类型(8个基本类型+String) 的话,可以使用任何占位符# {xxxx};如果是对象类型,则必须是对象的属性#属性名;
输出参数: 如果返回值类型是一个对象(如Person) ,则无论返回一个还是多个,在resultType都写成一个。
Test类
在test类中将会真正使用Mybatis来访问数据库并进行操作,有两种操作方式,将在下一次总结中进行记录。