1.ORM 、Mybatis
ORM:对象关系映射,这个通俗点讲其实就是数据库的表和实体类相互映射的关系。这个了解一下就行,不重要。
Mybatis: 基于java的持久层框架。
这边没有集成spring、springboot。直接用jar 写入门案例
这边使用到的jar是
mybatis的核心配置文件MyBatisConfig.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="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://192.666.99.125/product"/>
<property name="username" value="product"/>
<property name="password" value="zhangxin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="HeroMapper.xml"/>
</mappers>
</configuration>
实体类对象hero
package com.zx;
public class Hero {
private String name;
private String nickName;
public Hero() {
}
public Hero(String name, String nickName) {
this.name = name;
this.nickName = nickName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
return "Hero{" +
"name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
hero的mapper HeroMapper.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="HeroMapper">
<select id="selectAll" resultType="com.zx.Hero">
select * from Hero
</select>
</mapper>
最后就是执行程序,这边就是简单介绍一下怎么使用,后面会解释每个组件怎么用的。
package com.zx;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class HeroTest {
public static void main(String[] args) throws IOException {
//加载配置文件
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//通过工厂获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取mapper.xml里的查询语句
List<Hero> heros = sqlSession.selectList("HeroMapper.selectAll");
//遍历数据库
heros.forEach(c-> System.out.println(c.toString()));
//关闭资源
sqlSession.close();
is.close();
}
}
3. Mybatis的Api
3.1 Resource
这边用什么类加载器其实无所谓,知道这个原理就行,其实用java的启动类加载器也是可以的。
InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
//上面和下面其实效果是一样的,只不过Resources给我们封装好了
ClassLoader classLoader = HeroTest.class.getClassLoader();
InputStream resourceAsStream = classLoader.getResourceAsStream("MyBatisConfig.xml");
3.2 sqlSessionFactory
这边其实就根据配置文件建立了一个工厂,后面你要与数据库的链接,就问工厂要。
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
3.3 sqlsession
这个对象就可以理解为一个与数据库的链接。有了这个链接就可以愉快的增删改查了,sqlsession还可以管理事务,以及接口代理。
3.4 HeroMapper.xml详解、增删改
下面呢我会从增删改查的写法
3.4.1查询
带参数查询例子
<select id="selectById" resultType="com.zx.Hero" parameterType="java.lang.String">
select * from Hero where name = #{name}
</select>
//获取mapper.xml里的查询语句
Hero yauso = sqlSession.selectOne("HeroMapper.selectById", "亚索");
3.4.2 新增
这边的重点就是提交事务,其他都一样
<insert id="newHero" parameterType="com.zx.Hero">
INSERT into Hero VALUE (#{name},#{nickName})
</insert>
sqlSession.insert("HeroMapper.newHero",new Hero("劫","儿童劫"));
sqlSession.commit();
3.4.3 修改
//通过工厂获取sqlSession,这边我开启了自动提交事务的功能
SqlSession sqlSession = sqlSessionFactory.openSession(true);
sqlSession.update("HeroMapper.updateHero",new Hero("劫1","儿童劫"));
<update id="updateHero" parameterType="com.zx.Hero">
update Hero set name = #{name} where nickName=#{nickName}
</update>
3.4.4 删除
我这边开启了自动提交事务,如果你不是自动提交的话请手动commit
<delete id="deleteHero" parameterType="com.zx.Hero">
delete from Hero where name = #{name}
</delete>
sqlSession.delete("HeroMapper.deleteHero",new Hero("劫1",null));
3.5 核心配置文件详解
3.5.1 用配置文件管理数据库的链接信息
这个常规操作没什么可说的。
配置文件信息如下显示
3.6 起别名
起了别名之后,我们映射的xml可以这样配置,就可以不用写那么长的类了,简洁一点
这边mybatis给我们起好了一些别名,可以直接使用
3.7 集成Log4j配置文件
核心配置文件里面配置log4j的设置
log4j的配置文件
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.ConversionPattern=%5p [%t] - %m%n
3.Mybatis进阶
3.1 接口代理
符合mybatis的四个规则就可以使用接口代理功能
- 名称空间必须与Dao的全类名一致
- 配置文件的id 必须和接口方法名称一致
- 配置文件的parameterType 和 接口方法的入参一致
- 配置文件的resultType和接口方法的返回值一致
下面会用图演示一下
实现类的代码
package com.zx.Service.Impl;
import com.zx.Hero;
import com.zx.Mapper.HeroMapper;
import com.zx.Service.HeroService;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class HeroServiceImpl implements HeroService {
public List<Hero> selectAll(){
//加载配置文件
InputStream is = null;
SqlSessionFactory sqlSessionFactory = null;
//通过工厂获取sqlSession
SqlSession sqlSession = null;
//遍历数据库
List<Hero> heros = null;
try {
is = Resources.getResourceAsStream("MyBatisConfig.xml");
//获取sqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
sqlSession = sqlSessionFactory.openSession(true);
//这边是核心的部分,这边拿到HeroMapper的class
HeroMapper heroMapper = sqlSession.getMapper(HeroMapper.class);
heros = heroMapper.selectAll();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(sqlSession!=null){
//关闭资源
sqlSession.close();
}
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
heros.forEach(c-> System.out.println(c.toString()));
return heros;
};
}
源码解析一下 使用的是动态代理模式,这边感兴趣的同学可以深入了解一下