一、什么是mybatis
mybatis是一个持久层的框架。持久层就是操作硬盘中的数据mybatis是操作数据库中的数据(实际上数据库中的的数据也是硬盘中的数据)
操作数据技术有原生的JDBC、HIbernate和Mybatis
二、回顾原生JDBC
public static void main(String[] args) throws ClassNotFoundException, SQLException { Connection connection=null; PreparedStatement statement=null; ResultSet resultSet=null; //1.加载驱动 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2.连接数据库 connection=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=ImageServiceDB;", "sa", "AAA@111"); //3.编写sql String sql="SELECT * FROM [ImageServiceDB].[dbo].[ImageServerInfo] where [ServerId]=?"; statement=connection.prepareStatement(sql); //4.设置参数 statement.setInt(1, 2); //54.执行 resultSet =statement.executeQuery(); while(resultSet.next()) { System.out.println(resultSet.getInt("ServerId")); System.out.println(resultSet.getString("ServerName")); } //6.释放资源 resultSet.close(); statement.close(); connection.close(); }View Code
可以发现以下问题
1、数据库频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
=>使用数据库连接池管理数据库连接。
2、sql语句硬编码到java代码中,不利于系统维护。
=>sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3、preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
=>将sql语句及占位符号和参数全部配置在xml中。
4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护
=> 将查询的结果集,自动映射成java对象。
Mybatis就可以完美的解决以上的问题
三、Mybatis入门
1、引入jar
从https://github.com/mybatis/mybatis-3/releases下载
2、核心配置文件(SqlMapConfig.xml)
<?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"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=ImageServiceDB;" /> <property name="username" value="sa" /> <property name="password" value="AAA@111" /> </dataSource> </environment> </environments> </configuration>View Code
3、需求根据用户Id查询
3.1、创建实体类
public class User { private Integer id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址View Code
3.2、映射文件
<?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 --> <mapper namespace="test"> <!-- id:标识映射文件中的sql,其根本将sql语句封装到mappedStatement对象中,select标签块相当于一个statement parameterType:指定输入参数的类型 resultType:指定sql输出结果的类型,select指定resultType表示将单条记录映射成对象 --> <select id="findUserById" parameterType="int" resultType="com.xxx.mybatis.po.User"> select * from t_user where id = #{id} </select> </mapper>
#{名称}:表示一个占位符,名称:在输入参数类型为简单类型,可以是任意
${value}:sql拼接符(不建议使用)
3.3、在核心配置文件中加载映射文件
<mappers> <mapper resource="User.xml"/> </mappers>View Code
3.4、程序编写
@Test public void findUserByIdTest() throws IOException { // mybatis核心配置文件 String resource = "SqlMapConfig.xml"; // 核心配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 根据核心配置文件,创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过SqlSessionFactory对象打开SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); // 通过SqlSession对象操作数据库 // 第一个参数:映射文件中statement的id,如果调用映射文件的类命名空间不同,需namespace+"."+statement的id // 第二个参数:指定和映射文件中输入类型匹配的参数 User user = session.selectOne("test.findUserById", 1); System.out.println(user); session.close(); }View Code
4、根据用户名模糊查询
4.1、映射文件
<select id="findUserByName" parameterType="String" resultType="com.xxx.mybatis.po.User"> <!-- 防止sql注入 --> <!-- select * from t_user where name like '%${value}%' --> select * from t_user where userName LIKE CONCAT('%',#{value},'%' ) </select>
4.2、程序编写
@Test public void findUserByNameTest() throws IOException { // mybatis核心配置文件 String resource = "SqlMapConfig.xml"; // 核心配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 根据核心配置文件,创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过SqlSessionFactory对象打开SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); // 通过SqlSession对象操作数据库 // 第一个参数:映射文件中statement的id,如果调用映射文件的类命名空间不同,需namespace+"."+statement的id // 第二个参数:指定和映射文件中输入类型匹配的参数 List<User> user = session.selectList("test.findUserByName", "小明"); System.out.println(user); session.close(); }View Code
5、添加用户
5.1、映射文件
<insert id="insertUser" parameterType="com.xxx.mybatis.po.User"> insert into t_user VALUES (#{username},#{birthday},#{sex},#{address}); </insert>
5.2、程序编写
@Test public void insertUserTest() throws IOException { // mybatis核心配置文件 String resource = "SqlMapConfig.xml"; // 核心配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 根据核心配置文件,创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过SqlSessionFactory对象打开SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("小睡姿"); user.setBirthday(new Date()); user.setSex("0"); user.setAddress("秦国"); session.insert("test.insertUser", user); session.commit(); session.close(); }View Code
5.3、自增主键返回
将插入数据的自增主键设置到对象的属性中(keyProperty="id")
<insert id="insertUser" parameterType="com.xxx.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="int"> <!-- MySql:select LAST_INSERT_ID() as value MSSQL:select @@IDENTITY as value --> select @@IDENTITY as value </selectKey> insert into t_user VALUES (#{username},#{birthday},#{sex},#{address}); </insert>
5.4、获取方式(通过对象的get属性方法获取)
@Test public void insertUserTest() throws IOException { // mybatis核心配置文件 String resource = "SqlMapConfig.xml"; // 核心配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 根据核心配置文件,创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过SqlSessionFactory对象打开SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); User user = new User(); user.setUsername("小睡姿"); user.setBirthday(new Date()); user.setSex("0"); user.setAddress("秦国"); int result=session.insert("test.insertUser", user); System.out.println(result); session.commit(); System.out.println(user.getId()); session.close(); }
5.5、非自增主键返回(1、先查询生成主键,并将其设置到对象的主键属性中,2、在插入执行时从对象中取出主键属性值)
<insert id="insertUser" parameterType="com.xxx.mybatis.po.User"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String"> <!-- Oracl:SELECT 序列名.NEXTVAL FROM DUAL MySql:select uuid() MSSQL:select newid() --> select select newid() </selectKey> insert into t_user VALUES (#{id},#{username},#{birthday},#{sex},#{address}); </insert>
6、删除用户
6.1、映射文件
<delete id="deleteUser" parameterType="java.lang.Integer"> delete from t_user where id=#{id} </delete>
6.2、程序编写
@Test public void deleteUserTest() throws IOException { // mybatis核心配置文件 String resource = "SqlMapConfig.xml"; // 核心配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 根据核心配置文件,创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过SqlSessionFactory对象打开SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); session.insert("test.deleteUser", 1); session.commit(); session.close(); }View Code
7、更新用户
7.1、映射文件
根据id更新用户需要用户id和用户更新信息,输入参数类型parameterType指定user对象,对象包括用户id(必须存在)和更新信息
<update id="deleteUser" parameterType="com.xxx.mybatis.po.User"> update t_user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update>
7.2、编写程序
@Test public void updateUserTest() throws IOException { // mybatis核心配置文件 String resource = "SqlMapConfig.xml"; // 核心配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 根据核心配置文件,创建SqlSessionFactory对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过SqlSessionFactory对象打开SqlSession对象 SqlSession session = sqlSessionFactory.openSession(); //用户信息 User user = new User(); user.setId(2); user.setUsername("王晓"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("中国"); session.insert("test.updateUser", user); session.commit(); session.close(); }View Code
四、Mybatis应用步骤
1、配置Mybatis核心配置文件
2、创建实体类,映射文件输入输出参数类型会用到
3、配置映射文件(Sql语句、Sql输入参数类型、输出参数类型等)
4、编写Java程序
4.1、通过读取Mybatis核心配置文件获取SqlSessionFactory对象
4.2、通过SqlSessionFactory对象获取SqlSession对象
4.3、SqlSession对象通过配置映射文件中statement的id操作数据库