Mybatis介绍
Mybatis是一个应用于dao层框架(持久化框架),他也是一个orm(对象、关系、映射)框架,
相当于一个半自动的
优点:
那么既然是dao层框架那就先说说jdbc的缺点吧:
重复工作比较多:每次都要创建连接(连接池) 获得执行的sql语句 然后处理结果集
最后释放资源
处理结果集,工作复杂
参数处理比较麻烦
那既然说完了jdbc的缺点:那就说说Mybatis有什么优点吧
让程序员只关注sql
参数的设置,结果集的处理 框架自动帮你生成
简单易学
灵活
Mybatis入门
1. 导入Mybatis包
2. 准备实体类
3. 数据库驱动包
4. 书写配置文件
核心配置文件
1)sqlMapConfig.xml (命名可以修改,位置任意 当然名字建议叫做sqlMapConfig 位置放在src目录下) 导入约束文件
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis1"></property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="pojo/UserMapper.xml"></mapper>
</mappers>
</configuration>
映射文件(userMapper.xml名字可以修改 位置任意 名字建议user.xml(ibatis) UserMapper.xml(Mybatis) 建议命名为 类名+Mybatis.xml)
书写sql语句
Mapper namespace属性:解决在不同表中查询的sql语句的名字冲突比如: user 表 findById orders表 findById
名字冲突 不识别,所以可以给不同的表的数据源加上一个前缀 对应的是namespace属性
<?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="test">
<select id="findUserById" parameterType="int" resultType="pojo.User" >
SELECT * FROM t_user WHERE id = #{id}
</select>
<select id="findUserByName" parameterType="String" resultType="pojo.User">
SELECT * FROM t_user WHERE username LIKE "%"#{username}"%"
</select>
<insert id="addUser" parameterType="pojo.User">
<!--
keyProperty:将查询到主键设置到parameterType指定的对象的哪个属性
order:SELECT LAST_INSERT_ID()的执行顺序,相对于insert语句来说他的执行顺序。
-->
<selectKey keyProperty="id" resultType="Integer" order="AFTER" >
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO t_user(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
<delete id="deleteUser" parameterType="Integer" >
DELETE FROM user WHERE id = #{id}
</delete>
<update id="updateUser" parameterType="pojo.User">
UPDATE t_user SET username = #{username} WHERE id = #{id}
</update>
</mapper>
Id 给当前 sql语句起一个识别id
parameterType 参数类型
resultType: 结果集封装的类型
#{id} 占位符(里面的名字任意 不能不写)
简单使用Mybatis增删改查
$字符串拼接(sql注入(不建议使用这样)) 也使用占位符1.直接将整个当成参数在代码中传递时手动拼接
#占位符
$ #区别:
#里面的变量名随意 ${变量名} 不能随便写 如果是常用类型 必须value
如果是增删改 必须要提交事务,持久化到数据库
通过id查找一个用户
<select id="findUserById" parameterType="int" resultType="pojo.User" >
SELECT * FROM t_user WHERE id = #{id}
</select>
测试代码
User user = sqlSession.selectOne("test.findUserById", 2);
通过名字模糊查找用户
<select id="findByName" parameterType="String" resultType="pojo.User">
SELECT * FROM t_user WHERE name LIKE "%"#{name}"%"
</select>
测试代码:
List<Object> list = sqlSession.selectList("test.findByName", "李");
添加一个用户
<!--如果参数是引用类型 占位符的赋值方式为ongl表达式的方式{属性名}-->
<insert id="addUser" parameterType="pojo.User">
INSERT INTO t_user(name,sex,address,balance) VALUE (#{name},#{sex},#{address},#{balance})
</insert>
int insert = sqlSession.insert("test.addUser", user);
这种操作并不会把新生成的记录中的主键保存到对象中,但是有一种需求,在保存用户的同时,要利用用户主键去保存一个新的记录。为了满足需求 提供了新的标签
KeyProperty:对应的是对象的属性名keyCloeumn对应的是数据库中的字段名
ResultType:对应的是返回结果的类型(int String)分别对应数据库生成代理主键的策略 int 对应 自动递增 String uuid
Order:顺序 跟数据底层有关,自动递增默认先添加数据在生成主键。但是uuid就是生成Id 在去添加数据
<insert id="addUser" parameterType="pojo.User">
<selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO t_user(name,sex,address,balance) VALUE (#{name},#{sex},#{address},#{balance})
</insert>
查询语法:SELECT LAST_INSERT_ID() 适用于自动递增
SELECT uuid()适用于uuid
通过id删除一个用户
通过id修改一个用户
原始dao层开发
Dao层mapper开发
不用去写实现类,他会代理方式自动生成实现代码。想要使用mapper开发必须遵循以下原则:
1. 接口名字建议和mapper映射文件名字保持一致并且在同一目录下 namespace必须和接口的完整路径名保持一致
2. 接口中的方法名必须和mapper中的id保持一致
3. 方法返回值要和配置中的resultType保持一致
4. 参数的类型必须保持一致
在代码中就不需要关注sqlsession对象的方法调用了insert update delete selectOne selectList
返回一个接口的代理对象,直接调用该方法的方法即可
注意:
使用mapper开发,它的参数永远只有一个(解决问题的方法,将多余的参数封装成pojo类)
Mybatis自动识别接口中的方法的返回值,从而调用session.selectOne和selectList方法
SqlMapConfig配置详解
• properties 设置配置信息
• settings 1 全局设置 mybatis 二级缓存 设置mybatis的加载属性
• typeAliases 别名
<!--单个别名-->
<typeAlias type="pojo.User" alias="user"></typeAlias>
<!--多个别名 别名不区分大小写 -->
<package name="pojo"></package>
决定着mapper.xml文件中数据类型可以直接使用简短的名字
• typeHandlers
类型控制器,将数据库中的数据类型和java中的数据类型进行匹配。一般情况下不用书写
• objectFactory 1
• plugins 1
• environments
• environment
• transactionManager
• dataSource
• databaseIdProvider
• mappers
映射文件书写方式:
1。
<mapper resource="sqlMapCnfig/UserMapper.xml"></mapper>
2. 通过接口读取配置:
接口的名字必须和配置文件保持一致
3. Url 通过绝对路径来读取
4. 扫描包
读取的时候接口的包名,因此要求所有的接口和对应的配置文件都要保持一致(名字和位置)
总结:4种 你的接口和配置文件同名且在同一包下
各位大姐姐大哥哥 看看有什么错误没 有
的话提出来一下。需要案例的可以发给你
们