mybatis开发(第一天)
来源:互联网 发布:淘宝开店认证点击不了 编辑:程序博客网 时间:2024/05/17 06:16
第一天主要知识点:
mybatis框架原理 (掌握)
mybatis入门程序
用户的增、删、改、查
mybatis开发dao两种方法:
原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握)
mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)
mybatis配置文件SqlMapConfig.xml
mybatis核心:
mybatis输入映射(掌握)
mybatis输出映射(掌握)
mybatis的动态sql(掌握)
1.1 mybatis是什么?
mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
1.2 mybatis框架
需求
根据用户id(主键)查询用户信息
根据用户名称模糊查询用户信息
添加用户
删除 用户
更新用户
添加必要的工具包在src文件夹下面,新建一个文件夹config,里面添加我们所需要的配置。、
SqlMapConfig.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>
<properties resource="db.properties"></properties>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理,事务控制由mybatis-->
<transactionManager type="JDBC" />
<!-- 数据库连接池,由mybatis管理-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
其中db.properties编写链接数据库的相关属性
log4j.propeties编写一些日志的代码
下面<mappers>中添加我们定义的映射文件。
<?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">
<!-- namespace命名空间 ,对sql进行分类化的管理-->
<mapper namespace="test">
<!-- 在映射文件中配合很多的sql语句
1.id表示接受输入的参数,如果输入的参数类型是简单类型,参数名可以任意
-->
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE id=#{id}
</select>
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
<!-- add user -->
<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User">
<selectKey keyProperty="id" resultType="int">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO USER (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
<!-- 删除用户通过id -->
<delete id="deleteUserById" parameterType="int">
DELETE FROM USER where id = #{id}
</delete>
</mapper>
这是需要定义一个操作的类:
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession = factory.openSession();
//通过SqlSession操作数据库
User user = sqlSession.selectOne("test.findUserById", 1);
System.out.println(user);
sqlSession.close();
1.1.1 parameterType
在映射文件中通过parameterType指定输入 参数的类型。
1.1.2 resultType
在映射文件中通过resultType指定输出结果的类型。
1.1.3 #{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
1.1.4 selectOne和selectList
selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现使用selectList也可以实现(list中只有一个对象)。
selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne。
mybatis开发dao的方法
1.1 SqlSession使用范围
2.1.1 SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory
将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。
在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
2.1.2 SqlSessionFactory
通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。
将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
2.1.3 SqlSession
SqlSession是一个面向用户(程序员)的接口。
SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)、。
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession最佳应用场合在方法体内,定义成局部变量使用。
3.1 原始dao开发方法(程序员需要写dao接口和dao实现类)
程序员需要写dao接口和dao实现类。
需要向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession
3.1.1 dao接口
public interface UserDao {//通过用户id查询用户
public User findUserById(int id) throws Exception;
//添加用户
public void insertUser(User user) throws Exception;
//删除用户
public void deleteUserById(int id) throws Exception;
}
3.1.2 dao接口实现类
public class UserDaoImpl implements UserDao{private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}
@Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("test.findUserById", id);
sqlSession.close();
return user;
}
@Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("test.insertUser",user);
sqlSession.commit();
sqlSession.close();
}
@Override
public void deleteUserById(int id) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.delete("test.deleteUserById", id);
sqlSession.commit();
sqlSession.close();
}
}
测试代码:
private SqlSessionFactory sqlSessionFactory;@Before
public void setUp() throws Exception {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.findUserById(1);
System.out.println(user);
}
总结原始 dao开发问题
1、dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
2、调用sqlsession方法时将statement的id硬编码了
3、调用sqlsession方法时传入的变量,由于sqlsession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。
mapper代理方法(程序员只需要mapper接口(相当 于dao接口))
程序员还需要编写mapper.xml映射文件
程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
开发规范:
1、在mapper.xml中namespace等于mapper接口地址
<mapper namespace="cn.itcast.mybatis.mapper.UserMapper">
2、mapper.java接口中的方法名和mapper.xml中statement的id一致
3、mapper.java接口中的方法输入参数类型和mapper.xml中statement的parameterType指定的类型一致。
4、mapper.java接口中的方法返回值类型和mapper.xml中statement的resultType指定的类型一致。
<select id="findUserById" parameterType="int" resultType="user">SELECT * FROM USER WHERE id=#{id}
</select>
//查询用户通过id
public User findUserById(int id) throws Exception;
mapper.java
mapper.xml
在SqlMapConfig.xml中加载mapper.xml
一些问题总结:
代理对象内部调用selectOne或selectList:
如果mapper方法返回单个pojo对象(非集合对象),代理对象内部通过selectOne查询数据库。
如果mapper方法返回集合对象,代理对象内部通过selectList查询数据库。
mapper接口方法参数只能有一个是否影响系统 开发?:
mapper接口方法参数只能有一个,系统是否不利于扩展维护。
系统 框架中,dao层的代码是被业务层公用的。
即使mapper接口只有一个参数,可以使用包装类型的pojo满足不同的业务方法的需求。
注意:持久层方法的参数可以包装类型、map。。。,service方法中建议不要使用包装类型(不利于业务层的可扩展)。
SqlMapConfig.xml
mybatis的全局配置文件SqlMapConfig.xml,配置内容如下:
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
1.properties属性:u 在 properties元素体内定义的属性首先被读取。
u 然后会读取properties元素中resource或 url 加载的属性,它会覆盖已读取的同名属性。
u 最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
建议:
不要在properties元素体内添加任何属性值,只将属性值定义在properties文件中。
在properties文件中定义属性名要有一定的特殊性,如:XXXXX.XXXXX.XXXX
2.settings全局参数配置
框架运行时可以调整一些运行的参数
比如:开启二级缓存,开启延迟加载。。
全局参数将会影响batis的运行行为。
3.typeAliases(别名)重点
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
<typeAliases><!-- <typeAlias type="cn.itcast.mybatis.po.User" alias="user"/> -->
<package name="cn.itcast.mybatis.po"/>
</typeAliases>
4.mappers(映射配置)
通过resource加载单个映射文件
通过mapper接口加载单个mapper
<mapper class="cn.itcast.mybatis.mapper.UserMapper"/>(.xml和.class必须同文件加下,且同名)
批量加载mapper(推荐使用)
<package name="cn.itcast.mybatis.mapper"/>
- mybatis开发(第一天)
- MyBatis第一天
- Mybatis第一天
- Mybatis学习第一天
- MyBatis入门--第一天
- mybatis第一天笔记
- Mybatis学习第一天
- Mybatis学习第一天
- MyBatis学习笔记-第一天
- Mybatis(第一天 基础知识)
- MyBatis学习笔记--第一天
- MyBatis(第一天环境搭建)
- 封闭开发第一天
- iphone开发第一天
- Android 开发第一天
- Android开发第一天
- IOS开发第一天
- winform开发第一天
- 如何对Android进行性能优化
- python参考资料
- python datetime 与时间戳相互转换
- MySql避免重复插入sql语句
- caffe 加入 spp_net网络
- mybatis开发(第一天)
- web前端-精选框架与文章
- Uva 10888 Warehouse(二分图最大权匹配)
- android 内存泄漏详解
- vue插件:vue-resource的使用笔记
- 【腾讯TQM】遗传算法在测试中的应用初探
- 自动化测试的魅力
- iOS 获取公历、农历日期的年月日
- codeforces 86 D. Powerful array (莫队)