搭建mybatis 开发环境
1. 引入jar包
Mybatis 3.2.2.jar ojdbc5.jar log4j-1.2.17.jar(打印日志,可以看到mybatis的具体实现)
2. 为mybatis 设置运行环境(通过配置文件)
mybatis-config.xml
xml version="1.0"encoding="UTF-8"?>
DOCTYPE configurationPUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver"value="com.mysql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/telbook"/>
<property name="username"value="root"/>
<property name="password"value="123456"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/nyist/dao/mapper/UserDaoMapper.xml"/>
mappers>
configuration>
3. Mybatis 的核心类
SqlSessionFactoryBuilder : 负责加载mybatis-config.xml
SQLSessionFactory 负责构建SQLSession
SqlSession: “一次数据库会话”,包含了多次数据库访问操作,相当于jdbc里的connection
4 第一个mybatis程序
1、 新建表和实体类
2、 定义dao接口
3、 通过映射表和映射文件实现dao接口
xml version="1.0" encoding="UTF-8"?>
DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="first.MessageDao">
<insert id="insertMessage" parameterType="first.Message">
insert into Message(id,command,description,content)values(#{id},#{command},#{description},#{content})
insert>
mapper>
4.将映射文件配置到mybatis-config.xml文件中(通知mybatis,有这个文件)
<mappers>
<mapper resource="first/MessageDaoImpl.xml"/>
mappers>
4. 编写测试类
(1) 首先读取mybatis配置文件
Reader reader=null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
(2) 然后使用读取到的配置文件构建会话工厂
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
SqlSessionFactory sf =ssfb.build(reader);
(3) 开启一个会话
SqlSession session = sf.openSession();
(4) 得到mybatis为我们创建的接口的实现类,这样我们就可以操作实现类完成目标
MessageDao dao = session.getMapper(MessageDao.class);
(5) 调用实现类的方法进行实现
最后事物提交事物关闭session.commit();
session.close();
5、
查询功能
注意:mybatis 会自动将结果集中的数据封装成指定返回值类型的对象。封装是,将结果的字段值设置到对象的相应属性里,要求结果字段名和对象的属性名保持一致
注意:如果我们查询的结果不是只有一个类型的时候,我们定义结果的时候需要使用ResultMap,具体使用如下:
如果假设现在有班级和学生,一个学生属于一个班级,班级时学生的属性
告诉Mybatis查询结果集合实体的映射关系(以学生为主)-->
普通属性的设置-->
。。。。。。。
association>
6、更新操作 --mapper文件写法
Dao中的接口是 public voidupdataMessage(Message m)
<update id="updateMessage" parameterType="first.Message">
update message setcommand=#{command},description=#{description},content=#{content} where id=#{id}
update>
注意:update和insert ,delete操作完成后要进行提交 session.commit()然后在进行关闭操做session.close()
6、删除操作
Dao中的接口是 public voiddeleteMessage(int id)
7、询表中所有的元素
Dao中的接口是public List
<select id="queryMessage" resultType="first.Message">
select * from message
select>
8、使用两个参数进行对数据的查找
<select id="queryMessageByCommend" parameterType="java.lang.String" resultType="first.Message">
select * from message where command=#{command} anddescription=#{description}
select>
9、
} 如果在sql中包含> <,sql解析时,特殊符号会发生转义。
} 解决方案1:使用 块
}
} 解决方案2 :使用转义字符 > 代替> < 代替 <
}
MyBatisUtil工具类的封装
1. InputStreamis = Resources.getResourceAsStream("mybatis-config.xml");
为了程序的效率 静态代码块当中
2.SqlSessionFactory :创建sqlsession
SqlSessionFactory: 重量级资源(功能强大、内存占用多) 每一个应用只创建一个对象 线程安全
静态代码块中
3. SqlSsession
3.1openSqlSession() 线程绑定 close remove
3.2 控制事务 commit|rollback
3.3 创建DAO接口实现
mybatis-config 补充:
1. 配置内容参数化 (将配置文件中经常修改的内容 再次提取)
2. 起别名
resultMap 查询结果映射对应关系
数据库和Entity 之间 属性对应关系 对应关系取决于需求 resultMap
select* from t_user1 where id = #{id}
---------------------------------------------------------------------------------------------------------------
动态SQL
1.SQL片段
解决sql语句的冗余代码问题
selectid,name,password
fromt_user1 where id = #{1}
2.where字句的处理
概念:在where子句中引入条件判断,从而动态的生成where子句
fromt_user1
id=#{id}
andname=#{name}
andpassword=#{password}
第二种where动态sql的写法
id=#{id}
and name=#{name}
and password=#{password}
3.修改
update t_user1
name=#{name},
password=#{password}
where id =#{id}
4.批量
deletefrom t_user where id in
#{item}
MyBatis缓存(Cache)【重要】
什么是缓存
a) 激活MyBatis的全局缓存
mybatis-config.xml额外的配置
b) 配置具体需要缓存的数据
对应的Mapper文件 加入
c) 实体类要做特殊处理
implementsSerializable
d) 注意:
1 只有在SqlSession关闭的时候,MyBatis才会把查询的数据放置缓存中。
2 脏数据问题 SqlSession会在事务提交的时候,自动清空缓存
最佳实践:
查询方法 需要在调用完成后 关闭SqlSession 确保查询的数据可以进行全局缓存
增删改操作:调用完成后 进行事务的提交
实例搭建:
目录:
实体:User.java
package com.nyist.entity;
public class User {
private int id;
private String username;
private String password;
public User() {
//super();
// TODO Auto-generated constructor stub
}
public User(int id, String username, String password) {
//super();
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
接口:
package com.nyist.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.nyist.entity.User;
public interface UserDao {
public void insert(User user);
public void delete(int id);
public void update(User user);
public List queryAll();
public User queryOne(int id);
//当传递多个参数的时候,使用@Param("") 进行标示然后使用标示在Mapper文件中使用
public User queryByUsernameAndPassword(@Param("username")String username,@Param("password") String password);
}
jdbc.properties:数据库配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/telbook
jdbc.username=root
jdbc.password=123456
mybatis-config.xml Mybatis的配置文件
package com.nyist.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
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 org.junit.Test;
import com.nyist.dao.UserDao;
import com.nyist.entity.User;
public class UserTest {
private static Reader reader = null;
private static SqlSessionFactory factory = null;
static{
try {
// 读取Mybatis 的配置文件 mybatis-config.xml 由于是在src直接目录中,所以没有其他子目录
reader = Resources.getResourceAsReader("mybatis-config.xml");
// 使用读到的配置文件 创建SqlSessionFactory
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 增加数据
*/
@Test
public void test1(){
//使用工厂 开启会话
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = new User();
user.setUsername("lisi");
user.setPassword("123456");
userDao.insert(user);
session.commit();
session.close();
}
/**
* 删除数据
*/
@Test
public void test2(){
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
userDao.delete(8);
session.commit();
session.close();
}
@Test
public void test3(){
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = new User();
user.setId(5);
user.setUsername("lisi");
user.setPassword("123456");
userDao.update(user);
session.commit();
session.close();
}
@Test
public void test4(){
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
List users = userDao.queryAll();
for (User user : users) {
System.out.println(user);
}
}
@Test
public void test5(){
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.queryOne(5);
System.out.println(user);
}
@Test
public void test6(){
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.queryByUsernameAndPassword("zhang", "123456");
System.out.println(user);
}
}