MyBatis小记
本文最后更新于:2021年10月11日 晚上
MyBatis小记
为什么要用Mybatis?
jdbc缺点:
缺点一:重复代码太多,这样会让开发效率降低。(比较繁琐,有一些代码是“没有必要的重复”)
缺点二:JDBC开发当中sql语句是编写在java程序当中的,sql语句不支持配置。sql语句
可能后期需要调优,sql语句被修改的概率还是很高的。在java程序中编写sql语句,后期修改
sql语句的时候,需要重新修改java源代码,源代码的修改会导致重新编译/重新部署等操作。
并且修改java源代码已经违背了开闭原则:OCP。
互联网分布式架构方面的项目,并发量很大,系统需要不断的优化,各方面优化,其中有一条
非常重要的优化就是sql优化。
一. 我的第一个Mybatis程序:
1.准备数据库
新建一个数据库:
create database mybatis;
新建一张表:
create table student(id varchar(30),name varchar(30),birth varchar(30));
插入数据:
insert into student(id,name,birth) values('1' , 'zhangsan' , '20211010');
insert into student(id,name,birth) values('2' , 'lisi' , '20211011');
insert into student(id,name,birth) values('3' , 'wangwu' , '20211012');
commit;
select * from student;
2.新建一个普通的java工程
因为mybatis框架封装了JDBC。写一个main方法即可测试。
新建工程
mybatis-project-laodu
在src同级目录下新建libs目录,把jar包引入到此目录
新建xml文件
- 新建
mybatis-config.xml
- 新建
sqlMapper.xml
- 新建
在src目录下新建com/codeanime/main文件夹
在src目录下新建com/codeanime/test文件夹
3.引入相关的jar包
mybatis-3.4.5.jar(mybatis核心jar)
mysql-connector-java-5.1.23-bin.jar(mysql数据库驱动jar)
4.从xml中构建SqlSessionFactory
4.1 编写main方法
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
注意:
什么是类路径?
bin是类的根路径, src可以等同看做类的根路径
修改main方法代码:
String resource = "mybatis-config.xml";
编辑mybatis-config.xml:核心配置文件主要配置连接数据库的信息,以及“sql语句配置文件”的路径。
<?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/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml" />
</mappers>
</configuration>
5.编写SqlMapper.xml
提供一个配置sql语句的配置文件,通常这种文件一般都叫做:sql映射文件(SqlMapper.xml)
在类的根路径下新建一个SqlMapper.xml文件,修改mybatis-config.xml配置:
<mappers>
<mapper resource="SqlMapper.xml" />
</mappers>
编辑SqlMapper.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">
<!-- 先不要管 namespace,随意编写一个。-->
<mapper namespace="1111111111">
<!-- 查询语句,查询所有的学生 -->
<!-- id具有唯一性,代表了这条sql语句,将来这个id是需要“拷贝”到java程序当中的。 -->
<!-- 思考:我们程序员需要告诉mybatis框架什么信息,mybatis才能自动创建对象,并且自动将查询的结果集放到java对象的对应属性上。 -->
<!-- 需要告诉mybatis,最终封装的java对象的类型。 -->
<!-- 需要告诉mybatis,最终查询出的结果集赋值到javabean的哪个属性上面,怎么告诉mybatis呢?
查询结果集的列名要和javabean的属性名对应上,不对应的时候使用as关键字起别名。-->
<select id="getAll" resultType="com.codeanime.mybatis.main.Student">
select
id as sid, name as sname , birth as sbirth
from
student
</select>
</mapper>
6.在main文件夹新建Student类作为javabean
package com.codeanime.mybatis.main;
public class Student {
/*
*注意:以下的属性名和数据库表当中的字段名不一致。
*/
private String sid;
private String sname;
private String sbirth;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSbirth() {
return sbirth;
}
public void setSbirth(String sbirth) {
this.sbirth = sbirth;
}
}
7.在test目录下新建MybatisTest01作为测试类
package com.codeanime.mybatis.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.codeanime.mybatis.main.Student;
public class MyBatisTest01 {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 事务自动提交机制关闭,等同于:conn.setAutoCommit(false);
// SqlSession对象等同看做Connection,专门用来执行sql语句的一个会话对象。
// 开启事务
sqlSession = sqlSessionFactory.openSession();
// do work(执行核心业务逻辑)
// 获取所有的学生,返回List集合,List集合中存储Student。
List<Student> studentList = sqlSession.selectList("getAll");
for(Student s : studentList){
System.out.println(s.getSid() + "," + s.getSname() + "," + s.getSbirth());
}
// 没有出现异常,则事务结束,提交
sqlSession.commit();
} catch (IOException e) {
// 遇到异常之后回滚
if (sqlSession != null){
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 关闭资源
if(sqlSession != null){
sqlSession.close();
}
}
}
}
运行test程序:
和数据库中一样:
二. 使用mybatis完成单张表的CRUD
CRUD:增删改查
2.1 优化用户体验
在类的根路径下,新建一个jdbc.properties文件。配置连接数据库的信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.user=root
jdbc.password=123456
然后在核心配置文件引入该资源文件。
<properties resource="jdbc.properties"/>
使用:
注意:${jdbc.driver}这个不是EL表达式,是mybatis中自定制的语法机制。
${属性文件中的key}
完整配置文件:
<?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="jdbc.properties"/>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="SqlMapper2.xml" />
</mappers>
</configuration>
编辑SqlMapper2配置文件:
<?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="111111111111111111111111">
<insert id="save" parameterType="com.codeanime.mybatis.main.Student">
insert into student
(id , name , birth)
values
(#{stuId} , #{stuName} , #{stuBirth})
</insert>
</mapper>
插入数据:
编写类MyBtisCRUD
:
package com.codeanime.mybatis.test;
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.codeanime.mybatis.main.Student;
/**
* 使用mybatis完成学生信息的增删改查(查一个/查所有)
*/
public class MyBatisCRUD {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
/*
* String resource = "mybatis-config.xml"; InputStream inputStream =
* Resources.getResourceAsStream(resource); SqlSessionFactory
* factory = new SqlSessionFactoryBuilder().build(inputStream);
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 开启事务
sqlSession = factory.openSession();
// do work
// insert
Student stu = new Student();
stu.setStuId("123");
stu.setStuName("zhangsan2");
stu.setStuBirth("20211011");
int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
System.out.println(count);
// 提交事务
sqlSession.commit();
} catch (Exception e) {
// 回滚事务
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 释放资源
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
运行结果:
运行成功返回影响行号
查看数据表:
数据表多了一条数据.表示插入成功
修改数据:
在类MyBtisCRUD中添加代码
// update
Student stu = new Student();
stu.setStuId("123");
stu.setStuName("zhangsan3");
stu.setStuBirth("20211012");
int count = sqlSession.update("update", stu);
System.out.println(count);
MyBatis完整的代码:
package com.codeanime.mybatis.test;
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.codeanime.mybatis.main.Student;
/**
* 使用mybatis完成学生信息的增删改查(查一个/查所有)
*/
public class MyBatisCRUD {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
/*
* String resource = "mybatis-config.xml"; InputStream inputStream =
* Resources.getResourceAsStream(resource); SqlSessionFactory
* factory = new SqlSessionFactoryBuilder().build(inputStream);
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 开启事务
sqlSession = factory.openSession();
// do work
// insert
//Student stu = new Student();
//stu.setStuId("123");
//stu.setStuName("zhangsan2");
//stu.setStuBirth("20211011");
//int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
//System.out.println(count);
// update
Student stu = new Student();
stu.setStuId("123");
stu.setStuName("zhangsan3");
stu.setStuBirth("20211012");
int count = sqlSession.update("update", stu);
System.out.println(count);
// 提交事务
sqlSession.commit();
} catch (Exception e) {
// 回滚事务
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 释放资源
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
SqlMapper2.xml
中添加代码:
<update id="update" parameterType="Student" >
update student set
name = #{stuName} , birth = #{stuBirth}
where
id = #{stuId}
</update>
SqlMapper2.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="111111111111111111111111">
<insert id="save" parameterType="com.codeanime.mybatis.main.Student">
insert into student
(id , name , birth)
values
(#{stuId} , #{stuName} , #{stuBirth})
</insert>
<update id="update" parameterType="com.codeanime.mybatis.main.Student" >
update student set
name = #{stuName} , birth = #{stuBirth}
where
id = #{stuId}
</update>
</mapper>
运行代码:
查看数据库:
发现数据库数据已经改变.表示修改成功
查询一条数据:
在MyBtisCRUD类中填加代码:
Student stu = sqlSession.selectOne("getById", "123");
System.out.println(stu.getStuId());
System.out.println(stu.getStuName());
System.out.println(stu.getStuBirth());
完整代码:
package com.codeanime.mybatis.test;
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.codeanime.mybatis.main.Student;
/**
* 使用mybatis完成学生信息的增删改查(查一个/查所有)
*/
public class MyBatisCRUD {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
/*
* String resource = "mybatis-config.xml"; InputStream inputStream =
* Resources.getResourceAsStream(resource); SqlSessionFactory
* factory = new SqlSessionFactoryBuilder().build(inputStream);
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 开启事务
sqlSession = factory.openSession();
// do work
// insert
//Student stu = new Student();
//stu.setStuId("123");
//stu.setStuName("zhangsan2");
//stu.setStuBirth("20211011");
//int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
//System.out.println(count);
// update
/*
Student stu = new Student();
stu.setStuId("123");
stu.setStuName("zhangsan3");
stu.setStuBirth("20211012");
int count = sqlSession.update("update", stu);
System.out.println(count);
*/
// selectOne
Student stu = sqlSession.selectOne("getById", "123");
System.out.println(stu.getStuId());
System.out.println(stu.getStuName());
System.out.println(stu.getStuBirth());
// 提交事务
sqlSession.commit();
} catch (Exception e) {
// 回滚事务
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 释放资源
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
在SqlMapper2.xml
添加代码:
<!-- parameterType是参数类型,专门负责给sql语句传值 但是可以省略不写 -->
<!-- resultType是查询结果集的类型,只有在select语句中才会有 -->
<!--
parameterType = "简单类型",则parameter可以省略
resultType = "简单类型",不能省略.
什么是简单类型:17个
byte short int long float double boolean char
Byte Short Integer Long Float Double Boolean Character String
-->
<select id="getById" parameterType="java.lang.String" resultType="com.codeanime.mybatis.main.Student">
select
id as stuId, name as stuName, birth as stuBirth<!-- 列名和javabean的属性名必须一致,不一致,使用别名
,因为Student类的属性名和数据库中student表的属性名不一致-->
from
student
where
id = #{11111111111}
<!-- 当一个sql语句的占位符只有一个,这个时候#{这里的内容随意编写} -->
</select>
运行代码:
对比数据库:
查询所有:
在MyBtisCRUD类中填加代码:
List<Student> stuList = sqlSession.selectList("getAll");
for(Student s : stuList){
System.out.println(s.getStuId());
}
在SqlMapper2.xml
添加代码:
<select id="getAll" resultType="com.codeanime.mybatis.main.Student">
select
id as stuId, name as stuName, birth as stuBirth
from
student
</select>
运行代码:
对比数据库:
删除数据:
在MyBtisCRUD类中填加代码:
int count = sqlSession.delete("deleteById", "123");
System.out.println(count);
在SqlMapper2.xml
添加代码:
<delete id="deleteById">
delete from student where id = #{22222222222}
</delete>
运行代码:
对比数据库:
发现数据库中id为123的数据被删除.
附上完整代码:
MyBtisCRUD
package com.codeanime.mybatis.test;
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.codeanime.mybatis.main.Student;
import java.util.List;
/**
* 使用mybatis完成学生信息的增删改查(查一个/查所有)
*/
public class MyBatisCRUD {
public static void main(String[] args) {
SqlSession sqlSession = null;
try {
/*
* String resource = "mybatis-config.xml"; InputStream inputStream =
* Resources.getResourceAsStream(resource); SqlSessionFactory
* factory = new SqlSessionFactoryBuilder().build(inputStream);
*/
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 开启事务
sqlSession = factory.openSession();
// do work
// insert
//Student stu = new Student();
//stu.setStuId("123");
//stu.setStuName("zhangsan2");
//stu.setStuBirth("20211011");
//int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
//System.out.println(count);
// update
/*
Student stu = new Student();
stu.setStuId("123");
stu.setStuName("zhangsan3");
stu.setStuBirth("20211012");
int count = sqlSession.update("update", stu);
System.out.println(count);
*/
// selectOne
//Student stu = sqlSession.selectOne("getById", "123");
//System.out.println(stu.getStuId());
//System.out.println(stu.getStuName());
//System.out.println(stu.getStuBirth());
// selectList
//List<Student> stuList = sqlSession.selectList("getAll");
//for(Student s : stuList){
// System.out.println(s.getStuId());
//}
// delete
int count = sqlSession.delete("deleteById", "123");
System.out.println(count);
// 提交事务
sqlSession.commit();
} catch (Exception e) {
// 回滚事务
if (sqlSession != null) {
sqlSession.rollback();
}
e.printStackTrace();
} finally {
// 释放资源
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
Student类:
package com.codeanime.mybatis.main;
public class Student {
private String stuId;
private String stuName;
private String stuBirth;
public String getStuId() {
return stuId;
}
public void setStuId(String stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuBirth() {
return stuBirth;
}
public void setStuBirth(String stuBirth) {
this.stuBirth = stuBirth;
}
}
mybatis-config.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>
<!-- 引入外部独立的资源文件 -->
<properties resource="jdbc.properties"/>
<!-- mybatis的别名机制 -->
<!--
<typeAliases>
<typeAlias type="com.codeanime.mybatis.main.Student" alias="Student"/>
</typeAliases>
-->
<typeAliases>
<!-- 使用package方式,那么该package包下的所有javabean会自动使用简类名作为别名。 -->
<package name="com.codeanime.mybatis.main"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="SqlMapper2.xml" />
</mappers>
</configuration>
SqlMapper2.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="111111111111111111111111">
<insert id="save" parameterType="com.codeanime.mybatis.main.Student">
insert into student
(id , name , birth)
values
(#{stuId} , #{stuName} , #{stuBirth})
</insert>
<update id="update" parameterType="com.codeanime.mybatis.main.Student" >
update student set
name = #{stuName} , birth = #{stuBirth}
where
id = #{stuId}
</update>
<!-- parameterType是参数类型,专门负责给sql语句传值 但是可以省略不写 -->
<!-- resultType是查询结果集的类型,只有在select语句中才会有 -->
<!--
parameterType = "简单类型",则parameter可以省略
resultType = "简单类型",不能省略.
什么是简单类型:17个
byte short int long float double boolean char
Byte Short Integer Long Float Double Boolean Character String
-->
<select id="getById" parameterType="java.lang.String" resultType="com.codeanime.mybatis.main.Student">
select
id as stuId, name as stuName, birth as stuBirth<!-- 列名和javabean的属性名必须一致,不一致,使用别名
,因为Student类的属性名和数据库中student表的属性名不一致-->
from
student
where
id = #{11111111111}
<!-- 当一个sql语句的占位符只有一个,这个时候#{这里的内容随意编写} -->
</select>
<select id="getAll" resultType="com.codeanime.mybatis.main.Student">
select
id as stuId, name as stuName, birth as stuBirth
from
student
</select>
<delete id="deleteById">
delete from student where id = #{22222222222}
</delete>
</mapper>
三. 别名机制
在**mybatis-config.xml
**里添加:
<!-- mybatis的别名机制 -->
<!--
<typeAliases>
<typeAlias type="com.codeanime.mybatis.main.Student" alias="Student"/>
</typeAliases>
-->
<typeAliases>
<!-- 使用package方式,那么该package包下的所有javabean会自动使用简类名作为别名。 -->
<package name="com.codeanime.mybatis.main"/>
</typeAliases>
然后**SqlMapper2.xml
**中所有的parameterType可以写成包中的类名(默认)
<?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="111111111111111111111111">
<insert id="save" parameterType="Student">
insert into student
(id , name , birth)
values
(#{stuId} , #{stuName} , #{stuBirth})
</insert>
<update id="update" parameterType="Student" >
update student set
name = #{stuName} , birth = #{stuBirth}
where
id = #{stuId}
</update>
<!-- parameterType是参数类型,专门负责给sql语句传值 但是可以省略不写 -->
<!-- resultType是查询结果集的类型,只有在select语句中才会有 -->
<!--
parameterType = "简单类型",则parameter可以省略
resultType = "简单类型",不能省略.
什么是简单类型:17个
byte short int long float double boolean char
Byte Short Integer Long Float Double Boolean Character String
-->
<select id="getById" parameterType="java.lang.String" resultType="Student">
select
id as stuId, name as stuName, birth as stuBirth<!-- 列名和javabean的属性名必须一致,不一致,使用别名
,因为Student类的属性名和数据库中student表的属性名不一致-->
from
student
where
id = #{11111111111}
<!-- 当一个sql语句的占位符只有一个,这个时候#{这里的内容随意编写} -->
</select>
<select id="getAll" resultType="Student">
select
id as stuId, name as stuName, birth as stuBirth
from
student
</select>
<delete id="deleteById">
delete from student where id = #{22222222222}
</delete>
</mapper>
四.使用maven模块创建mybatis项目
创建student表(id,name,email,age)
-- 创建student表 create table student( id int(11) not null primary key, name varchar(50) default null, email varchar(50) default null, age int(11) default null ); -- 插入一条数据 insert into student (id,name,email,age) values(1001,"zhangsan","zhangsan@163.com",11);
新建一个空项目
新建maven模块
创建完成之后是这样子的:
然后, 在main目录下新建文件夹resources, 删除默认创建的App类和App测试类AppTest
处理之后结构是这样的:
整理pom.xml
文件:
整理后的文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--坐标-->
<groupId>com.codeanime</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--依赖列表-->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
</build>
</project>
修改pom.xml文件
(1)加入mybatis依赖, mysql驱动,junit
<!--依赖列表--> <dependencies> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- mybatis依赖 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!-- mysql驱动 --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> </dependencies>
(2)在
中加入资源插件 <build> <!--资源插件 处理src/main/java目录下的xml--> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> <plugins> <!-- 指定jdk版本的插件,可加可不加,因为在上面已经指定过jdk的版本 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
完整pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--坐标--> <groupId>com.codeanime</groupId> <artifactId>project01</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <!--依赖列表--> <dependencies> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- mybatis依赖 --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!-- mysql驱动 --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> </dependencies> <build> <!--资源插件 处理src/main/java目录下的xml--> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> <plugins> <!-- 指定jdk版本的插件,可加可不加,因为在上面已经指定过jdk的版本 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
出国年间实体类Student, 定义属性,属性名和列名保持一致
package com.codeanime.domain; public class Student { private Integer id; private String name; private String email; private Integer age; 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 getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "学生实体信息{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
创建Dao接口, 定义操作数据库方法
package com.codeanime.dao; import com.codeanime.domain.Student; public interface StudentDao { //查询一个学生 Student selectStudentById(Integer id); }
创建xml文件(mapper文件),写sql语句
mybatis框架是把sql语句和java代码分开
mapper文件:定义和dao接口在同一目录,一个表一个mapper文件
<?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.codeanime.dao.StudentDao">
<!-- <select id="selectBlog" resultType="Blog">-->
<!-- select * from Blog where id = #{id}-->
<!-- </select>-->
<!--查询一个学生Student
<select>: 表示查询操作,里面是select语句
id: 要执行的sql语句的唯一标识,是一个自定义的字符串
推荐使用dao接口中的方法名称
resultType: 告诉mybatis,执行sql语句,把数据赋值给那个类型的java对象
resultType的值现在使用的是java对象的全限定名称
-->
<select id="selectStudentById" resultType="com.codeanime.domain.Student">
select id,name,email,age from student where id=1001
</select>
</mapper>
<!--
1.约束文件
http://mybatis.org/dtd/mybatis-3-mapper.dtd
约束文件的作用:
定义和限制当前文件中可以出现的标签和属性,以及标签出现的顺序
2.mapper是根标签
namespace: 命名空间,必须有值,不能为空,唯一值.
推荐使用Dao接口的全限定名称.
作用: 参与识别sql语句的作用.
3.在mapper里面可以写<insert>,<update>,<delete>,<select>
<insert>里面是insert语句,表示执行的insert操作
...
-->
创建mybatis的主配置文件(xml文件):有一个, 放在resources目录下
(1)定义创建连接实例的数据源(DataSource)对象
(2)指定其他mapper文件的位置
<?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"/> <!--配置数据源: 创建Connection对象--> <dataSource type="POOLED"> <!--driver:驱动的内容--> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- <property name="driver" value="${driver}"/>--> <!--连接数据库url--> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8"/> <!-- <property name="url" value="${url}"/>--> <!--用户名--> <property name="username" value="root"/> <!-- <property name="username" value="${username}"/>--> <!--密码--> <property name="password" value="123456"/> <!-- <property name="password" value="${password}"/>--> </dataSource> </environment> </environments> <!--指定其他mapper文件的位置: 指定其他的mapper文件目的是找到其他文件的sql语句 --> <mappers> <!--使用mapper的resource属性指定mapper文件的路径 这个路径是从target/classed路径开启的 使用注意: resource="mapper文件的路径,只用 / 分割路径" 一个mapper resource指定一个mapper文件 --> <mapper resource="com/codeanime/dao/StudentDao.xml"/> </mappers> </configuration>
创建测试的内容
使用main方法,测试mybatis访问数据库
也可以使用junit访问数据库
创建MyTest类测试:
package com.codeanime;
import com.codeanime.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyTest {
//测试mybatis执行sql语句
@Test
public void testSelectStudentById() throws IOException {
//调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
//mybatis核心类:SqlSessionFactory
//1.定义mybatis主配置文件的位置,从类路径开始相对路径
String config = "mybatis.xml";
//2.读取主配置文件,使用mybatis框架中的Resources类
InputStream inputStream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象
SqlSession session = factory.openSession();
//5.指定要执行的sql语句的id
// sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
//6.通过SqlSession的方法,执行sql语句
Student student = session.selectOne(sqlId);
System.out.println("使用mybatis查询一个学生:"+student);
//7.关闭SqlSession对象
session.close();
}
}
运行测试程序:
五.mybatis概念
1.占位符
用一个占位符替换这个id
修改:
#{studentId}:占位符,表示从java程序中传入过来的数据
<select id="selectStudentById" resultType="com.codeanime.domain.Student">
select id,name,email,age from student where id = #{studentId}
</select>
在测试类里面添加一个方法2:
@Test
public void testSelectStudentById2() throws IOException {
//调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
//mybatis核心类:SqlSessionFactory
//1.定义mybatis主配置文件的位置,从类路径开始相对路径
String config = "mybatis.xml";
//2.读取主配置文件,使用mybatis框架中的Resources类
InputStream inputStream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象
SqlSession session = factory.openSession();
//5.指定要执行的sql语句的id
// sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
//6.通过SqlSession的方法,执行sql语句
Student student = session.selectOne(sqlId,1001);//<--------------修改,传入id的值为1001
System.out.println("使用mybatis查询一个学生:"+student);
//7.关闭SqlSession对象
session.close();
运行测试方法2:
2.日志
在配置文件mybatis.xml中添加日志配置:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
再运行测试方法2:
3.事务
(1)自动提交:当你的sql语句执行完毕后,提交事务,数据库更新操作直接保存数据
(2)
3.1 在接口StudentDao中添加代码实现插入操作
接口中每一个方法对应一条sql语句
//添加一个学生(返回值int表示本次操作影响的数据库行数)
int insertStudent(Student student);
3.2 在mapper(StudentDao.xml)配置中添加代码
<!-- 添加insert -->
<insert id="insertStudent">
insert into student values(1002,"lisi","lisi@163.com",18)
</insert>
3.3 在MyTest类中添加测试方法insertStudent
因为绝大多数代码都是重复的,所以可以直接复制上一个测试方法
@Test
public void testInsertStudent() throws IOException {
String config = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();
String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent";
int rows = session.insert(sqlId);
System.out.println("使用mybatis添加一个学生,rows = "+rows);
session.close();
}
执行测试方法:
测试方法执行成功,而且影响行数为:1
问题来了:
当检查数据库到底插入进去了没有时,
发现没有,那么问题出在哪里,我们仔细观察刚才的日志,发现自动提交事务关闭了!
解决:
在测试方法中添加提交事务代码:
//mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
session.commit();
再次执行代码,并检查数据库:
成功!
insert语句使用占位符:
在测试分类MyTest中添加测试方法testInsertStudent2
@Test
public void testInsertStudent2() throws IOException {
String config = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象
SqlSession session = factory.openSession();
//5.指定要执行的sql语句的id
// sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent2";
Student student = new Student();
student.setId(1003);
student.setName("wangwu");
student.setEmail("wangwu@163.com");
student.setAge(19);
System.out.println("使用mybatis插入一个学生:"+student);
int rows = session.insert(sqlId,student);
//mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
session.commit();
//7.关闭SqlSession对象
session.close();
}
在mapper配置文件(StudentDao.xml)中添加一条insert语句
<!-- insert占位符
如果传入给mybatis是一个java对象,使用#{属性名} 获取属性的值
属性值放到 #{}占位符的位置,mybatis执行此属性对应的getxxx()
例如,#{id},执行getId();
-->
<insert id="insertStudent2">
insert into student values(#{id},#{name},#{email},#{age})
</insert>
执行测试方法testInsertStudent2:
对比一下数据库:
六.mybatis重要对象
Resources
mybatis框架中的对象,作用就是:读取主配置信息
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuild
负责创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory
重要对象!!!!!
创建此对象需要更多的资源和时间.
在项目中有一个就可以了.
SqlSessionFactory是一个接口:作用是SqlSession的工厂,就是创建SqlSession对象.
DefaultSqlSessionFactory实现类
public class DefaultSqlSessionFactory implements SqlSessionFactory {}
SqlSessionFactory接口中的方法:
openSession():获取以恶搞默认的SqlSession对象,默认是手动提交事务的.
openSession(boolean): boolean参数表示是否提交事务
true: 创建一个自动提交事务的SqlSession false: 等同于没有参数的openSession
自动提交事务,例如:
@Test public void testInsertStudent2() throws IOException { String config = "mybatis.xml"; InputStream inputStream = Resources.getResourceAsStream(config); //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); //4.获取SqlSession对象 SqlSession session = factory.openSession(true); //5.指定要执行的sql语句的id // sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值 String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent2"; Student student = new Student(); student.setId(1004); student.setName("zhaoliu"); student.setEmail("zhaoliu@163.com"); student.setAge(20); System.out.println("使用mybatis插入一个学生:"+student); int rows = session.insert(sqlId,student); //mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务 //session.commit(); //7.关闭SqlSession对象 session.close(); }
SqlSession对象
SqlSession是通过SqlSessionFactory获取的,SqlSession本事就是接口
DefaultSqlSession实现类
public class DefaultSqlSession implements SqlSession {}
SqlSession作用就是提供了大量的执行sql语句的方法
SelectOne:执行sql语句,最多得到一行记录,多余1行是错误 SelectList:执行sql语句,可以返回多行数据 SelectMap:执行sql语句,得到一个Map Insert:执行insert语句 update:执行update语句 delete:执行delete语句 commit:提交事务 rollback:回滚事务
注意:
SqlSession对象不是线程安全的,使用的步骤:
①:在方法的内部,执行sql语句之前,先获取SqlSession对象
②:调用SqlSession的方法,执行sql语句
③:关闭SqlSession对象,执行SqlSession.close()
七.属性配置文件
在resources目录下新建
jdbc.properties
文件内容:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8" jdbc.username=root jdbc.password=123456
修改mybatis配置文件
mybatis.xml
<configuration> <!-- 外部的属性配置文件 resource:指定类路径下的某个属性配置文件 因为:resources目录下的文件最中编译到target/classes根目录下的 classes是类目录的根 resource="jdbc.properties"指定的是classes目录下的某个文件 --> <properties resource="jdbc.properties" /> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!--配置数据源: 创建Connection对象--> <dataSource type="POOLED"> <!--driver:驱动的内容--> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/>--> <property name="driver" value="${jdbc.driver}"/> <!--连接数据库url--> <!-- <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8"/>--> <property name="url" value="${jdbc.url}"/> <!--用户名--> <!-- <property name="username" value="root"/>--> <property name="username" value="${jdbc.username}"/> <!--密码--> <!-- <property name="password" value="123456"/>--> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--指定其他mapper文件的位置: 指定其他的mapper文件目的是找到其他文件的sql语句 --> </configuration>
运行代码测试无误即可.
八.完整的代码文件
结构:
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--坐标-->
<groupId>com.codeanime</groupId>
<artifactId>project01</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--依赖列表-->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- mybatis依赖 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!-- mysql驱动 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<build>
<!--资源插件 处理src/main/java目录下的xml-->
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<!-- 指定jdk版本的插件,可加可不加,因为在上面已经指定过jdk的版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
mybatis.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>
<!-- 外部的属性配置文件
resource:指定类路径下的某个属性配置文件
因为:resources目录下的文件最中编译到target/classes根目录下的
classes是类目录的根
resource="jdbc.properties"指定的是classes目录下的某个文件
-->
<properties resource="jdbc.properties" />
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--配置数据源: 创建Connection对象-->
<dataSource type="POOLED">
<!--driver:驱动的内容-->
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<property name="driver" value="${jdbc.driver}"/>
<!--连接数据库url-->
<!-- <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8"/>-->
<property name="url" value="${jdbc.url}"/>
<!--用户名-->
<!-- <property name="username" value="root"/>-->
<property name="username" value="${jdbc.username}"/>
<!--密码-->
<!-- <property name="password" value="123456"/>-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--指定其他mapper文件的位置:
指定其他的mapper文件目的是找到其他文件的sql语句
-->
<mappers>
<!--使用mapper的resource属性指定mapper文件的路径
这个路径是从target/classed路径开启的
使用注意:
resource="mapper文件的路径,只用 / 分割路径"
一个mapper resource指定一个mapper文件
-->
<mapper resource="com/codeanime/dao/StudentDao.xml"/>
</mappers>
</configuration>
StudentDao.xml(mapper)
:
<?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.codeanime.dao.StudentDao">
<!-- <select id="selectBlog" resultType="Blog">-->
<!-- select * from Blog where id = #{id}-->
<!-- </select>-->
<!--查询一个学生Student
<select>: 表示查询操作,里面是select语句
id: 要执行的sql语句的唯一标识,是一个自定义的字符串
推荐使用dao接口中的方法名称
resultType: 告诉mybatis,执行sql语句,把数据赋值给那个类型的java对象
resultType的值现在使用的是java对象的全限定名称
#{studentId}:占位符,表示从java程序中传入过来的数据
-->
<select id="selectStudentById" resultType="com.codeanime.domain.Student">
select id,name,email,age from student where id = #{studentId}
</select>
<!-- 添加insert -->
<insert id="insertStudent">
insert into student values(1002,"lisi","lisi@163.com",18)
</insert>
<!-- insert占位符
如果传入给mybatis是一个java对象,使用#{属性名} 获取属性的值
属性值放到 #{}占位符的位置,mybatis执行此属性对应的getxxx()
例如,#{id},执行getId();
-->
<insert id="insertStudent2">
insert into student values(#{id},#{name},#{email},#{age})
</insert>
</mapper>
<!--
1.约束文件
http://mybatis.org/dtd/mybatis-3-mapper.dtd
约束文件的作用:
定义和限制当前文件中可以出现的标签和属性,以及标签出现的顺序
2.mapper是根标签
namespace: 命名空间,必须有值,不能为空,唯一值.
推荐使用Dao接口的全限定名称.
作用: 参与识别sql语句的作用.
3.在mapper里面可以写<insert>,<update>,<delete>,<select>
<insert>里面是insert语句,表示执行的insert操作
...
-->
jdbc.properties
:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8"
jdbc.username=root
jdbc.password=123456
StudentDao接口:
package com.codeanime.dao;
import com.codeanime.domain.Student;
public interface StudentDao {
//查询一个学生
Student selectStudentById(Integer id);
//添加一个学生(返回值int表示本次操作影响的数据库行数)
int insertStudent(Student student);
}
Student类:
package com.codeanime.domain;
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "学生实体信息{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
MyTest测试类:
package com.codeanime;
import com.codeanime.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MyTest {
//测试mybatis执行sql语句
@Test
public void testSelectStudentById() throws IOException {
//调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
//mybatis核心类:SqlSessionFactory
//1.定义mybatis主配置文件的位置,从类路径开始相对路径
String config = "mybatis.xml";
//2.读取主配置文件,使用mybatis框架中的Resources类
InputStream inputStream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象
SqlSession session = factory.openSession();
//5.指定要执行的sql语句的id
// sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
//6.通过SqlSession的方法,执行sql语句
Student student = session.selectOne(sqlId);
System.out.println("使用mybatis查询一个学生:"+student);
//7.关闭SqlSession对象
session.close();
}
@Test
public void testSelectStudentById2() throws IOException {
//调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
//mybatis核心类:SqlSessionFactory
//1.定义mybatis主配置文件的位置,从类路径开始相对路径
String config = "mybatis.xml";
//2.读取主配置文件,使用mybatis框架中的Resources类
InputStream inputStream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象
SqlSession session = factory.openSession();
//5.指定要执行的sql语句的id
// sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
//6.通过SqlSession的方法,执行sql语句
Student student = session.selectOne(sqlId,1001);
System.out.println("使用mybatis查询一个学生:"+student);
//7.关闭SqlSession对象
session.close();
}
@Test
public void testInsertStudent() throws IOException {
String config = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = factory.openSession();
String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent";
int rows = session.insert(sqlId);
System.out.println("使用mybatis添加一个学生,rows = "+rows);
//mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
session.commit();
session.close();
}
@Test
public void testInsertStudent2() throws IOException {
String config = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//4.获取SqlSession对象
SqlSession session = factory.openSession();
//5.指定要执行的sql语句的id
// sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent2";
Student student = new Student();
student.setId(1003);
student.setName("wangwu");
student.setEmail("wangwu@163.com");
student.setAge(19);
System.out.println("使用mybatis插入一个学生:"+student);
int rows = session.insert(sqlId,student);
//mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
session.commit();
//7.关闭SqlSession对象
session.close();
}
}
本文作者: CodeAnime
本文链接: https://codeanime.cc/MyBatis%E5%B0%8F%E8%AE%B0.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!