使用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; } }复制代码