iBatis—>MyBatis
-作用:对数据库进行操作
JDBC—>JdbcTemplate—>MyBatis
MyBatis是对JDBC技术的封装.
-封装了获取连接,生成Statement,执行SQL过程
-封装了SQL参数设置过程
(将参数设置到#{xx})
-封装了将结果集映射成实体对象过程
(resultType指定,名称对应)
MyBatis使用需要的准备工作:
-导入mybatis包+数据库驱动包
-添加一个SqlMapConfig.xml主配置文件
-根据表写实体类/编写SQL/
利用MyBatis调用SQL
User—>UserMapper.xml
Emp—>EmpMapper.xml
save
update
delete
findById
findAll
select * from user_czh
where name like ?
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
4.0.0
com.study
mybatis-day07
0.0.1-SNAPSHOT
war
org.mybatis
mybatis
3.3.0
com.oracle
ojdbc14
10.2.0.4.0
junit
junit
4.12
SqlMapConfig.xml
UserMapper.xml
DELETE FROM user_dk
WHERE ID = #{id}
UPDATE user_dk
SET NAME=#{name},AGE=#{age}
WHERE ID=#{id}
INSERT INTO user_dk (ID,NAME,AGE)
VALUES (#{id},#{name},#{age})
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 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 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 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 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 findAll();
public int saveUser(User user);
public int updateUser(User user);
public int deleteUser(int id);
public List findLikeName(String name);
public Map findName(int id);
}
编写每一个方法对应依次运行test进行测试: