Mybatis:
- namespace的包名要和Dao/Mapper接口的包名一致!
增删改查:
- 在UserMapper接口中添加方法
- 在UserMapper.xml中添加标签
- 在测试类中写测试方法,注意sqlSession的提交事务
xml标签:
- id:对应xml绑定的namespace的接口的方法名
- resultType:sql语句执行的返回值
- parameterType:参数类型
接口类:
public interface UserMapper {
List<User> getUserList();
//获得全部用户
User getUserById(int id);
//根据ID获取用户
int addUser(User user);
//添加用户
int updateUser(User user);
//更新用户
int deleteUser(int id);
//删除用户
}
xml标签:
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.dai.dao.UserMapper">
<!--select查询语句-->
<select id="getUserList" resultType="com.dai.pojo.User">
select * from mybatis.user
</select>
<select id="getUserById" parameterType="int" resultType="com.dai.pojo.User">
select * from mybatis.user where id=#{id}
</select>
<insert id="addUser" parameterType="com.dai.pojo.User">
insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.dai.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=#{id}
</delete>
</mapper>
测试方法:
public class UserMapperTest {
@Test
public void getUserList(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList=mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
@Test
public void getUserById(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
sqlSession.close();
}
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(new User(4,"DD","1234456"));
//提交事务
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.updateUser(new User(4,"赫赫","123456"));
sqlSession.commit();
sqlSession.close();
}
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.deleteUser(4);
sqlSession.commit();
sqlSession.close();
}
}
Map:
若实体类或表中参数过多,应该考虑使用map,可以减少参数传递
int addUser2(HashMap<String, Object> map);
//使用map
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,pwd) values(#{userId},#{passWord})
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> map = new HashMap<>();
map.put("userId",5);
map.put("passWord","123456");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
- Map传递参数,直接在sql取出key即可
- 对象传递参数,直接在sql中取出对象属性即可
- 只有一个基本类型参数的情况下,可以直接在sql中取到,不需要标签声明
- 多个参数使用Map或者注解
模糊查询:
- 在java代码执行,传递通配符%
- 在sql拼接使用通配符%
List<User> getUserList2(String string);
//模糊查询
select * from mybatis.user where name like #{value}
List<User> userList2 = mapper.getUserList2("%A%");
配置解析:
核心配置文件:
- mybatis.config.xml
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
环境配置:
- 可以配置多个环境,但是只能选择一种
属性:
-
可在典型java属性文件配置也可以通过子元素配置
-
可以直接引入外部文件
-
可以在其中增加一些属性配置
-
如果同一个配置文件,优先外部配置
别名:
- 可以给实体类起别名
<typeAliases>
<typeAlias type="com.dai.pojo.User" alias="user"/>
</typeAliases>
- 可以给包取别名,默认别名为这个类的类名
<typeAliases>
<package name="com.dai.pojo"/>
</typeAliases>
如果实体类较少使用方式一,否则使用方式二
第一种可以DIY别名,第二种不行,若要改则需要在实体上增加注释
@Alias("Hello")
public class User{}
设置:
改变MyBatis的运行时行为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11uq066D-1688909697509)(C:\Users\daidaide\AppData\Roaming\Typora\typora-user-images\1688886235485.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNX7KkjW-1688909697511)(C:\Users\daidaide\AppData\Roaming\Typora\typora-user-images\1688886307648.png)]
映射器:
方式一:使用resource文件注册绑定
<mapper resource="com/dai/dao/UserMapper.xml"/>
方式二:使用class文件绑定注册
<mapper class="com.dai.dao.UserMapper"/>
- 接口和他的Mapper配置文件必须同名
- 接口和他的Mapper配置文件必须在同一个包下
方式三:使用扫描包进行注入绑定
<package name="com.dai.dao"/>
- 同方式二的注意点
生命周期和作用域:
错误使用会导致严重的并发问题
SqlSessionFactoryBuilder:
- 局部变量
- 创建SqlSessionFactory便不需要
SqlSessionFactory:
- 数据库连接池
- *没有理由丢弃或创造另一个实例
- 应用作用域
SqlSession
- 连接到连接池的请求
- 是线程不安全的,应为请求或方法作用域
- 需要及时关闭
ResultMap:
- 属性与字段不同
方式一:使用resultMap
<resultMap id="UserMap" type="User">
<!--column为数据库的字段,property为实体类的属性-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id=#{id}
</select>
方式二:sql语句取别名
<select id="getUserById" parameterType="int" resultType="user">
select pwd as password from mybatis.user where id=#{id}
</select>
- resultMap元素是Mybatis中最重要最强大的元素
- ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了
- 如果这个世界总是这么简单就好了
日志:
日志工厂:如果一个数据库操作,出现了异常,我们需要排错,日志就是好助手,需要在核心配置文件中配置
- 标准日志工厂实现
<!--设置-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9nHM2Gbc-1688909697511)(C:\Users\daidaide\AppData\Roaming\Typora\typora-user-images\1688892566173.png)]
- Log4j
可以控制日志信息输送的目的地是控制台,文件,GUI组件,并可以控制格式,可以通过配置文件配置
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
- log4j.properties
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootlogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
- 配置log4j
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
log4j的使用
- 在要使用的类中导入包import org.apache.log4j.Logger;
- 日志对象static Logger logger=Logger.getLogger(UserMapperTest.class);
分页:
- 接口
使用map因为有多个参数传递
List<User> getUserByLimit(HashMap<String ,Integer> map);
- 接口xml
<select id="getUserByLimit" parameterType="map" resultMap="UserMap">
select * from mybatis.user limit #{startIndex},#{pageSize}
</select>
- 测试·
public void getUserByLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
HashMap<String,Integer> map=new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userByLimit = mapper.getUserByLimit(map);
for (User user : userByLimit) {
System.out.println(user);
}
sqlSession.close();
}
- 也可以使用Row Bounds实现分页
注解开发:
本质是反射,底层是代理模式
- 注解在接口上实现
@Select("select * from mybatis.user")
List<User> getUserList();
- 使用mapper绑定接口
<!--绑定接口-->
<mappers>
<mapper class="com.dai.dao.UserMapper"/>
</mappers>
- 测试
使用注解实现简单CRUD:
- 自动提交事务
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
- 编写接口,并写注释
public interface UserMapper {
@Select("select * from mybatis.user")
List<User> getUserList();
@Select("select * from mybatis.user where id=#{_id}")
User getUserById(@Param("_id") int id);
@Insert("insert into mybatis.user(id,name,pwd) values(#{id},#{name},#{pwd})")
int addUser(User user);
@Update("update mybatis.user set name=#{name},pwd=#{pwd} where id=#{id}")
int updateUser(User user);
@Delete("delete from mybatis.user where id=#{iid}")//#{}中的一定和类型注解的一致
int deleteUser(@Param("iid") int id);
}
- 测试
@Test
public void getUserList(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList();
for (User user : userList) {
System.out.println(user);
}//遍历
User userById = mapper.getUserById(2);
System.out.println(userById);//查询
mapper.addUser(new User(7,"^^^","1234100"));//添加
mapper.updateUser(new User(7,"&&&^^^","10230414"));//更新
mapper.deleteUser(7);//删除
sqlSession.close();//已经设置自动提交事务
}
关于@Param注解:
- 基本类型的参数或者String类型需要加上
- 引用类型不用加
- 如果只有一个基本类型可以不加,但还是建议加
- 在SQL语句引用的就是@Param()中的属性值
Lombok:
Java插件,可以通过注解消除业务中繁琐的代码
步骤:
- 在idea中安装Lombok插件
- 在项目中导入Lombok的jar包(maven)
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
通过注解实现自动化代码:
- @Data:无参构造,get,set,tostring…
- @AllArgsConstructor:有参全部字段构造
- @NoArgsConstructor:无参构造
- @Getter
- @ToString
尽量少用
快捷键更新:
- 实现代码左对齐—>tab+shift
-------------sql连接,日志over