MyBatis简介(ORM框架)
iBatis—>MyBatis
-作用:对数据库进行操作
JDBC—>JdbcTemplate—>MyBatis
MyBatis是对JDBC技术的封装.
-封装了获取连接,生成Statement,执行SQL过程
-封装了SQL参数设置过程
(将参数设置到#{xx})
-封装了将结果集映射成实体对象过程
(resultType指定,名称对应)
MyBatis使用需要的准备工作:
-导入mybatis包+数据库驱动包
-添加一个SqlMapConfig.xml主配置文件
-根据表写实体类/编写SQL/
利用MyBatis调用SQL
MyBatis基本使用
User—>UserMapper.xml
Emp—>EmpMapper.xml
save
update
delete
findById
findAll
select * from user_czh
where name like ?
Mapper映射器(接口)
MyBatis提供了一个Mapper映射器接口规则,
按规则写出的接口,MyBatis框架可以自动生成
实现组件对象。
UserDAO接口—》JdbcUserDAO实现类
—》生成对象使用
Mapper映射器接口—》生成对象使用
映射器接口接口规则:
-方法名参考SQL定义的id属性(保持一致)
-方法参数类型参考SQL定义的
parameterType属性(保持一致)
-方法返回类型
增删改:可以是void 或 int
查询:单行结果类型为resultType
多行结果类型为List
-将SQL定义文件元素的
namespace属性指定为”包名.接口名”
映射器接口的使用:
sqlSession.getMapper(接口.class);
UserDAO dao = new $Proxy4();
public class $Proxy4 implements UserDAO{
public List findAll(){
return session.selectList(“findAll”);
}
public User findById(int id){
return session.selectOne(
“findById”,id);
}
}
=====任务=====
利用MyBatis对资费表进行以下操作
-查询所有资费记录
-按ID查询资费记录
-添加资费记录
-删除资费记录
-更新资费记录
-编写CostDAO映射器接口实现上述操作
案例演示:
案例思路:
工程案例目录结构
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.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>mybatis-day07</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
<property name="username" value="learn"/>
<property name="password" value="learn"/>
</dataSource>
</environment>
</environments>
<!-- 加载SQL定义文件 -->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.dk.dao.UserDAO">
<!-- 返回Map结果 -->
<select id="findName" parameterType="int" resultType="map">
SELECT ID,NAME FROM user_dk
WHERE ID=#{id}
</select>
<!-- 按name字段值模糊查询 -->
<select id="findLikeName" parameterType="string"
resultType="com.dk.entity.User">
SELECT * FROM user_dk
WHERE NAME like #{name}
</select>
<!-- SqlSession.delete执行 -->
<delete id="deleteUser" parameterType="int">
DELETE FROM user_dk
WHERE ID = #{id}
</delete>
<!-- SqlSession.update执行 -->
<update id="updateUser" parameterType="com.dk.entity.User">
UPDATE user_dk
SET NAME=#{name},AGE=#{age}
WHERE ID=#{id}
</update>
<!-- SqlSession.insert执行 -->
<insert id="saveUser" parameterType="com.dk.entity.User">
INSERT INTO user_dk (ID,NAME,AGE)
VALUES (#{id},#{name},#{age})
</insert>
<!-- SqlSession.selectList执行 -->
<select id="findAll" resultType="com.dk.entity.User">
SELECT * FROM user_dk
</select>
<!-- SqlSession.selectOne执行 -->
<select id="findById" parameterType="int" resultType="com.dk.entity.User">
SELECT * FROM user_dk
WHERE id = #{id}
</select>
</mapper>
User.java
package com.dk.entity;
import java.io.Serializable;
public class User implements Serializable{
private Integer id;
private String name;
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
MyBatisUtil.java
package com.dk.entity;
import java.io.IOException;
import java.io.Reader;
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 MyBatisUtil {
public static SqlSession getSession() throws IOException{
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
String conf = "SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(conf);
SqlSessionFactory factory = builder.build(reader);
SqlSession session = factory.openSession();
return session;
}
public static void main(String[] args) throws IOException {
SqlSession session = MyBatisUtil.getSession();
System.out.println(session);
}
}
TestUser.java
package com.test;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.dk.dao.UserDAO;
import com.dk.entity.MyBatisUtil;
import com.dk.entity.User;
public class TestUser {
@Test//测试Mapper映射器接口
public void test8() throws IOException{
SqlSession session = MyBatisUtil.getSession();
//根据接口生成实现对象
UserDAO dao = session.getMapper(UserDAO.class);
System.out.println(dao.getClass().getName());
//调用 id = findAll的SQL语句
List<User> list = dao.findAll();
for(User user:list){
System.out.println(user.getId()+" "+user.getName());
}
session.close();
}
@Test//测试查询返回Map
public void test7() throws IOException{
SqlSession session = MyBatisUtil.getSession();
Map<String,Object> map = session.selectOne("findName", 1);
if(map != null){//利用字段名做key提取值
System.out.println(map.get("ID")+" "+map.get("NAME"));
}else{
System.out.println("未找到数据");
}
session.close();
}
@Test//测试模糊查询
public void test6() throws IOException{
SqlSession session = MyBatisUtil.getSession();
List<User> list = session.selectList("findLikeName", "%D%");
for(User user:list){
System.out.println(user.getName());
}
session.close();
}
@Test//测试删除
public void test5() throws IOException{
SqlSession session = MyBatisUtil.getSession();
//执行删除
int rows = session.delete("deleteUser", 10);
System.out.println("删除的记录行数:"+rows);
session.commit();
session.close();
}
@Test//测试更新
public void test4() throws IOException{
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(10);
user.setName("MYBATIS");
user.setAge(21);
//执行更新
int rows = session.update("updateUser", user);
System.out.println("更新的记录行数:"+rows);
//提交事物
session.commit();
session.close();
}
@Test//测试添加
public void test3() throws IOException{
SqlSession session = MyBatisUtil.getSession();
User user = new User();
user.setId(10);//也可由序列生成 ==
user.setName("mybatis");
user.setAge(20);
//执行insert
session.insert("saveUser", user);
//提交事物(增删改需要提交事物)
session.commit();
session.close();
}
@Test//测试多行查询
public void test2() throws IOException{
SqlSession session = MyBatisUtil.getSession();
//执行多行查询
List<User> list = session.selectList("findAll");
for(User user:list){
System.out.println(user.getId()+" "
+user.getName()+" "
+user.getAge());
}
session.close();
}
@Test//测试单行查询
public void test1() throws IOException{
SqlSession session = MyBatisUtil.getSession();
System.out.println(session);
//使用SqlSession执行SQL操作
//selectOne("SQL定义的id属性",paramterType参数值)
User user = session.selectOne("findById",1);
if(user != null){
System.out.println(user.getName());
System.out.println(user.getAge());
}else{
System.out.println("没有该记录");
}
session.close();
}
@Test//测试获取SqlSession
public void test() throws IOException{
//SqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//加载SqlMapConfig.xml主配置文件,
//转化为Reader流参数
String conf = "SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(conf);
//SqlSessionFactory
//加载配置信息获取SqlSession工厂
SqlSessionFactory factory = builder.build(reader);
//SqlSession,由工厂创建SqlSession对象
SqlSession session = factory.openSession();
System.out.println(session);
//使用SqlSession执行SQL操作
//selectOne("SQL定义的id属性",parameterType参数值)
User user = session.selectOne("findById", 2);
if(user != null){
System.out.println(user.getName());
System.out.println(user.getAge());
}else{
System.out.println("没有该记录");
}
session.close();
}
}
UserDAO.java
package com.dk.dao;
import java.util.List;
import java.util.Map;
import com.dk.entity.User;
/**
* Mapper映射器接口:对应UserMapper.xml里的SQL语句
* 方法名-->id属性
* 参数-->parameterType属性
* 返回类型-->增删改void或int;查询参考resultType属性
* @author Cher_du
*
*/
public interface UserDAO {
public User findById(int id);
public List<User> findAll();
public int saveUser(User user);
public int updateUser(User user);
public int deleteUser(int id);
public List<User> findLikeName(String name);
public Map<String,Object> findName(int id);
}
编写每一个方法对应依次运行test进行测试: