Mybatis的环境搭建和使用
Mybatis的环境搭建和使用
Mybatis的简介
Mybatis本事apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了googlecode,
并且改名为MyBatis。2013年11月迁移到Github。
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置
参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs
(Plain Old java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis环境的配置(这里是单独配置MyBatis):
一般都需要加入日志log4j.properties(名字一定要用这个)
导入日志jar包
日志代码:
log4j.properties, log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
第一:MyBatis jar包的下载和导入
1.在github.com官网上下载:https://github.com/mybatis/mybatis-3
2.配置文件的书写
在自己的项目中创建一个source folder,存放自己的配置文档创建sqlMappersConfig.xml(就是配置文件名字自定义config.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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>
需要优化Mybatis配置将以下共有的放入以下配置中去(根据自己的数据库位置):sqlConnect.properties中
sqlDriver:com.mysql.jbdc.Driver sqlUrl:mysql:jdbc:mysql://localhost:3306/mybatis sqlUserName:root sqlUserPwd:root
目前为止config基本配置完成,以下是测试代码:请复制
final String str="com.zhiyou100.zjj.mapper.UsersMapper"; static SqlSession session=null; static Usersdao usersdao; //第一个执行 @BeforeAll static void setUpBeforeClass() throws Exception { Reader reader=Resources.getResourceAsReader("conf.xml");
//创建工厂 SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader); //打开工厂
session=sessionFactory.openSession(); } @Test void test() { Usersdao usersdao=session.getMapper(Usersdao.class); // conn.setAutoCommit(false); usersdao.getUser("五"); } //最后一个执行 @AfterAll static void tearDownAfterClass() throws Exception { session.commit();//事务提交 }
setAutoCommit(false):sql语句不自动执行
注意:一般如果两条sql语句对数值修改:一条增加一条减少如果增加语句执行了 但是到减法语句出错导致没有执行,
第一条写入数据库,第二条没有写入数据库。因为sql语句默认自动执行
session.commit():事务提交,让sql语句全部最后执行
第二:mapper的创建和使用
在实体类bean中创建:User.java
在dao包中创建接口(用于实现方法):UserMapper.java
在mapper中创建xml文件:UserMapper.xml(User.xml)
并且在config,xml中如下配置:
<!--下面是对com.spectergk.mybatis.pojo.User的包名起别名--!> <typeAliases> <typeAlias type="com.zjj.dao.UserMapper" alias="User"/> </typeAliases> <!--加载映射资源--!> <mappers> <mapper resource="User.xml"/> </mappers>
UserMapper.xml(User.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"> <!--namespace 指向的包为UserMapper接口 这是实现动态代理的条件之一 --> <mapper namespace="com.spectergk.mybatis.mappers.UserMapper"> <!-- 这里配置的返回值是User 这是因为在sqlMappersConfig.xml 已经配置了其重命名 --> <!-- 根据用的id来查询用户 返回值是User 传的值为parameterType --> <select id="selectUserById" resultType="User" parameterType="String"> select * from user where uid = #{v} </select> <!-- 根据用户的用户名进行模糊查询 --> <select id="selectUsersbyUserName" resultType="User" parameterType="String"> select * from user where realname like "%"#{v}"%"; </select> <!-- 向数据库里面插入数据 --> <insert id="insertOneUser" parameterType="User"> INSERT into user(uid,username,realname,mobile,mainpid,sex) values(#{uid},#{username},#{realname},#{mobile},#{mainpid},#{sex}); </insert> <!-- 插入数据并且返回的自动生成的uid --> <insert id="insertOneUserGetid" parameterType="User"> <selectKey keyProperty="uid" keyColumn="uid" resultType="String" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> INSERT into user(username,realname,mobile,mainpid,sex) values(#{username},#{realname},#{mobile},#{mainpid},#{sex}); </insert> <!-- 以list的形式插入 --> <insert id="insetUsers" > INSERT into user(uid,username,realname,mobile,mainpid,sex) values <foreach collection="list" item="item" separator=","> (#{item.uid},#{item.username},#{item.realname},#{item.mobile},#{item.mainpid},#{item.sex}) </foreach> </insert> <!-- 以数组的形式插入 --> <insert id="insetUsersArray" > INSERT into user(uid,username,realname,mobile,mainpid,sex) values <foreach collection="array" item="item" separator=","> (#{item.uid},#{item.username},#{item.realname},#{item.mobile},#{item.mainpid},#{item.sex}) </foreach> </insert> <!-- 更新用户 --> <update id="updateUser" parameterType="User"> UPDATE user set username = #{username} where uid = #{uid} </update> <!-- 删除用户 --> <delete id="deleteOneUser" parameterType="String"> delete from user where uid = #{v} </delete> <delete id="deleteMoreUsers"> delete from user where uid in ( <foreach collection="list" item="item" separator=","> #{item} </foreach> ) </delete> </mapper>
因为是动态加载所以在接口中Usermapper.java中写入以下代码:
public interface UserMapper { /* * 根据用户的id查询 */ public User selectUserById(String id); /* * 根据用户的姓名 模糊查询 */ public List<User> selectUsersbyUserName(String username); /* * 插入一个用户 */ public void insertOneUser(User user); /* * 插入一个用户 并且返回插入的user的id */ public void insertOneUserGetid(User user); /* * 插入多个用户 */ public void insetUsers(List<User> users); /* * 插入多个用户 这里传输array */ public void insetUsersArray(User[] users); /* * updateUser 更新 */ public void updateUser(User user); /* * 删除一个 */ public void deleteOneUser(String uid); /* * deleteMoreUsers删除多个 */ public void deleteMoreUsers(List<String> uids); }
测试已在上述演示。
注意:mapper中的namespace的值要写接口的包名+类名
select中的id必须和接口中的方法名一致,参数类型和类型也必须一致。
提一句:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
以下为dao 包中接口的工作原理

(别想着没有接口也能实现啊,这是规定,别去多想)
具体https://www.cnblogs.com/zengsiqi/p/7991731.html(某博主,参考)

浙公网安备 33010602011771号