三层架构包含的三层:
三层的处理请求的交互:
用户—> 界面层—>业务逻辑层—>数据访问层—>DB 数据库
在pom.xml加入 :
<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.0modelVersion>
<groupId>com.bjpowernodegroupId>
<artifactId>ch01-first-mybatisartifactId>
<version>1.0-SNAPSHOTversion>
<name>ch01-first-mybatisname>
<url>http://www.example.comurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.9version>
dependency>
dependencies>
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
project>
ProvinceDao接口:
public interface ProvinceDao {
//定义对数据库的操作方法
//查询数据库的所有数据
List<Province> selectProvinces();
//添加数据
//返回值是表示对数据库影响的行数
public int insertProvince(Province province);
//更新
//返回值是表示对数据库影响的行数
public int updateProvince(Province province);
//删除
//返回值是表示对数据库影响的行数
public int deleteProvinceById(Integer id);
}
注意:
ProvinceDao.xml:
mapper文件中的约束文件:mybatis-3-mapper.dtd,扩展名为 .dtd
约束文件作用:
mapper是根元素
属性:namespace
:表示命名空间,目的是给当前文件中的各个sql起一个唯一标识值。
namespace的值是自定义的, 可以a,b,c。推荐使用dao接口的全限定名称
<mapper namespace="com.bjpowernode.dao.ProvinceDao">
mapper内部写sql语句,不同的sql语句使用不同的标签
查询:
select标签是表示执行select操作。
语法:
属性:
id
:sql语句的唯一标识,可以自定义,推荐使用接口中的方法名称。当执行sql语句时,mybatis使用 namespace + id的值唯一标识一条sql语句
resultType
:表示sql语句执行后,转为java对象的类型。
推荐使用类型的全限定名称(包名加类名)
mybatis的操作是执行sql语句,使用PreparedStatement.
把查询的结果转为resultType指定的类,创建这个类的java对象,并把列的值赋值给同名的属性。
<select id="selectProvinces" resultType="com.bjpowernode.domain.Province">
select * from province;
select>
添加:
mybatis使用占位符,获取传入到xml文件中的数据
#{java对象的属性名}
: 表示获取这个属性的值,放到sql语句中。等同于PreparedStatment对象的 ?
<insert id="insertProvince">
insert into student values(#{id},#{name},#{email},#{age})
insert>
<update id="updateProvince">
update student set age=#{age} where id=#{id}
update>
删除:
当你的dao中,方法的参数是一个简单类型的数据时,在mapper文件中,使用这个参数值语法是 #{任意变量名}
简单类型:java的基本数据类型
和String
<delete id="deleteProvinceById">
delete from student where id=#{studentId}
delete>
mapper>
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
settings>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/bjpowernode/dao/ProvinceDao.xml"/>
mappers>
configuration>
public class Test {
public static void main(String[] args) {
//使用mybatis提供的方法操作数据库
//1.指定mybatis主配置文件的位置, 放在resources目录下
String config = "mybatis.xml";
//2.读取主配置文件的内容
InputStream in = null;
try {
in = Resources.getResourceAsStream(config);
} catch (IOException e) {
e.printStackTrace();
}
//3.创建mybatis中的对象 SqlSessionFactory
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//4.获取SqlSession对象,使用SqlSession执行sql语句。
SqlSession sqlSession = factory.openSession();
//5.执行sql语句, 使用sql语句的唯一标识
//namesapce + 每个sql语句自己的id
String sqlid = "com.bjpowernode.dao.ProvinceDao.selectProvinces";
List<Province> provinces = sqlSession.selectList(sqlid);
//6.显示查询结果
//students.forEach( stu -> System.out.println(stu));
System.out.println(provinces);
//7.关闭资源
sqlSession.close();
}
}
对于上面的步骤,main方法中的步骤大部分是固定的,可以将他们封装成一个工具类,减少代码量
public class MyBatisUtil {
//定义一个全局的 SqlSessionFactory对象
private static SqlSessionFactory factory;
static {
String config="mybatis.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//定义方法获取SqlSession对象
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if( factory != null){
sqlSession = factory.openSession();
}
return sqlSession;
}
}
public class MyTest {
//测试update
@Test
public void testUpdateProvince() throws IOException {
//1.通过工具类获取sqlSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.执行sql语句, 使用sql语句的唯一标识
// namesapce + 每个sql语句自己的id
String id="updateProvince";
String sqlid="com.bjpowernode.dao.ProvinceDao." + id;
Province province= new Province();
province.setId(1003);
province.setAge(26);
int rows = sqlSession.update(sqlid,province);
System.out.println("updateStudent 返回的rows:"+rows);
//3.提交事务, mybatis默认的操作是不自动提交事务。需要手工执行
sqlSession.commit();
//4.关闭资源
sqlSession.close();
}
使用动态代理MyBatis开发步骤与之前的开发步骤基本一致,唯一的不同是在最后一步的测试中,调用SqlSession
的实例方法getMapper()
创建动态代理类对象:
接口类型的对象 = sqlSession.getMapper(接口的.class);
然后再调用接口对象的方法,就相当于执行了mapper文件中的 id对应的sql语句
public class MyTest {
@Test
public void testSelectStudents(){
//使用mybatis的动态代理技术
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//根据接口获取他的对象
ProvinceDao dao = sqlSession.getMapper(ProvinceDao.class);
//调用dao的方法
List<Province> provinces = dao.selectProvinces();
provinces.forEach( stu-> System.out.println(stu));
}
}