1.mybatis框架入门
1.1 mybatis框架的认识:
Java的持久层框架
它是ORM(对象关系映射)的框架
Mybatis是一个支撑框架,它以映射sql语句orm方式来数据库持久化操作.
1.2 mybatis的特点(与jdbc相比)
jdbc:
重复性代码比较多
封装对象 insert(User user) select 比较麻烦
没有性能控制 如果要提高效率 需要自己写缓存 一级缓存 二级缓存 EntityManagerFactory(配置才能使用)
mybatis 特点:
没有太多重复代码
封装对象(不用手动处理参数) -->select User对象
性能控制 缓存
(把sql从代码抽取出来)sql统一管理,维护比较方便
企业90%都在使用mybatis – 大型项目在使用
2.使用mybatis
2.1 导包
导入mybatis相关包和日志相关包
2.2 配置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>
<!--引入jdbc.propeties文件-->
<properties resource="jdbc.properties" />
<!-- 环境们 (很多环境的意思)
default:默认使用哪一个环境(必需对应一个环境的id)
-->
<environments default="development">
<!--
一个环境 id:为这个环境取唯一一个id名称
-->
<environment id="development">
<!--
事务管理 type:JDBC(支持事务)/MANAGED(什么都不做)
-->
<transactionManager type="JDBC" />
<!-- 数据源, 连接池 type(POOLED):MyBatis自带的连接池 -->
<dataSource type="POOLED">
<!-- 连接数据库的参数 -->
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 这个mappers代表的是相应的ORM映射文件 -->
<mappers>
<mapper resource="cn/hr/domain/UserMapper.xml" />
</mappers>
</configuration>
2.3 配置jdbc.properties文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=****
2.4 数据库自行建表不要忘记!!!
3.mybatis完成简单的crud
3.1 创建domain
public class User {
private Long id;
private String name;
3.2 在domain包下配置UserMapper.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">
<!-- orm框架 sql的映射
namespace:命名空间 namespace路径+ id值
namespace怎么配置 包名.接口名 + queryAll
parameterType:参数类型
-->
<mapper namespace="cn.hr.dao.IUserDao">
<!-- 查询 queryAll()
resultType 返回类型
-->
<select id="queryAll" resultType="cn.hr.domain.User">
select * from t_user
</select>
<!-- java.lang.Long mybatis内置别名-->
<select id="queryOne" parameterType="long" resultType="cn.hr.domain.User">
select * from t_user where id=#{id}
</select>
<!-- 新增 name-->
<insert id="save" parameterType="cn.hr.domain.User">
insert into t_user(name) values(#{name})
</insert>
<!-- 修改-->
<update id="update" parameterType="cn.hr.domain.User">
update t_user set name=#{name} where id=#{id}
</update>
<!-- 删除-->
<delete id="delete" parameterType="long">
delete from t_user where id=#{id}
</delete>
3.3 创建dao daoimpl
public interface IUserDao {
void save(User user) throws IOException;
void update(User user) throws IOException;
void delete(Long id) throws IOException;
User queryOne(Long id) throws IOException;
List<User> queryAll() throws IOException;
}
@Override
public User queryOne(Long id) throws IOException {
//调用mapper.xml的select方法
Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
//得到SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//通过sqlSessionFactory得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用方法 namespace+id
User user = sqlSession.selectOne("cn.hr.dao.IUserDao.queryOne", id);
return user;
}
@Override
public void save(User user) throws IOException {
//调用mapper.xml的select方法
Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
//得到SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//通过sqlSessionFactory得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用方法 namespace+id
sqlSession.insert("cn.hr.dao.IUserDao.save", user);
//提交
sqlSession.commit();
}
@Override
public void update(User user) throws IOException {
//事务
//调用mapper.xml的select方法
Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
//得到SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//通过sqlSessionFactory得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用方法 namespace+id
sqlSession.update("cn.hr.dao.IUserDao.update", user);
sqlSession.commit();
}
@Override
public void delete(Long id) throws IOException {
//事务
//调用mapper.xml的select方法
Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
//得到SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//通过sqlSessionFactory得到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用方法 namespace+id
sqlSession.delete("cn.hr.dao.IUserDao.delete", id);
sqlSession.commit();
}
3.4 由于重复代码太多 抽取公共代码
public enum MyBatisUtils {
INSTANCE;
private static SqlSessionFactory sqlSessionFactory;
static{
Reader reader = null;
try {
//读取配置文件
reader = Resources.getResourceAsReader("MyBatis-Config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
//打印堆栈信息
e.printStackTrace();
throw new RuntimeException("解析配置文件出问题"+e.getMessage());
}
}
//写方法
public SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
3.4 调用工具类方法
@Override
public List<User> queryAll() throws IOException {
SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession();
//调用方法 namespace+id
List<User> users = sqlSession.selectList("cn.hr.dao.IUserDao.queryAll");
return users;
}
4.1 测试
在这里就不测了~~~~
5 mybatis细节点
5.1 主键
如何在能操作时拿到我们的主键,并打印在控制台
在UserMapper.xml中加入配置
<!--
useGeneratedKeys:使用主键
keyColumn:数据库id列
keyProperty:程序里面User类的属性
-->
<insert id="save" parameterType="cn.hr.domain.User"
useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into t_user(name) values(#{name})
</insert>
5.2 日志
配置 log4j.properties
参数可自行修改 不会请百度
# 日志输出级别 输出到控制
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.hr=TRACE
# 输出到控制台的配置信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 输出到控制台的 格式类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
5.3 别名
5.3.1 内置别名 (见图)
5.3.2 自定义别名(在MyBatis-Config.xml中配置)
<typeAliases>
<!-- 配置单独类
<typeAlias type="cn.hr.domain.User" alias="user"></typeAlias>
-->
<!--配置包 项目,添加了包之后,类名就是别名-->
<package name="cn.hr.domain"></package>
</typeAliases>
测试使用别名
//别名前的保存方法
<insert id="save" parameterType="cn.hr.domain.User">
insert into t_user(name) values(#{name})
</insert>
//别名后的保存方法
<select id="queryOne" parameterType="long" resultType="User">
select * from t_user where id=#{id}
</select>
5.3.3 #和$的区别
(1) $ {id} 找的类参数类的里面 getId这个方法,如果有 就不会报错,没有就会报错
(2) # 占位符,$ 拼接字符串形式 – 比较重要点
userMapper.xml
update t_user set name=${name} where id=#{id}
生成语句
update t_user set name=小秋秋 where id=?
$ 拼接字符串方式 --Statement --存在sql注入问题
`# 占位符 – PreparedStatement
(3) 平时使用比较多还是 #{id}
(4) $一般使用在limit+orderby上面 其他情况下 就是使用#
6 批量操作(修改UserMapper.xml)
6.1 批量删除(与批量修改差不多)
<delete id="deleteBatch" parameterType="list">
delete from t_user where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
6.2 批量新增
<insert id="saveBatch" parameterType="list">
insert into t_user(name) values
<foreach collection="list" item="user" separator="," >
(#{user.name})
</foreach>
</insert>
7 mybatis动态修改(修改UserMapper.xml)
<sql id="whereSql">
<if test="name!=null">
and name like #{name}
</if>
<if test="age!=null">
and age = #{age}
</if>
</sql>
<!--高级查询方法-->
<select id="queryList" parameterType="userQuery" resultType="User">
select * from t_user
<where>
<include refid="whereSql"></include>
</where>
</select>