版权声明:转载请附上文章地址https://blog.csdn.net/qq_42672839
SSM三大框架(spring MVC , spring , mybatis 分别用于 web展示层,业务逻辑处理层,持久层 操作数据库)
目录
----------------第一部分 Mybatis-------------------------
----------------第一部分 Mybatis-------------------------
mybatis持久层的框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身,从而省去了 创建驱动,创建连接,创建 statement 等繁杂的过程.
mybatis官网有模板
maven环境下的pom文件的配置:
在 pom.xml 文件中添加
1】Mybatis3.4.5 的坐标
2】mysql5.1.6
3】junit4.10
4】log4j1.2.12
在mave的
src->main->java下创建
cn.yzh.domian包放实体类对象(如:User)
cn.yzh.dao 包下放操作数据库的接口 (如:UserDao)
->main->resources下放配置文件
------------------------------第一种---------------------------------
全局配置文件:SqlMapConfig.xml
1】里面配置了 数据库驱动,数据库名,账号,密码
2】 <mappers><mapper resource="cn/yzh/dao/UserDao.xml"/></mappers>
【*】resuorce是用配置文件写sql语句--->resource="cn/yzh/dao/UserDao.xml"
【*】class是通过注解来写sql语句--->class="cn.yzh.UserDao"
//在cn.yzh.dao包下的所有接口接口都可以使用
<package name="cn.yzh.dao"></package>
------------------------------第二种---------------------------------
打印日之文件:log4j.properties(控制台打印日志,通过日志寻找错误和异常)
------------------------------第三种---------------------------------
放置sql语句的配置文件
路径:和数据库的接口路径相同-->cn.yzh.dao包下创建 UserDao.xml
设置:
<mapper (标签)
namespace="接口全类名"(cn.yzh.dao.UserDao)>
四种标签:
查询:
[1]<select id="接口中的方法名" resultType="单条的数据类型"[返回值类型](cn.yzh.domian.User)parameterType="参数类型">sql语句</select>
更新:
[2]<update>sql语句</update>
添加:
[3]<insert>sql语句</insert>
删除:
[4]<delete>sql语句</delete>
</mapper>
parameterType="参数类型":参数类型 分为基本类型+String+包装类和对象实体类
*第一种变量名可以随意写
*第二中变量名为属性名
resultType="单条的数据类型"[返回值类型]
resultMap 解决实体类属性与数据库列名不一致的问题
<!-- 配置保存时获取插入的 id -->
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
注解的方式:
删除配置UserDao.xml
在数据库接口的方法上使用注解
@select(sql语句)
public void 方法名();
*注意事项: 在全局配置文件中必须改 resuorce=“cn/yzb/dao/UserDao.xml” ---->class="cn.yzh.dao.UserDao
mybais测试类
【1】用mybatis提供的Resuorce.getResourceAsStream("全局配置文件")获取一个输入流;
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
【2】用构建模式:获取一个构建者对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
【3】用构建者对象加载输入流创建一个工厂模式的对象(参数是输入流)
SqlSessionFactory factory = builder.build(is);
【4】用工厂对象创建一个代理对象
SqlSession sqlSession = factory.openSession(); //已经设置了不自动提交 如果要自动提交传入参数true
【5】用代理模式创建一个接口的对象(参数是接口的字节码)
UserDao userDao = sqlSession.getMapper(UserDao.class);
【6】用接口的实现类对象执行方法
List<User> all = userDao.findAll();
【7】处理结果集
【8】关闭流
is.close();
sqlSession.close();
简化版:
把重复的代码封装方法:
把【1】InputStream is 【2】SqlSessionFactory factory 【3】SqlSession sqlSession 【4】UserDao userDao都放到成员变量的位置
//抽取成员变量
private InputStream is;
private SqlSessionFactory factory;
private SqlSession sqlSession;
private UserDao userDao;
/**
* 初始化成员变量
*/
@Before (注解:在Test执行之前先执行)
public void init() throws Exception{
is=Resources.getResourceAsStream("SqlMapConfig.xml");
factory=new SqlSessionFactoryBuilder().build(is);
sqlSession = factory.openSession();
userDao = sqlSession.getMapper(UserDao.class);
}
@after (注解:在Test执行完后执行)
public void destroy() throws Exception{
//除了查询以外,添加,修改,删除都要提交表单
sqlSession.commit();
//7.释放资源
sqlSession.close();
is.close();
]
Mybatis 的动态 SQL 语句
【1】<!-- 根据用户信息查询 --> <select id="findByUser" resultType="user" parameterType="user">
<include refid="defaultSql"></include>
<where>
<if test="username!=null and username != '' ">
and username like #{username}
</if>
<if test="address != null">
and address like #{address}
</if>
</where>
if标签是判断的作用,where标签相当于sql语句中的条件where!
<!-- 查询所有用户在 id 的集合之中 -->
<select id="findInIds" resultType="user" parameterType="queryvo">
<!-- select * from user where id in (1,2,3,4,5); -->
<include refid="defaultSql"></include>
<where>
<if test="ids != null and ids.size() > 0">
<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
#{uid}
</foreach>
</if>
</where>
</select>
foreach用于循环遍历!
【2】
Mybatis 中简化编写的 SQL 片段
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="user">
<include refid="defaultSql"></include>
</select>
<!-- 根据 id 查询 -->
<select id="findById" resultType="UsEr" parameterType="int">
mybatis的多表查询
数据库中表和表之间关系,以及如何建立关系。
user和account关系。
一个用户有多个账户
某一个账户只属于某一个用户
综上:用户:账户 1:m关系。
在account表中创建user表的外键
需求:查询account表中所有建立封装List<Account>(略)
需求1:查询账户及账户关联的用户的用户名和地址(使用resultType封装) 看图1
回顾多表关联查询的SQL语句
-- 多表关联查询。
-- 三类
-- 笛卡尔积(了解)
特点:记录是2个表记录之积,字段是2个表字段纸盒
select * from account , user
-- 内连接,特点:显示2个表有关联关系的数据(掌握)
select * from account,user where account.uid = user.id //92
select * from account inner join user //99
on account.uid = user.id
-- 外连接
-- 特点: 以左边的表为准,左边表的数据要全部展示,右边如果和左边没有关系,右边显示null
左 : select * from user left join account on user.id = account.uid
-- 特点: 以右边的表为准,右边表的数据要全部展示,左边如果和右边没有关系,左边显示null
右 :select * from user right join account on user.id = account.uid
mybtais的数据操作
【mybatis 1:m】高级映射(重点)
需求:查询所有用户并且将用户拥有的账户数据(如果该用户没有账户也要显示)(参考图)
1.建立实体之间关系。
在User中创建List<Account>
2.在UserDao中编写方法
public List<User> findAll();
3.在UserDao.xml编写Statement
1:m使用
collection property="user中account集合的引用" ofType="集合中元素的类型"
【mybatis m:n】:高级映射(重点)
分析role user 关系。
1个角色可以被多个用户使用。
1个用户可以拥有多个角色。
综上:用户和角色是m:n
Mybatis中的注解开发
环境搭建
单表CRUD操作(代理Dao方式)
多表查询操作
缓存的配置
需求1:查询所有的用户封装List<User>
1.创建mybatis全局配置文件,一般叫sqlMapConfig.xml
配置数据源
配置事务
配置包扫描
选配:
properties
typeAliases
2.创建User的实体类
3.编写UserDao接口
@Select("select * from user")
public List<User> findAll();
4.测试
1.加载sqlMapConfig.xml,获取其输入流
2.创建SqlSessionFactoryBuilder,调用其build方法,传入全局配置文件输入流获取SqlSessionFactory
3.使用SqlSessionFactory的openSession获取SqlSession
4.调用SqlSession的getMapper获取UserDao接口的代理对象。
5.代理对象中findAll方法
6.释放资源
需求:插入用户,根据id修改用户。
在UserDao编写插入用户方法
@Insert("insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})")
public void saveUser(User user);
@Update("update user set username = #{username},sex=#{sex}... where id = #{id}")
public void updateUser(User user);
需求:
根据id删除用户
@Delete("delete from user where id = #{renyi}")
public void deleteUser(int id);
根据id查询用户
@Select("select * from user where id = #{renyi}")
public User findById(int id);
根据用户名模糊查询用户列表
@Select("select * from user where username like #{renyi}")
//@Select("select * from user where username like '%${value}%'")
public List<User> findByUsername(String username);
查询所有用户记录数量
@Select("select count(id) from user")
public int findTotal();
思考:
如果POJO中属性和查询出来结果集中字段不一致。
解决方案:
1.给查询的结果集字段起别名
2.使用resultMap
回顾注解中属性的类型。
1.基本类型
2.String类型
3.Class类型
4.枚举类型
5.注解类型
6.以上类型的数组
@Results(id="UserMap",value = {
@Result(id = true ,column = "id" ,property = "userId"),
@Result(column = "username" ,property = "username"),
@Result(column = "birthday" ,property = "userBirthday"),
@Result(column = "userSex" ,property = "sex"),
@Result(column = "address" ,property = "userAddress")
})
id属性是用来复用。
@ResultMap("UserMap")
多表查询:
1.查询账户关联账户对应的用户。(思路看图)
2.查询用户以及关联的账户的集合。