一、Mybatis是JDBC一系列操作的封装,使开发者能更加专注于sql语句的编写。
二、Mybatis的框架核心
1.mybatis的配置文件:包括mybatis全局配置文件和mybatis配置文件。
2.mybatis通过读取配置文件信息构造出sqlsessionfactory。
3.通过sqlsessionfactory来创建sqlsession。sqlsession执行sql语句。
4.sqlsession通过底层的executor来操作数据库,一个是普通执行器,一个是缓存执行器(默认)。
5.执行器将要处理的sql封装到一个MappedStatement对象中。
三、mybatis入门
1.配置SqlMapConfig
<?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"/> <!-- 配置mybatis的环境信息 --> <environments default="development"> <environment id="development"> <!-- 配置JDBC事务控制,由mybatis进行管理 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置数据源,采用dbcp连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://locahost:3306/mybatisday01?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--告诉mybatis加载映射文件--> <mappers> <package name="com.law.mapper"></package> </mappers> </configuration>
2.配置映射文件mapper.xml
<?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="user"> <!--根据id查询--> <!-- [id]:statement的id,要求在命名空间内唯一 [parameterType]:入参的java类型 [resultType]:查询出的单条结果集对应的java类型 [#{}]: 表示一个占位符? [#{id}]:表示该占位符待接收参数的名称为id。 注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义 --> <select id="findUserById" parameterType="int" resultType="com.law.model.User"> SELECT * FROM user WHERE id = #{id} </select> <!-- [${}]:表示拼接SQL字符串 [${value}]:表示要拼接的是简单类型参数。 注意: 简单类型:int,byte,... string 1、如果参数为简单类型时,${}里面的参数名称必须为value 2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname} --> </mapper>
3.将mapper配置到sqlmap中
<mapper resource="com.law.sqlmap.User.xml"></mapper>
4.通过java代码执行
public void test01() throws IOException { //1.读取配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.通过SqlSessionFactoryBuilder创建SqlSessionFactory SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //3.通过SqlSessionFactoty创建SqlSession SqlSession session = sessionFactory.openSession(); //4.调用sqlSession对象中的方法操作数据库 User user = session.selectOne("findUserById",10); System.out.println(user); //5.关闭sqlSession session.close();
5.模糊查询
<select id="findUserByName" parameterType="String" resultType="com.law.model.User"> SELECT * FROM user WHERE username LIKE '%${value}%' </select>
<!--
[${}]:表示拼接SQL字符串
[${value}]:表示要拼接的是简单类型参数。
注意:
简单类型:int,byte,... string
1、如果参数为简单类型时,${}里面的参数名称必须为value
2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
-->
List<User> users = session.selectList("findUserByName","张");
System.out.println(users);
6.增删改
增
<insert id="insertUser" parameterType="com.law.model.User"> INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address}) </insert> <--增加-->
User user = new User("law","男",new Date(),"sichuan"); session.insert("insertUser",user);
删
<delete id="deleteUser" parameterType="String"> DELETE FROM user WHERE username = #{username}; </delete>
public void test03() throws IOException{ session.delete("deleteUser","law"); }
改
<update id="updateUser" parameterType="com.law.model.User"> UPDATE user SET address = #{address},sex = #{sex} WHERE id = #{id} </update>
public void test04() throws IOException{ User user = new User(); user.setId(29); user.setAddress("四川"); user.setSex("女"); session.update("updateUser",user); }
7.插入后自动返回主键
<insert id="insertUser2" parameterType="com.law.model.User"> <selectKey keyProperty="id" resultType="int" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO user (username,sex,birthday,address) VALUE (#{username},#{sex},#{birthday},#{address}) </insert>
after:插入后
before:插入前,uuid使用
@Test public void test05() throws IOException { User user = new User("law01","男",new Date(),"四川"); session.insert("insertUser2",user); System.out.println("用户的id: "+user.getId()); }