快速入门mybatis
什么是mybatis?
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
一、快速入门mybatis
- 创建java工程
- 添加mybatis与mysql数据库驱动包。
- 在mysql数据库下创建数据库表。
- 在entity包下创建数据库表对应的实体类。
- 在mapper包下创建实体类对应的xml映射文件。
- 在类路径下创建mybatis的xml核心配置文件,注意引入映射文件。
- 使用mybatis的核心api对象加载配置文件。
———————————————————————————
二、注意
1.需要命名的地方,绝对不允许单个单词;
2.类的成员变量不建议long,不允许基本类型;
3.表字段名不允许u_name,成员变量名不允许uName;成员变量名不允许is开头;
4.表中类型datetime,date,timestamp,实体类的成员变量类型,建议使用String;
5.23种gof设计模式
———————————————————————————
三、mybatis的核心对象与方法(核心API):
1.SqlSessionFactoryBuilder:构建者模式应用,
有build方法,用来构建复杂的单例的SqlSessionFactory对象
生命周期:用完即销毁.
2.SqlSessionFactory:工厂模式应用,
与构建者的区别在于工厂生产N个对象.实现类:DefaultSqlSessionFactory,该对象中持有的DataSource
生命周期:全局唯一.放在web项目下理解,tomcat启动期间,只有一份Factory.
3.SqlSession:数据库会话对象,
实现类DefaultSqlSession.该对象内部有curd方法执行数据库表操作.(selectOne,selectList,insert,delete,update,getMapper),只有getMapper方法重要.
生命周期:每次数据库操作临时打开会话,用完关闭会话.
4.dao接口的代理对象:
mybatis-config核心配置文件: id随便定义的,default必须和id一致
sysuser-mapper映射文件配置:
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。有效值:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGIN
———————————————————————————
四、如何配置核心文件和映射文件?
1.配置文件
settings–>日志|驼峰命名开启
type Alias–>别名标签
environments—>数据库环境
mappers加载外部的xml映射文件
2.映射文件
mapper:namespace=“dao接口的全名”
五、对几个配置文件的解释说明:
1、配置文件 Configure.xml 是 mybatis 用来建立 sessionFactory,里面主要包含了数据库连接相关内容,还有 java 类所对应的别名,比如:<typeAlias alias="User" type="com.yiibai.mybatis.models.User"/> 这个别名非常重要,在具体的类的映射中,比如:User.xml 中 resultType 就是对应这个。要保持一致,这里的 resultType 还有另外单独的定义方式,后面学习到我们再详细介绍说明。
2、Configure.xml 里面 的<mapper resource="com/yiibai/mybatis/models/User.xml"/>是包含要映射的类的 xml 配置文件。
3、在User.xml 文件里面主要是定义各种 SQL 语句,以及这些语句的参数,以及要返回的类型等等。
基本+string
实体
———————————————————————————
六、Mybatis原理解析
1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。
2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。
3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
————————————————————————————————
原生JDBC实现六步骤
1.注册驱动
2.获取数据库连接对象Connection
3.获取执行sql语句的执行者对象Statement
4.执行sql语句,获取结果
5.处理结果
6.释放资源(IO流)
/**
* JDBC连接数据库和关闭资源工具类
* @author limeng
*
*/
public class JDBCUtils {
private static String drivername;
private static String url;
private static String user;
private static String password;
/**
* 通过静态代码块,初始化数据库连接配置数据,并且注册数据库驱动
*/
static {
try {
Properties pr = new Properties();
//通过读取Properties文件给属性赋值,即每次使用该工具类都会读取最新配置进行连接
pr.load(new FileInputStream(new File("jdbc_config.properties")));
drivername = pr.getProperty("drivername");
url = pr.getProperty("url");
user = pr.getProperty("user");
password = pr.getProperty("password");
Class.forName(drivername);
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
throw new RuntimeException("获取数据库连接异常,请检查配置数据");
}
}
/**
* 获取数据库连接对象
* @return
*/
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("获取数据库连接异常,请检查配置数据");
}
return con;
}
/**
* 关闭JDBC相关资源
* @param con
* @param sta
* @param rs
*/
public static void closeResource(Connection con,Statement sta,ResultSet rs) {
try {
if(con!=null) {
con.close();
}
if(sta!=null) {
sta.close();
}
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
通过JDBC工具类进行增删改查操作
/**
* 通过JDBC工具类进行增删改查操作
* @author Limeng
*
*/
public class JDBCDemoByUtils {
private static String sqlStatement;
public static void main(String[] args) throws Exception {
//通过工具类获取数据库连接对象
Connection con = JDBCUtils.getConnection();
//通过连接创建数据库执行对象
Statement sta = con.createStatement();
//为查询的结果集准备接收对象
ResultSet rs = null;
//查询
sqlStatement = "SELECT * FROM DEPT";
qry(sta,sqlStatement,rs);
//增加
sqlStatement = "INSERT INTO DEPT VALUES('50','TEST','CHINA')";
System.out.println("插入执行结果:"+update(sta,sqlStatement));
//更新
sqlStatement = "UPDATE DEPT SET loc='SHAOXING' WHERE DEPTNO = '50'";
System.out.println("更新执行结果:"+update(sta,sqlStatement));
//删除
sqlStatement = "DELETE FROM DEPT WHERE DEPTNO = '50'";
System.out.println("删除执行结果:"+update(sta,sqlStatement));
JDBCUtils.closeResource(con, sta, rs);
}
/**
* 查询
* @param sta
* @param sql
* @param rs
* @throws SQLException
*/
private static void qry(Statement sta,String sql,ResultSet rs) throws SQLException {
rs = sta.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getObject("deptno"));
}
}
/**
* 增删改
* @param sta
* @param sql
* @return
* @throws SQLException
*/
private static int update(Statement sta,String sql) throws SQLException {
return sta.executeUpdate(sql);
}
}