mybatis
-
依赖配置
<!--import dependencies--> <dependencies> <!--mysql driver--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <!--mybatis--> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <!--junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
实践
1)mybatis核心配置文件
<?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 core file-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--a Mapper.xml need regist in Mybatis core configuration file-->
<mappers>
<mapper resource="com/hdbing/dao/UserMapper.xml"/>
</mappers>
</configuration>
2)mapper配置文件
<!--指定为UTF-8编码,防止注释中的中文编码出错-->
<?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中的包名要和Dao/Mapper接口的包名一致!!!-->
<mapper namespace="com.hdbing.dao.UserDao">
<!--sql-->
<select id="getUserList" resultType="com.hdbing.pojo.User">
select * from mybatis.user
</select>
<insert id="addUser" parameterType="com.hdbing.pojo.User">
insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="com.hdbing.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>
3)MybatisUtils工具类
//SqlSessionFactory -->SqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybaties第一步:获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
// SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
public static SqlSession getSqlSession(){
// SqlSession sqlSession = sqlSessionFactory.openSession();
// return sqlSession;
return sqlSessionFactory.openSession();
}
}
4)User实体类
//实体类
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
5)Dao接口
public interface UserDao {
List<User> getUserList();
}
6)测试文件
@Test
public void test(){
//第一步:获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
//方式一:getMapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
//关闭SqlSession
sqlSession.close();
}
知识点
1)万能Map
假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!可以直接取出来
//万能的Map
int addUser2(Map<String,Object> map);
<!--对象中的属性,可以直接取出来,传递map的key-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,pwd) values (#{userid},#{password})
</insert>
2)模糊查询
方式一、java代码执行的时候,传递通配符
List<User> userList = mapper.getUserLike("%李%");
方式二、在sql拼接中使用通配符
select * from mybatis.user where name like "%"#{value}"%"
3)环境配置(environments)
Mybatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。
学会使用配置多套运行环境!
Mybatis默认的事务管理器就是JDBC,连接池:POOLED
4)使用外部配置文件(properties)
<!--引入外部配置文件-->
<properties resource="db.properties">
<property name="username" value="root"/>
<property name="pwd" value="123123"/>
</properties>
- 可以直接引入外部文件
- 可以在其中增加一些属性配置
- 如果两个文件有同一个字段,优先使用外部配置文件
5)类型别名(typeAliases)
方式一
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="com.hdbing.pojo.User" alias="User" />
</typeAliases>
方式二
<!--可以给实体类起别名-->
<typeAliases>
<package name="com.hdbing.pojo"/>
</typeAliases>
在实体类比较少的时候,使用第一种方式;如果实体类十分多,建议使用第二种
第一种可以DIY别名,第二种则不行,如果非要改,需要在实体上增加注解
@Alias("user")
//实体类
public class User {}
6)映射器(mappers)
方式一:【推荐使用】
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper resource="com/hdbing/dao/UserMapper.xml"/>
</mappers>
方式二:使用class文件绑定注册
<!--每一个Mapper.xml都需要在Mybatis核心配置文件中注册!-->
<mappers>
<mapper class="com.hdbing.dao.UserMapper"/>
</mappers>
注意点:
- 接口和它的Mapper配置文件必须同名!
- 接口和它的Mapper配置文件必须在同一个包下!
7)属性名和字段名不一致问题
场景:假如User实体类字段名为password,而表的列名为pwd
方法一:起别名
<select id="getUserById" parameterType="int" resultType="user">
select id,name,pwd as password from mybatis.user where id = #{id}
</select>
方法二:通过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" parameterType="int" resultMap="UserMap">
select * from mybatis.user where id = #{id}
</select>
8)日志
-
STDOUT_LOGGING 标准日志输出
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> -
Log4j
-
导入依赖
<dependencies> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> -
编写
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/hdbing.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 -
在
mybatis-config.xml核心配置文件中,配置log4j为日志的实现<settings> <setting name="logImpl" value="LOG4J"/> </settings> -
使用
// 日志对象,参数为当前类的class static Logger logger = Logger.getLogger(UserDaoTest.class); // 日志级别 logger.info("info:进入了testLog4j"); logger.debug("DEBUG:进入了testLog4j"); logger.error("erro:进入了testLog4j");
-
9)分页
-
使用
Limit分页// 接口中添加 分页方法 List<User> getUserByLimit(Map<String,Integer> map);<!--分页,这里的UserMap就是之前定义的ResultMap--> <select id="getUserByLimit" parameterType="map" resultMap="UserMap"> select * from mybatis.user limit #{startIndex},#{pageSize} </select>@Test public void getUserByLimit(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("startIndex",0); map.put("pageSize",2); List<User> userList = mapper.getUserByLimit(map); for (User user : userList) { System.out.println(user); } sqlSession.close(); } -
使用
RowBounds分页// 分页 List<User> getUserByRowBounds();<!--分页2--> <select id="getUserByRowBounds" resultMap="UserMap"> select * from mybatis.user </select>@Test public void getUserByRowBounds(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //RowBounds实现 RowBounds rowBounds = new RowBounds(0, 2); //通过java代码层面实现分页 List<User> userList = sqlSession.selectList("com.hdbing.dao.UserMapper.getUserByRowBounds",null,rowBounds); for (User user : userList) { System.out.println(user); } sqlSession.close(); } -
使用
PageHelper分页插件
10)使用注解开发
本质:反射机制实现
底层:使用动态代理
-
注解在UserMapper接口上实现,并删除UserMapper.xml文件
@Select("select * from user") List<User> getUsers(); -
需要在mybatis-config.xml核心配置文件中绑定接口
<!--绑定接口!--> <mappers> <mapper class="com.hdbing.dao.UserMapper" /> </mappers> -
测试
@Test public void getUsers(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> users = mapper.getUsers(); for (User user : users) { System.out.println(user); } sqlSession.close(); }
11)CRUD
不要忘记,我们必须要将接口注册绑定到我们的核心配置文件中
-
在MybatisUtils工具类创建的时候实现自动提交事务!
public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(true); } -
编写接口,增加注解
public interface UserMapper { @Select("select * from user") List<User> getUsers(); //方法存在多个参数,所有参数前面必须加上@Param("id")注解 @Select("select * from user where id=#{id}") User getUserById(@Param("id") int id); @Insert("insert into user (id,name,pwd) values(#{id},#{name},#{password})") int addUser(User user); @Update("update user set name=#{name},pwd=#{password} where id=#{id}") int updateUser(User user); @Delete("delete from user where id = #{uid}") int deleteUser(@Param("uid") int id); }
关于
@Param()注解-
基本类型的参数或者String类型,需要加上
-
引用类型不需要加
-
如果只有一个基本类型的话,可以忽略,但是建议都加上!
-
我们在SQL中引用的就是我们这里的
@Param("")中设定的属性名!
#{}和${}区别#{}是预编译处理,${}是字符串替换。MyBatis在处理
#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理
${}时,就是把${}替换成变量的值使用
#{}可以有效的防止SQL注入,提高系统安全性
-
12)Lombok(偷懒)
-
在IDEA中安装Lombok插件!
-
导入依赖
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> -
在实体类上加注解即可!
@Data @AllArgsConstructor @NoArgsConstructor@Getter and @Setter @FieldNameConstants @ToString @EqualsAndHashCode @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog @Data @Builder @SuperBuilder @Singular @Delegate @Value @Accessors @Wither @With @SneakyThrows说明如下:
@Data:无参构造、get、set、toString、hashCode、equals @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode @ToString @Getter and @Setter

浙公网安备 33010602011771号