大概内容:
1.认识一下mybatis
2.mybatis框架的搭建
认识一下mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
mybatis的特点:
简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
提供映射标签,支持对象与数据库的orm字段关系映射
提供对象关系映射标签,支持对象关系组建维护
提供xml标签,支持编写动态sql。
mybatis框架的搭建
这里通过一个Java实例来演示:
1.在架mybatis框架时也需要先导入一些包
2.编写好值对象类和映射文件(包含值对象信息和想要执行的一些sql操作语句)
//User.java
package cn.hncu.domain;
public class User {
private String id;
private String name;
private String pwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd
+ "]";
}
}
//User.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="users">
<!-- 返回类型是List<User> -->
<select id="all" resultType="cn.hncu.domain.User">
select * from users
</select>
</mapper>
3.需要写一个mybatis的配置文件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>
<typeAliases>
<typeAlias alias="User" type="cn.hncu.domain.User"/>
</typeAliases>
<!-- 这里相当于连接数据库的操作,要预先创建数据库表---users -->
<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://127.0.0.1:3306/mybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
<property name="poolMaximumActiveConnections" value="5"/><!-- 池大小 -->
</dataSource>
</environment>
</environments>
<!-- 导入相应的值对象xml文件 -->
<mappers>
<mapper resource="cn/hncu/domain/User.xml"/>
<mapper resource="cn/hncu/domain/User2.xml"/>
<mapper resource="cn/hncu/domain/User3.xml"/>
<mapper resource="cn/hncu/domain/Person.xml"/>
<mapper resource="cn/hncu/domain/Role.xml"/>
</mappers>
</configuration>
3.需要写一个获取SqlSession的工具类
package cn.hncu.utils;
import java.io.InputStream;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionUtils {
private static SqlSessionFactory sessionFactory=null;//sessionFactory相当于一个sqlsession池
static{
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");//加载配置文件
sessionFactory = new SqlSessionFactoryBuilder().build(in);
/*
这里也可以不使用Resources类加载配置文件的方法(我们自己利用classLoader以底层的方式加载):
sessionFactory = new SqlSessionFactoryBuilder().build(SqlSessionUtils.class.getClassLoader().getResourceAsStream("mybatis-config.xml") );
*/
} catch (Exception e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSessionFactory() {
return sessionFactory;
}
public static SqlSession getSqlSession() {
return sessionFactory.openSession();
}
public static SqlSession getSqlSession(boolean boo) {
return sessionFactory.openSession(boo);//con.setAutoCommit(boo)
}
public static void main(String[] args) {
//注意,mybatis在池中控制的是连接的数量,不是sqlSession的个数
for(int i=0;i<12;i++){
SqlSession s = getSessionFactory().openSession(); //一个session中只包含一个连接
Connection con = s.getConnection();
//Connection con = null;
System.out.println(s+",,"+con);
}
}
}
4.可以写代码执行操作
//第一种方式
public class Demo {
@Test
public void query1_1(){
SqlSession session = SqlSessionUtils.getSqlSession();
//List<User> users = session.selectList("all"); //省略命名空间
List<User> users = session.selectList("users.all"); //不省略命名空间
for(User user: users){
System.out.println(user);
}
session.close();
}
}
/*第二种方式
->先写一个接口类,类名和User.xml中mapper的名称空间名一样,写一个方法,方法名和对应的sql操作标识的id一样
*/
public interface UserMapper {
List<User> all();
}
/*
->在写执行代码
*/
public class Demo {
@Test //采用接口的方式访问---更安全
public void query1_2(){
SqlSession session = SqlSessionUtils.getSqlSession();
UserMapper um = session.getMapper(UserMapper.class);
List<User> users = um.all();
for(User user: users){
System.out.println(user);
}
session.close();
}
演示结果: