使用MyBatis映射器实现数据库操作,常用的三种方式
xml+接口映射器,注解+接口映射器都是开发中常用的方法,具体区别如下:
xml映射器+接口映射器,SQL都写在xml中,整体的代码耦合度低,写起来麻烦
注解+接口映射器,SQL写在注解中,整体代码简洁,开发方便,但代码的耦合度高
大致上分为四个文件:主配置文件、xml映射器、实体类、调用程序
<?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>
<!-- 数据源环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 主配置文件引入映射器 -->
<mappers>
<!--
resource属性,代表当前的 mapper配置是引入的xml映射器
属性的值,就是把映射器所在的包名中的.替换成/,后面拼接映射器的文件名.后缀名
-->
<mapper resource="com/test/day38/StudentMapper.xml" />
</mappers>
</configuration>
复制代码
<?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="com.test.day38.StudentMapper">
<!-- 定义插入的sql语句,通过命名空间+id方式被定位
insert标签表示内容是“插入”的SQL
id属性,当前这个insert标签唯一标识,这个值是惟一的(在当前的配置文件中)
parameterType,这个属性表示SQL语句从哪个封装类获取了SQL语句中的参数
#{id}表示从parameterType中对应的类对象中取id属性
-->
<insert id="insert" parameterType="com.test.day38.Student">
insert into student(id,name) values (#{id},#{name});
</insert>
</mapper>
复制代码
public class XmlMapperTest {
public static void main(String[] args) throws Exception{
//加载主配置文件,主配置文件中有数据库连接相关信息,还有映射器的相关信息
//参数是主配置文件的路径,我们的主配置文件是在跟路径下,所以直接写文件名就可以
Reader reader = Resources.getResourceAsReader("myBatis-config.xml");
//创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//得到SqlSession对象,这个对象是操作映射器的对象
SqlSession session = sqlSessionFactory.openSession();
Student stu = new Student();
stu.setId(37);
stu.setName("xml映射器");
/**
* session.insert来操作映射器的inset的SQL
* 参数1,定位映射器,映射器所在mapper的namespace和自己的id拼接。例如com.test.day38.StudentMapper.insert
* 参数2,是要传递到映射器的参数
*/
int res = session.insert("com.test.day38.StudentMapper.insert", stu);//映射器中的parameterType参数指定了stu的来源
System.out.println(res);
//提交session
session.commit();
//关闭资源和session
reader.close();
session.close();
}
}
复制代码
public class Student implements Serializable{//当你想把的内存中的对象保存到一个文件中或者数据库中时候,需要使用序列化
private static final long serialVersionUID = 1L;//变量serialVersionUID称为序列化版本号,多用于实现了Serializable的类中,试用场景是类的序列化
public Integer id;
public String name;
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;
}
}
复制代码
大致上分为五个文件:主配置文件、xml映射器、接口、实体类、调用程序
<?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>
<!-- 数据源环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 主配置文件引入映射器 -->
<mappers>
<!--
resource属性,代表当前的 mapper配置是引入的xml映射器
属性的值,就是把映射器所在的包名中的.替换成/,后面拼接映射器的文件名.后缀名
-->
<mapper resource="com/test/day38/StudentMapperIn.xml" />
</mappers>
</configuration>
复制代码
<?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">
<!--
接口与xml映射器混合使用
mapper标签的namespace属性值是接口的全名(包名.接口)
-->
<mapper namespace="com.test.day38.StudentIn">
<!--
insert标签代表要写的是插入的SQL
id属性,当前这个insert标签唯一标识,这个值是惟一的(在当前的配置文件中),在接口与xml映射器混合使用,标签的id值是与接口的方法名对应
parameterType,这个属性是传递到当前这个SQL中的参数的封装类的全名
-->
<insert id="insert" parameterType="com.test.day38.Student">
insert into student(id,name) values (#{id},#{name});
</insert>
</mapper>
复制代码
package com.test.day38;
public interface StudentIn {
/**
* 接口和映射器混合使用
* 方法名与xml映射器中的id值对应
* @param stu
* @return
*/
public int insert(Student stu);
}
复制代码
public class XmlAndInMapperTest {
public static void main(String[] args) {
Reader reader = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession session = null;
try{
//加载主配置文件,主配置文件中有数据库连接相关信息,还有映射器的相关信息
//参数是主配置文件的路径,我们的主配置文件是在跟路径下,所以直接写文件名就可以
reader = Resources.getResourceAsReader("myBatis-config.xml");
//创建SqlSessionFactory工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//得到SqlSession对象,这个对象是操作映射器的对象
session = sqlSessionFactory.openSession();
Student stu = new Student();
stu.setId(38);
stu.setName("接口与xml映射器混合");
//操作接口与xml混合映射器
/** 这里是不同点
* getMapper(接口的class).调用的方法
* 纯xml映射器这里是使用session.insert来操作映射器的inset的SQL
* 接口和映射器混合使用,使用接口代替session.insert。这样更有利于解耦
*/
int res = session.getMapper(StudentIn.class).insert(stu);
System.out.println(res);
//提交session
session.commit();
}catch(Exception e){
//如果发生异常回滚session
session.rollback();
}finally{
//关闭资源
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
session.close();
}
}
}
复制代码
package com.test.day38;
public class Student implements Serializable{//当你想把的内存中的对象保存到一个文件中或者数据库中时候,需要使用序列化
/**
* 之前的java se,序列化
* 一个类的对象,要进行网络传输或者存储,都是二进制的
* 在mybatis中,为什么实体类要实现序列化
* 我们在xml映射器中在做增删改的时候,使用的参数类型,很多时候使用的实体类对象parameterType="Student"
* 增删改实际上就是修改数据库,数据库存在我们的硬盘上,要把一个对象在硬盘上做修改
* 这个对象必须是实现了序列化的
*/
private static final long serialVersionUID = 1L;//变量serialVersionUID称为序列化版本号,多用于实现了Serializable的类中,试用场景是类的序列化
public Integer id;
public String name;
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;
}
}
复制代码
大致分为四个文件:主配置文件、带注解的接口、实体类、调用程序
<?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>
<!-- 数据源环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 主配置文件引入映射器 -->
<mappers>
<!-- 方式一
class属性,就引入的接口映射器,使用的是注解+接口映射器
值是接口包名.接口名
-->
<mapper class="com.test.day38.StudentIn2" />
<!-- 方式二
在使用注解+接口映射器的时候,可能有很多的接口
如果每个接口都要使用class="xxx"的方式引入就会写好多这样的配置
为了避免这种情况,可以直接配置包名,这样可以引入这个包下所有的带注解的接口
-->
<package name="com.test.day38" />
</mappers>
</configuration>
复制代码
package com.test.day38;
public interface StudentIn2 {
/**
* @Insert相对应xml映射器的insert标签
* @Insert("")里面的 字符串参数就是insert标签的SQL语句
* @param stu
* @return
*/
@Insert("insert into student(id,name) values (#{id},#{name});")
public int insert(Student stu);
}
复制代码
public class XmlAndInMapperTest {
public static void main(String[] args) {
Reader reader = null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession session = null;
try{
//加载主配置文件,主配置文件中有数据库连接相关信息,还有映射器的相关信息
//参数是主配置文件的路径,我们的主配置文件是在跟路径下,所以直接写文件名就可以
reader = Resources.getResourceAsReader("myBatis-config.xml");
//创建SqlSessionFactory工厂
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//得到SqlSession对象,这个对象是操作映射器的对象
session = sqlSessionFactory.openSession();
Student stu = new Student();
// stu.setId(39);
// stu.setName("接口与注解混合");
stu.setId(40);
stu.setName("测试通过包名引用接口映射器的方式");
//操作接口与xml混合映射器
/**
* getMapper(接口的class).调用的方法
* 这个地方调用的时候与操作接口与xml混合映射器一直
*/
int res = session.getMapper(StudentIn.class).insert(stu);
System.out.println(res);
//提交session
session.commit();
}catch(Exception e){
//如果发生异常回滚session
session.rollback();
}finally{
//关闭资源
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
session.close();
}
}
}
复制代码
package com.test.day38;
public class Student implements Serializable{//当你想把的内存中的对象保存到一个文件中或者数据库中时候,需要使用序列化
private static final long serialVersionUID = 1L;//变量serialVersionUID称为序列化版本号,多用于实现了Serializable的类中,试用场景是类的序列化
public Integer id;
public String name;
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;
}
}复制代码