目录
MyBatis介绍:
MyBatis是一款优秀的持久性框架,它支持自定义SQL、存储过程以及高级映射,MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。
MyBatis入门:
配置MyBatis:
新建一个maven工程
导入相关jar包
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
编写MyBatis全局配置文件(从XML文件中获取SqlSessionFactory对象)
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${db.driver}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- 编写sql语句的文件-->
<mappers>
<package name="test01"/>
</mappers>
</configuration>
编写db.properties数据库连接文件
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/数据库名
db.username=数据库用户名
db.password=数据库密码
创建数据库表的实体类
package review;
public class User {
private int id;
private String name;
private String password;
public User(){}
public User(int id,String name,String password){
this.id=id;
this.name=name;
this.password=password;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
编写SQL语句的映射文件
<?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">
<mapper namespace="review.UserMapper">
<select id="selectUser" resultType="review.User">
select * from user where id = #{id}
</select>
</mapper>
编写工具接口
package review;
import java.util.List;
public interface UserMapper {
User getUser(int id);
int addUser(User user);
int deleteUser(int id);
int updateUser(User user);
List<User> getUsers();
List<User> getUsersById(int[] arr);
}
调用MyBatis
package review;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo01 {
public static void main(String[] args) throws IOException {
String resource="mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try{
SqlSession session=sqlSessionFactory.openSession(true);//默认是false 需手动提交
UserMapper mapper=session.getMapper(UserMapper.class);
List<User> list=mapper.getUsers();
System.out.println(list);
} catch (Exception e){
e.printStackTrace();
}
}
}
代码结构
映射器(mappers):使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:// 形式的URL),或类名和包名等。(在Mybatis配置文件中设置)
<!-- 使用相对于类路径的资源引用-->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL)-->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名-->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!-- 使用包内的映射器接口实现全部注册为映射器-->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
MyBatis插件:
Mybatis可以使用第三方的插件来对功能进行扩展
分页
分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
分页所需的jar包我们在开始就已导入
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
Java分页代码,分页要写在查询语句的前面
PageHelper.startPage(3,3);
List<User> list=userMapper.getUsers();
System.out.println(list);
PageInfo pageInfo=new PageInfo(list,1);
System.out.println(pageInfo);
在Mybatis配置文件中加入分页插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="reasonable" value="true"/>
</plugin>
</plugins>
Mybatis常用SQL语句:
可以使用< sql>标签来写固定的sql语句,避免同一个语句重复写多次,增加工作效率< sql id=“selectUsers”>select * from user</ sql>,在使用时通过id来获取sql < include refid=“selectUsers”></ include>
<mapper namespace="test01.UserMapper">
<sql id="selectUsers">select * from user</sql>
<select id="getUser" resultType="test01.User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="test01.User">
insert into user values(null,#{name},#{password})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="test01.User">
update user set name=#{name}, password=#{password} where id=#{id}
</update>
<select id="getUsers" resultType="test01.User">
<include refid="selectUsers"></include>
</select>
//动态SQL
<select id="getUsersById" resultType="test01.User">
select * from user
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">#{id}</foreach>
</where>
</select>
</mapper>
Mybatis类型处理器TypeHandler
可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型,具体做法为:
实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性地将它映射到一个JDBC。
开发步骤:
①定义转换类继承类BaseTypeHandler< T>
②覆盖4个未实现方法,其中setNonNullParameter为Java的程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成Java的Type类型的方法
③在Mybatis核心配置文件中进行注册
public class MyHander extends BaseTypeHandler<Date> {
//向数据库中插入
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
}
//从数据库中取
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
String st=resultSet.getString(s);
Date date=new Date(Long.parseLong(st));
return date;
}
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
return null;
}
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return null;
}
}
Mybatis逆向工程
导入需要的jar包和插件
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!-- 配置文件的位置 -->
<configurationFile>generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
编写逆向工程的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<properties resource="db.properties"></properties>
//这里要换成自己的maven依赖库的地址
<classPathEntry
location="C:/Users/user/.m2/repository/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 配置数据库连接 -->
<jdbcConnection driverClass="${db.driver}"
connectionURL="${db.url}" userId="${db.username}"
password="${db.password}">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 指定javaBean生成的位置 -->
<javaModelGenerator targetPackage="com.bean"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 指定dao接口生成的位置,mapper接口 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.dao" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- table指定每个表的生成策略 -->
<!-- <table tableName="employee" domainObjectName="Employee"></table>-->
<!-- <table tableName="dept" domainObjectName="Dept"></table>-->
<!-- <table tableName="role" domainObjectName="Role"></table>-->
<!-- <table tableName="permission" domainObjectName="Permission"></table>-->
<table tableName="module" domainObjectName="Module"></table>
<table tableName="user" domainObjectName="User"></table>
<table tableName="role" domainObjectName="Role"></table>
<table tableName="orders" domainObjectName="Orders"></table>
<!-- <table tableName="u_r" domainObjectName="UR"></table>-->
</context>
</generatorConfiguration>
编写数据库连接文件:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/数据库
db.username=root
db.password=root
db.initnum=3
db.maxnum=5
在maven工具窗口点击图示位置,开启逆向工程
测试逆向工程:
public class Demo01 {
public static void main(String[] args) throws IOException {
// String resource="mybatis.xml";
// InputStream inputStream = Resources.getResourceAsStream(resource);
// SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
String resource="mybatis.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try{
OrdersMapper ordersMapper=session.getMapper(OrdersMapper.class);
OrdersExample example=new OrdersExample();
OrdersExample.Criteria c=example.createCriteria();
c.andIdEqualTo(2);
List<Orders> list=ordersMapper.selectByExample(example);
System.out.println(list);
}catch (Exception e){
e.printStackTrace();
}
}
}