Mybatis介绍- MyBatis本是apache的一个开源项目,前身叫iBatis,后来迁移到google code后改名mybatis
- MyBatis是一个持久层框架,对jdbc的操作数据库的过程进行封装
Mybatis入门程序mybatis下载- mybaits的代码由github.com管理
- 下载地址:https://github.com/mybatis/mybatis-3/releases
- mybatis-3.2.7.jar----->mybatis的核心包
- lib文件夹------------->mybatis的依赖包所在
- mybatis-3.2.7.pdf----->mybatis使用手册
- 使用时把核心包和依赖包都拷贝到lib中,同时加上数据库驱动包
业务需求- 根据用户id查询一个用户
- 根据用户名称模糊查询用户列表
- 添加用户
- 更新用户
- 删除用户
环境搭建- 创建java工程
- 加入jar包
- 加入mybatis核心包、依赖包、数据驱动包
- builtpath(java工程需要手动builtpath)
- 加入配置文件
- 创建资源文件夹config,加入log4j.properties和sqlMapConfig.xml配置文件
[AppleScript] 纯文本查看 复制代码 "log4j.properties"
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
[XML] 纯文本查看 复制代码 "sqlMapConfig.xm"
<?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>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
</configuration>
- SqlMapConfig.xml是mybatis核心配置文件,配置文件内容为数据源、事务管理
创建pojo- pojo类作为mybatis进行sql映射使用,po类通常与数据库表对应
sql映射文件- 在config下的sqlmap目录下创建sql映射文件User.xml
[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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="test">
</mapper>
加载映射文件- mybatis框架需要加载Mapper.xml映射文件
- 将users.xml添加在SqlMapConfig.xml
[XML] 纯文本查看 复制代码 <mappers>
<mapper resource="sqlmap/User.xml" />
</mappers>
创建测试类测试程序
[XML] 纯文本查看 复制代码 <!--
#{} select * from user where id = ? 占位符 ? == '五'
${} select * from user where username like '%五%' 字符串拼接
select * from user where username like "%${value}%" 用$的时候参数只能为value,不防止sql注入
-->
[Java] 纯文本查看 复制代码 public class MyBatisDemo1 {
private SqlSessionFactory sqlSessionFactory;
@Before
public void testJunit() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream is = Resources.getResourceAsStream(resource);
//InputStream is = this.getClass().getClassLoader().getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
}
@Test
public void findUserById() {//实现根据id查询用户
SqlSession session = sqlSessionFactory.openSession();
User user = session.selectOne("test.selectUserById",10);
System.out.println(user);
session.close();
}
@Test
public void findUserByUserName() {//实现根据用户名模糊查询用户
SqlSession session = sqlSessionFactory.openSession();
List<User> selectList = session.selectList("test.selectUserByUserName", "王");
for (User user : selectList) {
System.out.println(user);
}
session.close();
}
@Test
public void insertNewUser() {//实现添加用户
SqlSession session = sqlSessionFactory.openSession();
User user = new User("二狗", "男", new Date(), "二狗街道");
int row = session.insert("test.insertNewUser", user);
System.out.println(user.getId());
"需要进行事务提交"
session.commit();
session.close();
}
@Test
public void updateUser() {//修改用户
SqlSession session = sqlSessionFactory.openSession();
User user = new User(29,"二狗", "女", new Date(), "二狗新街");
int row = session.insert("test.updateUser", user);
System.out.println(row);
session.commit();
session.close();
}
@Test
public void delUser() {//删除用户
SqlSession session = sqlSessionFactory.openSession();
int row = session.insert("test.delUser", 29);
System.out.println(row);
session.commit();
session.close();
}
}
[XML] 纯文本查看 复制代码 <mapper namespace="test">
<select id="selectUserById" parameterType="Integer" resultType="com.itcast.mybatis.domian.User">
SELECT * FROM user where id = #{id}
</select>
<select id="selectUserByUserName" parameterType="String" resultType="com.itcast.mybatis.domian.User">
SELECT * FROM user where username like "%"#{username}"%";
</select>
<insert id="insertNewUser" parameterType="com.itcast.mybatis.domian.User">
<selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="Integer">
SELECT LAST_INSERT_ID();
</selectKey>
insert into user (username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>
<update id="delUser" parameterType="Integer">
delete from user where id = #{id}
</update>
</mapper>
Mybatis与Hibernate的区别(面试)- Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句
- mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象
- Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。
- 但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大
- Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。
- 但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行
- 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好
Dao开发方法- 使用MyBatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper动态代理开发方法
1.原始Dao[Java] 纯文本查看 复制代码 "原始Dao开发,接口+实现类"
public class UserDaoImpl implements UserDao {
@Autoware
private SqlSessionFactory sqlSessionFactory;
"通过用户ID查询一个用户"
public User selectUserById(Integer id){
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession.selectOne("test.findUserById", id);
}
}
2.Mapper动态代理- Mapper接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与mapper接口的类路径相同
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
[Java] 纯文本查看 复制代码 "Mapper动态代理开发,就定义接口,不用实现类"
public interface UserMapper {
public User findUserById(Integer id);
}
[Java] 纯文本查看 复制代码 @Autoware
private SqlSessionFactory sqlSessionFactory;
public void testMapper() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.findUserById(10));
sqlSession.commit();
sqlSession.close();
}
SqlMapConfig.xml配置文件- properties(属性)
- settings(全局配置参数)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境子属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- mappers(映射器)
properties[XML] 纯文本查看 复制代码 <properties resource="db.properties">
<!-- 在properties内部用property定义属性 -->
<!-- 如果外部配置文件有该属性,则内部定义属性被外部属性覆盖 -->
<property name="jdbc.username" value="root123" />
<property name="jdbc.password" value="root123" />
</properties>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<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>
typeAliases(类型别名)
[XML] 纯文本查看 复制代码 <typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="cn.itcast.mybatis.pojo.User" />
<!-- 批量别名定义,扫描整个包下的类,别名为类名(大小写不敏感) -->
<package name="cn.itcast.mybatis.pojo" />
<package name="其它包" />
</typeAliases>
- 在mapper.xml配置文件中,就可以使用设置的别名了,别名大小写不敏感
mappers- class : 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中
- package : 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中
- 项目中用package
[XML] 纯文本查看 复制代码 <mappers>
<mapper resource="sqlmap/User.xml" class="" url=""/>
<mapper class="com.itheima.mybatis.mapper.UserMapper" />
"此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中"
<package name="com.itheima.mybatis.mapper"/>
"此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中"
<mapper url="决定地址,不实用" />
</mappers>
|