1.创建项目
2.导入相关的jar包与一个jdbc的配置文件放在resource资源包下
3.准备数据库里的表或者其他数据
4.在src下创建包比如com.jd
在com.jd下创建domain(包)层
下面创建实现类,封装数据库里的表
使用标准封装private修饰的引用类型得的加上变量名
eg:private Long id;
公共的无参构造 pubulic 与类名一致的方法名{}
公共的有参,
JavaBeen属性的get取值写出 set赋值写入
重写to string
5.com.jd包下创建Mapper(包)层 XxxMapper接口(这里面写crud方法,都是抽象方法可以省略pubulic abstract)里面的查询有两种方式一个是通过Id查询一个是查询所有通过ListAll
6.写Mapper层下的impl包下的XxxMapperImpl实现类 先重写接口里的方法不用详细里面的方法
7.创建XxxMapper.xml映射文件(目前和XxxMapper放在同一个地方)放在resource文件夹下
【要求包名与Mapper接口的包名一致eg:Mapper接口放在src下com.jd.mapper包下 那么映射文件也必须在resource下的com.jd.mapper下】
映射文件里写的内容:
注意:该 XxxMapper.xml 定义跟 XxxMapper.java 接口中对应CURD方法【标签中id必须方法名一致,也就是映射文件中的sql方法里的Id名必须和mapper接口中的方法名一致】
1).<mapper namespce = "Xxxmapper接口的完全限定路径就是从包开始这样写的原因是扩展性强"> mapper标签主要功能就是写sql,完成解耦。
2).开始写sql的方法:在映射文件中的所有参数?用如下符号代替:#{参数名} 【参数名就是可读Bean属性名】
l select – 映射查询语句 #{值}表示,要求:值必须是java中域对象有对应的getXxx()方法【可读Bean属性
查询单个
<select id="这里写Xxxmapper接口中的方法名必须一致包括大小写" resultType="就是我们自己的封装数据库的实体类的类名">
eg:SELECT * FROM 表名 WHERE id=#{id}
</select>
查询多个
eg:注意:如果返回值是集合,则写集合元素类型
<select id="listAll" resultType="User">
SELECT * FROM 表名
</select>
<select id="方法名" resultType="对象"><!-- 如果返回值是集合,则写集合元素类型 -->
SELECT * FROM 表名 WHERE 字段=#{值} AND 字段=#{值}
</select>
l insert – 映射插入语句 useGeneratedKeys(useGeneratedKeys="true"表示开启获取主键支持)、keyProperty(keyProperty="域对象对应的主键字段名"【必须写,要求类的字段必须有setXxx(...)方法】) 仅对 insert 有 用
eg:<insert id="save" useGeneratedKeys="true" keyProperty="id">SQL方法块<insert/>
<insert id="这里写Xxxmapper接口中的方法名必须一致包括大小写">
INSERT INTO 表名 (字段名, 字段名, 字段名) VALUES (#{字段值}, #{字段值}, #{字段值})
</insert>
l update – 映射更新语句
<update id="这里写Xxxmapper接口中的方法名必须一致包括大小写">
UPDATE 表名 SET 字段名=#{值:可以理解为就是封装类的字段名}, 字段名=#{值}, 字段名=#{值} WHERE id=#{id}
</update>
l delete – 映射删除语句
<delete id="这里写Xxxmapper接口中的方法名必须一致包括大小写">
</delete>
这些SQL方法都要写在mapper标签里
8.主配置文件
resource资源包下要求名字必须是mybatis-config.xml【小技巧在主配置文件中没有后缀的路径用点,有的用】
l configuration 配置
<properties resource="包/jdbc.properties【引用jdbc配置文件的相对路径从包开始】">
</properties>
l properties 属性
<properties resource="org/mybatis/example/config.properties">[传入mybatis的主配置文件]
</properties>
l typeAliases 类型命名 package标签,设置公共的包路径,且可以写多个。name属性是扫描的包路径。
<typeAliases>
<package name="com.jd.domain"/> 【这个命名空间的传入封装的实体类的包路径作用就是Xxxmapper.xml中SQL语句查询中的resultType表示返回值就可以直接写该包下的类名也就是对象】
</typeAliases>
环境标签:environments,下面可以配置多个环境:例如开发环境、生产环境、测试环境
default:表示选中下面某一个环境使用
l environments 环境
l environment 环境变量
l property 特性 == 属性properties的子标签
l transactionManager 事务管理器
l dataSource 数据源
<environments default="development"> 不用更改使用默认的
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName【
value的值就是jdbc的名字四大剑客的名字】}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource> 数据源
</environment>环境变量
</environments>环境
l 映射器 这些语句简单告诉了 MyBatis 去哪里找映射文件就是找XxxMapper.xml。
<mappers>
<mapper resource="com/jd/mapper/XxxMapper.xml"/>
</mappers>
这些都得写在<configuration></configuration>这个配置文件中
- 这下我们就可以去完成mapper层的实现类中的具体方法了
查询方法:
先判断非空,如果为空就返回
eg: if (u == null) {
return false;
}
在获取配置文件:
String resource = "org/mybatis/example/Configuration.xml";(主配置的路径获取)
Reader reader = Resources.getResourceAsReader(resource); (读取主配置文件)
sqlMapper = new SqlSessionFactoryBuilder().build(reader);(创建一个工厂建造模式传入读取的主配置文件获取到一个)
获取对象:SqlSession 对象
SqlSession session = sqlMapper.openSession(); (打开对话)
在使用打开对话调用相应的方法 此时调用select的方法查询session.SQL的查询方法(该方法的相对路径这样写有点麻烦建议在类里声明一个private static final String NAMESPACE = "com.jd.mapper.UserMapper.";后面的点一定要写这个变量后面的方法一样会使用到所以放在上面更加方便)
查询是不需要关流的也不需要提交事务其他的都需要关close();、提、滚
删除方法:
第一步也是获取配置文件读取创建工厂和开启回话都是一样的
在使用开启对象先调用SQL的删除方法 传入对象和参数,再调用commit()提交事务最后在调用close()关流,当提交错误会在使用会话对象调用rollback()来回滚事务
其余的方法,除了调用方法不同其他的都是相同的,这个时候我们就需要有一个抽取工具类的思想了
- 抽取工具类
在src下创建一个util的包,在包下创建一个MyBatisUtils的类将获取对象和关流还有提交事务弄成三个方法
三个方法均需要工厂建造模式的对象所以我们在上面声明一个私有静态的成员变量
private static SqlSessionFactory sqlSessionFactory;
因为获取对象每一次都读取主配置,那么我们使用静态代码块就能解决这个每次调用都需要读取配置的问题,将它们全部放在
Static {
String resource = "org/mybatis/example/Configuration.xml";(主配置的路径获取)
try(
Reader reader = Resources.getResourceAsReader(resource);
){
sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
获取工厂建造模式
} catch (IOException e) {
e.printStackTrace();
}
}
打开会话
public static SqlSession getSession() {
return sqlSessionFactory.openSession(true);
}
回滚事务
public static void rollback(SqlSession session) {
if (session != null) session.rollback();
}
关流
public static void close(SqlSession session) {
if(session!=null) session.close();
}
当工具类写完了后就可以去使用该方法了直接去mapper实现类去直接找到改方法使用MyBatisUtils调用方法即可
- 先创建一个mapper层的测试类测试一下连接是否可行方便排错
- 这下可以写service层了同样在src下创建一个和mapper层同级的包在包下创建service接口类,方法和mapper接口的方法一致除了个别的比如登录注册的实现在创建service的实现类重写接口中的方法,这个实现类的作用就是判断业务逻辑和调用mapper层
第一步就是多态向上造型获取mapper实现类对象用mapper接口接收
private UserMapper mapper = new UserMapperImpl();
先进行非空判断
在方法里用mapper对象去调用mapper接口中的方法
有返回值的就返回没有的就看你要不要用打印语句表示一下了
- 在src下创建一个与service层同级的controller包,在包下创建一个XxxController的类来调用service层
private UserService service = new UserServiceImpl();
在方法里使用Service对象调用相应的方法进行crud的执行操作